From 054ebb7fe86fa411e947984b07d9803415d7db1c Mon Sep 17 00:00:00 2001 From: minhn4 Date: Sat, 11 Jul 2026 09:41:21 +0700 Subject: [PATCH 1/4] feat: rename OPENCODE_ env vars to CODEV_ MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Hard cutover of every OPENCODE_* environment variable to CODEV_*, with no legacy fallback — matching the fork's config-file and config-dir rename precedent. Covers both flag registries (core Flag, opencode RuntimeFlags), every process.env read/set site, the VSCode extension boundary (CODEV_CALLER, _EXTENSION_CODEV_PORT), the bundler define identifiers (CODEV_VERSION, CODEV_CHANNEL, CODEV_MODELS_DEV, CODEV_LIBC, CODEV_CLI_NAME, CODEV_WORKER_PATH), VITE_CODEV_* names, the bare OPENCODE=1 marker (now CODEV=1), CI workflow env, nix build env, turbo.json, test preloads/fixtures, and docs (en + es). Not renamed: the __OPENCODE_PHOTON_WASM_PATH / __OPENCODE__ globals (not env vars; the photon name is baked into the dependency patch), script-local vars in patches/install-korean-ime-fix.sh, and upstream secret names in historical DIVERGENCES.md notes. This reverses the earlier "env vars stay upstream" divergence policy; DIVERGENCES.md gains an env-var rename row with sync guidance and the stale stay-upstream mentions are corrected. CLI help and TUI wrap snapshots regenerated (shorter names change line wrapping). Co-Authored-By: Claude Fable 5 --- .github/workflows/test.yml | 2 +- CONTEXT.md | 4 +- DIVERGENCES.md | 20 +-- SECURITY.md | 2 +- infra/enterprise.ts | 10 +- nix/opencode.nix | 8 +- packages/app/e2e/performance/README.md | 8 +- packages/app/e2e/performance/benchmark.ts | 6 +- packages/app/e2e/performance/chrome-trace.ts | 6 +- .../app/e2e/performance/playwright.config.ts | 2 +- .../performance/timeline-stability/README.md | 2 +- .../app/e2e/utils/visual-stability/capture.ts | 2 +- packages/app/playwright.config.ts | 6 +- packages/app/src/components/help-button.tsx | 2 +- .../src/components/settings-v2/general.tsx | 2 +- packages/app/src/components/titlebar.tsx | 4 +- packages/app/src/context/settings.tsx | 2 +- packages/app/src/entry.tsx | 4 +- packages/app/src/env.d.ts | 6 +- packages/app/src/pages/layout/helpers.ts | 4 +- packages/app/src/pages/new-session.tsx | 2 +- packages/app/vite.js | 6 +- packages/cli/bin/lildax.cjs | 2 +- packages/cli/script/build.ts | 10 +- packages/cli/script/generate.ts | 2 +- packages/cli/src/commands/commands.ts | 4 +- packages/codev-gateway/src/auth-file.ts | 4 +- packages/codev-gateway/test/auth-file.test.ts | 10 +- packages/core/src/database/database.ts | 10 +- packages/core/src/filesystem/search.ts | 2 +- packages/core/src/filesystem/watcher.ts | 8 +- packages/core/src/flag/flag.ts | 88 ++++++------- packages/core/src/global.ts | 4 +- packages/core/src/installation/version.ts | 8 +- packages/core/src/instruction-context.ts | 2 +- packages/core/src/models-dev.ts | 16 +-- packages/core/src/observability/logging.ts | 4 +- packages/core/src/observability/otlp.ts | 2 +- packages/core/src/plugin/provider/opencode.ts | 2 +- .../src/plugin/skill/customize-opencode.md | 16 +-- packages/core/src/pty.ts | 2 +- packages/core/src/repository.ts | 2 +- packages/core/src/shell.ts | 2 +- packages/core/src/tool/websearch.ts | 8 +- .../test/effect/cross-spawn-spawner.test.ts | 6 +- .../core/test/effect/observability.test.ts | 8 +- packages/core/test/filesystem/watcher.test.ts | 4 +- .../core/test/instruction-context.test.ts | 8 +- packages/core/test/models.test.ts | 18 +-- packages/core/test/plugin/models-dev.test.ts | 12 +- .../test/plugin/provider-opencode.test.ts | 18 +-- packages/core/test/preload.ts | 6 +- packages/core/test/pty/pty-session.test.ts | 2 +- .../desktop/electron-builder.config.test.ts | 16 +-- packages/desktop/electron-builder.config.ts | 2 +- packages/desktop/electron.vite.config.ts | 14 +-- .../desktop/scripts/finalize-latest-json.ts | 8 +- .../desktop/scripts/finalize-latest-yml.ts | 4 +- packages/desktop/scripts/predev.ts | 2 +- packages/desktop/scripts/utils.ts | 2 +- packages/desktop/src/main/constants.ts | 2 +- packages/desktop/src/main/env.d.ts | 2 +- packages/desktop/src/main/index.ts | 8 +- packages/desktop/src/main/server.ts | 8 +- packages/desktop/src/main/shell-env.test.ts | 4 +- packages/desktop/src/main/sidecar.ts | 4 +- packages/desktop/src/main/wsl/sidecar.ts | 8 +- packages/desktop/src/renderer/index.tsx | 2 +- packages/enterprise/package.json | 2 +- packages/enterprise/src/core/storage.ts | 18 +-- packages/enterprise/vite.config.ts | 4 +- packages/opencode/bin/opencode | 2 +- packages/opencode/script/build-node.ts | 4 +- packages/opencode/script/build.ts | 12 +- packages/opencode/script/generate.ts | 2 +- packages/opencode/script/release.ts | 2 +- packages/opencode/specs/effect/todo.md | 2 +- packages/opencode/specs/tui-plugins.md | 4 +- packages/opencode/src/acp/profile.ts | 2 +- packages/opencode/src/auth/index.ts | 4 +- packages/opencode/src/cli/cmd/acp.ts | 2 +- packages/opencode/src/cli/cmd/attach.ts | 4 +- packages/opencode/src/cli/cmd/debug/index.ts | 2 +- packages/opencode/src/cli/cmd/run.ts | 4 +- .../src/cli/cmd/run/footer.prompt.tsx | 16 +-- .../opencode/src/cli/cmd/run/footer.view.tsx | 10 +- packages/opencode/src/cli/cmd/run/runtime.ts | 2 +- packages/opencode/src/cli/cmd/run/trace.ts | 4 +- packages/opencode/src/cli/cmd/serve.ts | 4 +- packages/opencode/src/cli/cmd/session.ts | 4 +- packages/opencode/src/cli/cmd/tui.ts | 4 +- packages/opencode/src/cli/cmd/web.ts | 4 +- packages/opencode/src/cli/heap.ts | 2 +- packages/opencode/src/cli/upgrade.ts | 4 +- packages/opencode/src/config/config.ts | 40 +++--- packages/opencode/src/config/managed.ts | 2 +- packages/opencode/src/config/paths.ts | 4 +- packages/opencode/src/config/tui-migrate.ts | 2 +- packages/opencode/src/config/tui.ts | 16 +-- .../opencode/src/control-plane/workspace.ts | 6 +- .../opencode/src/effect/config-service.ts | 4 +- packages/opencode/src/effect/runtime-flags.ts | 64 +++++----- packages/opencode/src/ide/index.ts | 2 +- packages/opencode/src/index.ts | 10 +- packages/opencode/src/plugin/meta.ts | 2 +- packages/opencode/src/plugin/openai/README.md | 2 +- packages/opencode/src/plugin/tui/runtime.ts | 4 +- packages/opencode/src/project/project.ts | 2 +- packages/opencode/src/server/auth.ts | 8 +- .../instance/httpapi/middleware/fence.ts | 2 +- .../httpapi/middleware/workspace-routing.ts | 2 +- packages/opencode/src/session/instruction.ts | 4 +- packages/opencode/src/session/llm/AGENTS.md | 2 +- packages/opencode/src/share/share-next.ts | 2 +- packages/opencode/src/skill/index.ts | 18 +-- packages/opencode/src/temporary.ts | 4 +- packages/opencode/src/tool/task.ts | 2 +- packages/opencode/src/tool/websearch.ts | 2 +- packages/opencode/src/util/repository.ts | 2 +- packages/opencode/test/agent/agent.test.ts | 6 +- .../test/cli/acp/config-options.test.ts | 8 +- .../test/cli/acp/initialize-auth.test.ts | 2 +- .../opencode/test/cli/acp/lifecycle.test.ts | 8 +- .../test/cli/acp/prompt-content.test.ts | 2 +- packages/opencode/test/cli/acp/skills.test.ts | 2 +- .../__snapshots__/help-snapshots.test.ts.snap | 10 +- .../opencode/test/cli/run/run-process.test.ts | 2 +- .../test/cli/smokes/read-only.test.ts | 6 +- .../test/cli/tui/editor-context-zed.test.ts | 8 +- .../test/cli/tui/editor-context.test.tsx | 18 +-- .../opencode/test/cli/tui/plugin-add.test.ts | 8 +- .../test/cli/tui/plugin-install.test.ts | 4 +- .../cli/tui/plugin-loader-entrypoint.test.ts | 32 ++--- .../test/cli/tui/plugin-loader-pure.test.ts | 16 +-- .../test/cli/tui/plugin-loader.test.ts | 18 +-- .../test/cli/tui/plugin-toggle.test.ts | 8 +- packages/opencode/test/config/config.test.ts | 66 +++++----- packages/opencode/test/config/tui.test.ts | 16 +-- .../test/control-plane/workspace.test.ts | 14 +-- .../test/effect/runtime-flags.test.ts | 118 +++++++++--------- packages/opencode/test/fixture/flag.ts | 8 +- .../test/fixture/plugin-meta-worker.ts | 2 +- packages/opencode/test/fixture/tui-runtime.ts | 4 +- packages/opencode/test/ide/ide.test.ts | 12 +- packages/opencode/test/lib/cli-process.ts | 28 ++--- packages/opencode/test/plugin/meta.test.ts | 14 +-- packages/opencode/test/preload.ts | 20 +-- .../test/provider/digitalocean.test.ts | 2 +- .../test/provider/header-timeout.test.ts | 8 +- .../opencode/test/provider/provider.test.ts | 2 +- packages/opencode/test/server/auth.test.ts | 24 ++-- .../opencode/test/server/httpapi-cors.test.ts | 8 +- .../test/server/httpapi-exercise/backend.ts | 2 +- .../server/httpapi-exercise/environment.ts | 20 +-- .../test/server/httpapi-exercise/index.ts | 2 +- .../test/server/httpapi-exercise/runner.ts | 4 +- .../httpapi-instance-route-auth.test.ts | 4 +- .../test/server/httpapi-instance.test.ts | 18 +-- .../test/server/httpapi-listen.test.ts | 44 +++---- .../opencode/test/server/httpapi-mdns.test.ts | 20 +-- .../test/server/httpapi-provider.test.ts | 2 +- .../server/httpapi-query-schema-drift.test.ts | 4 +- .../opencode/test/server/httpapi-sdk.test.ts | 12 +- .../test/server/httpapi-session.test.ts | 6 +- .../opencode/test/server/httpapi-sync.test.ts | 6 +- .../opencode/test/server/httpapi-ui.test.ts | 20 +-- .../test/server/httpapi-workspace.test.ts | 18 +-- .../test/server/session-messages.test.ts | 8 +- .../server/worktree-endpoint-repro.test.ts | 6 +- .../test/session/llm-native-recorded.test.ts | 24 ++-- packages/opencode/test/skill/skill.test.ts | 6 +- .../test/tool/fixtures/models-api.json | 4 +- packages/opencode/test/tool/glob.test.ts | 8 +- packages/opencode/test/tool/grep.test.ts | 8 +- packages/opencode/test/tool/read.test.ts | 8 +- packages/opencode/test/tool/shell.test.ts | 2 +- packages/opencode/test/tool/skill.test.ts | 12 +- packages/opencode/test/tool/websearch.test.ts | 10 +- packages/opencode/test/util/process.test.ts | 10 +- packages/script/src/index.ts | 20 +-- packages/sdk-next/test/embedded.test.ts | 24 ++-- packages/sdk/js/src/server.ts | 4 +- packages/sdk/js/src/v2/server.ts | 4 +- packages/server/src/auth.ts | 8 +- packages/tui/src/app.tsx | 24 ++-- packages/tui/src/component/prompt/index.tsx | 6 +- packages/tui/src/context/editor.ts | 2 +- packages/tui/src/context/sdk.tsx | 4 +- packages/tui/src/editor-zed.ts | 2 +- packages/tui/src/keymap.tsx | 14 +-- packages/tui/src/routes/session/index.tsx | 6 +- .../tui/src/routes/session/permission.tsx | 6 +- packages/tui/src/ui/dialog.tsx | 4 +- .../inline-tool-wrap-snapshot.test.tsx.snap | 16 +-- .../tui/inline-tool-wrap-snapshot.test.tsx | 2 +- packages/tui/test/keymap.test.tsx | 4 +- packages/ui/vite.config.ts | 2 +- packages/web/src/content/docs/acp.mdx | 4 +- packages/web/src/content/docs/cli.mdx | 98 +++++++-------- packages/web/src/content/docs/config.mdx | 16 +-- packages/web/src/content/docs/es/acp.mdx | 4 +- packages/web/src/content/docs/es/cli.mdx | 94 +++++++------- packages/web/src/content/docs/es/config.mdx | 14 +-- packages/web/src/content/docs/es/gitlab.mdx | 2 +- packages/web/src/content/docs/es/lsp.mdx | 2 +- packages/web/src/content/docs/es/rules.mdx | 6 +- packages/web/src/content/docs/es/server.mdx | 4 +- packages/web/src/content/docs/es/tools.mdx | 6 +- .../src/content/docs/es/troubleshooting.mdx | 4 +- packages/web/src/content/docs/es/tui.mdx | 2 +- packages/web/src/content/docs/es/web.mdx | 8 +- .../web/src/content/docs/es/windows-wsl.mdx | 4 +- packages/web/src/content/docs/gitlab.mdx | 2 +- packages/web/src/content/docs/lsp.mdx | 2 +- packages/web/src/content/docs/rules.mdx | 6 +- packages/web/src/content/docs/server.mdx | 4 +- packages/web/src/content/docs/tools.mdx | 6 +- .../web/src/content/docs/troubleshooting.mdx | 4 +- packages/web/src/content/docs/tui.mdx | 2 +- packages/web/src/content/docs/web.mdx | 8 +- packages/web/src/content/docs/windows-wsl.mdx | 4 +- perf/test-suite.md | 4 +- script/translate-app.ts | 16 +-- sdks/vscode/src/extension.ts | 6 +- specs/v2/schema-changelog.md | 2 +- specs/v2/session.md | 2 +- turbo.json | 4 +- 227 files changed, 1051 insertions(+), 1051 deletions(-) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 77523504f6..931aa3eb74 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -80,7 +80,7 @@ jobs: timeout-minutes: 45 run: GITHUB_ACTIONS=false bun turbo test env: - OPENCODE_EXPERIMENTAL_DISABLE_FILEWATCHER: ${{ runner.os == 'Windows' && 'true' || 'false' }} + CODEV_EXPERIMENTAL_DISABLE_FILEWATCHER: ${{ runner.os == 'Windows' && 'true' || 'false' }} - name: Check generated client if: runner.os == 'Linux' diff --git a/CONTEXT.md b/CONTEXT.md index 7722778418..9a887021ec 100644 --- a/CONTEXT.md +++ b/CONTEXT.md @@ -135,7 +135,7 @@ _Avoid_: Response envelope - **Native Continuation Metadata** remains in durable history. Provider-turn projection includes it only for a successful exact originating provider/model match; failed turns and incompatible models omit opaque metadata, while non-empty visible reasoning lowers to ordinary assistant text after a model switch. This conservative relation may widen only when recorded provider tests establish compatibility. - **Model Request Options** remain provider-semantic through Catalog resolution. The Session runner maps them into the LLM package's provider-option namespace; the selected protocol adapter alone owns provider wire encoding. - **Generation Controls**, protocol-semantic **Model Request Options**, and compatibility request body fields are separate Catalog domains. A shared ingestion adapter partitions legacy and models.dev AI-SDK-shaped options before routing. -- The **PTY Environment** is a server concern rather than a Core PTY concern. PTY creation merges caller values, then the host overlay, then Core-forced terminal invariants such as `TERM` and `OPENCODE_TERMINAL`. +- The **PTY Environment** is a server concern rather than a Core PTY concern. PTY creation merges caller values, then the host overlay, then Core-forced terminal invariants such as `TERM` and `CODEV_TERMINAL`. - Networked and **Embedded CoDev Code** use the same **CoDev Code Client** and preserve the full HTTP encoding, routing, middleware, and decoding boundary; only the `HttpClient` transport differs. - The Effect-native network constructor obtains `HttpClient.HttpClient` from its environment so callers own transport selection, recording, tracing, retries, and tests. Convenience runtimes may provide a fetch transport separately. - Creating **Embedded CoDev Code** is scoped. Closing its owning Scope releases the in-process server resources, database resources, registrations, and fibers. @@ -185,7 +185,7 @@ _Avoid_: Response envelope - A **PTY Environment** adapter observes plugins in the request Location while passing the resolved PTY working directory to the hook; standalone servers use an empty adapter. - A **Mid-Conversation System Message** lowers to the provider's native chronological instruction role when supported and to a wrapped chronological fallback otherwise. - When the effective aggregate instruction set changes, its **Mid-Conversation System Message** includes the complete current ordered set and supersedes the prior aggregate value; when no ambient instructions remain, the message states that previously loaded instructions no longer apply. -- Ambient project instruction discovery honors `OPENCODE_DISABLE_PROJECT_CONFIG`; global instructions remain eligible. +- Ambient project instruction discovery honors `CODEV_DISABLE_PROJECT_CONFIG`; global instructions remain eligible. - Oversized textual **Model Tool Output** retains a bounded preview in Session history while its complete text moves to managed tool-output storage. Arbitrary structured-result size is a separate concern. - One tool settlement receives one aggregate textual limit, using the configured maximum lines or UTF-8 bytes, whichever is reached first. The limit is provider-independent; token pressure belongs to context assembly and compaction. - Generic truncation preserves the beginning and end of textual output. Tools may apply a more meaningful strategy before the Tool Registry enforces the final limit. diff --git a/DIVERGENCES.md b/DIVERGENCES.md index 9a4ca1f2ba..7e357019a4 100644 --- a/DIVERGENCES.md +++ b/DIVERGENCES.md @@ -39,7 +39,7 @@ upstream maintainers — see README → Syncing with upstream for why and how. | `packages/tui/src/routes/session/permission.tsx`, `packages/opencode/src/cli/cmd/run/permission.shared.ts`, `packages/opencode/test/cli/run/permission.shared.test.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" (incl. the permission always-allow copy and its test expectations) | 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. | -| Config-file rename: `packages/opencode/src/config/{config,managed,tui-migrate}.ts`, `packages/core/src/config.ts`, `packages/opencode/src/plugin/install.ts`, `packages/opencode/src/cli/cmd/{mcp,plug,providers,error}.ts`, user-facing strings (`packages/{tui,app}` dialogs/tips/i18n, skill descriptions in `packages/core/src/plugin/skill.ts` + `packages/opencode/src/skill/index.ts`), bundled prompts (`customize-opencode.md`, `initialize.txt`), tests seeding config fixtures, docs (`packages/web/src/content/docs` en + es) | Config file `opencode.json(c)` → `codev.json(c)` everywhere (global, project walk-up, config dirs, managed); global `config.json` support and the legacy TOML `config` migration removed; managed config dir `/Library/Application Support/opencode`→`…/codev`, `/etc/opencode`→`/etc/codev`, `%ProgramData%\opencode`→`…\codev` | The fork's config surface uses the fork's name; hard rename, no legacy fallback. NOT renamed: the `$schema` URL `https://opencode.ai/config.json`, `OPENCODE_*` env vars, `@opencode-ai/*` packages, theme asset files named `opencode.json`, brew/scoop manifest URLs. | Keep our file names; take upstream's surrounding logic. Rename any new upstream `opencode.json`/global-`config.json` reference to `codev.json` (watch the not-renamed list). | +| Config-file rename: `packages/opencode/src/config/{config,managed,tui-migrate}.ts`, `packages/core/src/config.ts`, `packages/opencode/src/plugin/install.ts`, `packages/opencode/src/cli/cmd/{mcp,plug,providers,error}.ts`, user-facing strings (`packages/{tui,app}` dialogs/tips/i18n, skill descriptions in `packages/core/src/plugin/skill.ts` + `packages/opencode/src/skill/index.ts`), bundled prompts (`customize-opencode.md`, `initialize.txt`), tests seeding config fixtures, docs (`packages/web/src/content/docs` en + es) | Config file `opencode.json(c)` → `codev.json(c)` everywhere (global, project walk-up, config dirs, managed); global `config.json` support and the legacy TOML `config` migration removed; managed config dir `/Library/Application Support/opencode`→`…/codev`, `/etc/opencode`→`/etc/codev`, `%ProgramData%\opencode`→`…\codev` | The fork's config surface uses the fork's name; hard rename, no legacy fallback. NOT renamed: the `$schema` URL `https://opencode.ai/config.json`, `@opencode-ai/*` packages, theme asset files named `opencode.json`, brew/scoop manifest URLs. | Keep our file names; take upstream's surrounding logic. Rename any new upstream `opencode.json`/global-`config.json` reference to `codev.json` (watch the not-renamed list). | | `.opencode/` (repo root, whole directory) | Renamed to `.codev/`; inner `opencode.jsonc` → `codev.jsonc`; internal `.opencode/` path mentions in `glossary/README.md`, `skills/effect/SKILL.md`, `command/translate.md` updated; the `opencode-local` reference → `codev-local` pointing at `~/.local/share/codev` | This is the repo's own dogfooding config dir; after the config-dir rename row below, the agent only discovers `.codev/`. | Keep our directory; re-apply upstream's `.opencode/**` changes into `.codev/` (sync surfaces them as modify/delete or add conflicts). | | Config-dir rename: `packages/opencode/src/config/{paths,config,tui}.ts`, `packages/core/src/config.ts`, `packages/opencode/src/plugin/install.ts`, `packages/opencode/src/plugin/tui/runtime.ts`, `packages/tui/src/context/theme.tsx`, `packages/opencode/src/cli/cmd/{agent,mcp}.ts`, `packages/opencode/src/session/session.ts`, plan permission patterns (`packages/opencode/src/agent/agent.ts`, `packages/core/src/plugin/agent.ts`), TUI tips, skill descriptions, `customize-opencode.md`, `specs/tui-plugins.md`, tests creating `.opencode` fixtures, docs (en + es) | Config directory `.opencode` → `.codev` (project walk-up, `~/.codev`, plans dir, theme/plugin discovery) | The fork's config surface uses the fork's name; hard rename, no legacy fallback. NOT renamed: `~/.opencode/bin` install paths (binary location — see installation/uninstall rows), the `ai.opencode.managed` plist domain, identifiers like provider id `opencode` and theme asset keys. | Keep our dir name; take upstream's surrounding logic. Rename any new upstream `.opencode` dir reference to `.codev` (leave `~/.opencode/bin`). | | `packages/tui/src/component/dialog-provider.tsx`, `packages/tui/src/component/dialog-model.tsx`, `packages/opencode/src/cli/cmd/providers.ts` | Filter `opencode`/`opencode-go` out of provider pickers and the `/model` dialog (model list + Favorites/Recent; the model dialog's opencode-first sort became a plain name sort) | Upstream's hosted offerings (Zen/Go) are detours for gateway users. | Keep our filters. | @@ -51,10 +51,10 @@ upstream maintainers — see README → Syncing with upstream for why and how. | `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). | | `AGENTS.md` | Default-branch note: `dev` → `main` (single merged line; upstream has two lines saying local `main` may not exist) | The fork's default branch is `main` (see the workflow-triggers row); agents kept basing diffs on a nonexistent `dev`. | Keep our line; take upstream's other guidance. | | `README.md` | Replaced with fork README | Fork identity, sync + divergence policy. | Keep ours entirely. | -| `CONTRIBUTING.md`, `SECURITY.md` | Product-brand prose "OpenCode" → "CoDev Code"; built-CLI command examples `opencode …` → `codev …` | Docs people actually read should name the fork's product. Upstream issue/advisory links, `packages/opencode` paths, env vars, and build-output paths stay upstream. | Keep our strings; take upstream's structural changes. | -| `CONTEXT.md` | Product-brand prose "OpenCode" → "CoDev Code" (title, intro, and defined terms such as "CoDev Code Client" / "Embedded CoDev Code") | The V2 design glossary should name the fork's product; the renamed terms appear only in this file, so nothing desyncs. `OPENCODE_*` env vars and `@opencode-ai/*` package names stay upstream. | Keep our brand strings; take upstream's design changes (this file evolves with the V2 session core — merge content, re-apply the brand rename). | +| `CONTRIBUTING.md`, `SECURITY.md` | Product-brand prose "OpenCode" → "CoDev Code"; built-CLI command examples `opencode …` → `codev …` | Docs people actually read should name the fork's product. Upstream issue/advisory links, `packages/opencode` paths, and build-output paths stay upstream; env-var mentions follow the env-var rename row. | Keep our strings; take upstream's structural changes. | +| `CONTEXT.md` | Product-brand prose "OpenCode" → "CoDev Code" (title, intro, and defined terms such as "CoDev Code Client" / "Embedded CoDev Code") | The V2 design glossary should name the fork's product; the renamed terms appear only in this file, so nothing desyncs. `@opencode-ai/*` package names stay upstream; env-var mentions follow the env-var rename row. | Keep our brand strings; take upstream's design changes (this file evolves with the V2 session core — merge content, re-apply the brand rename). | | `STATS.md` | Deleted | Upstream's download-stats log; meaningless for the fork. | Keep deleted. | -| Test prose across `packages/*/test`, `packages/opencode/test/lib` | describe titles + comments naming the CLI command or product: `opencode `/"opencode CLI"/"OpenCode" → `codev …`/"CoDev Code" (incl. help-snapshot keys/labels — regenerate the `.snap`, see the scriptName row). Functional names stay: `OPENCODE_*` env vars, `@opencode-ai/*`, `~/.opencode/bin` install paths, provider id `opencode`, fixture APIs (`opencode.run`, `OpencodeCli`), auth method `opencode-login`, default username `opencode`, upstream issue refs, third-party names. Config-file and config-dir fixtures follow the rename rows (`codev.json`, `.codev/`). | Test names/comments are read by people; identifiers are load-bearing. | Keep our prose; take upstream's test-logic changes. | +| Test prose across `packages/*/test`, `packages/opencode/test/lib` | describe titles + comments naming the CLI command or product: `opencode `/"opencode CLI"/"OpenCode" → `codev …`/"CoDev Code" (incl. help-snapshot keys/labels — regenerate the `.snap`, see the scriptName row). Functional names stay: `@opencode-ai/*`, `~/.opencode/bin` install paths, provider id `opencode`, fixture APIs (`opencode.run`, `OpencodeCli`), auth method `opencode-login`, default username `opencode`, upstream issue refs, third-party names. Config-file and config-dir fixtures follow the rename rows (`codev.json`, `.codev/`). | Test names/comments are read by people; identifiers are load-bearing. | Keep our prose; take upstream's test-logic changes. | | `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. | | `artifacts/` (whole directory) | Deleted | Upstream's Remotion marketing-video project (`glm52-rise-video`) with rendered MP4/PNG binaries committed; irrelevant to the fork and bloats every clone. | Keep deleted (`git rm` the upstream side of modify/delete conflicts); delete new upstream additions under `artifacts/` too. | @@ -66,8 +66,9 @@ upstream maintainers — see README → Syncing with upstream for why and how. | `packages/core/test/ripgrep.test.ts` | `120_000` timeout on both `it.live` tests | First use downloads + extracts the ripgrep binary; GitHub-hosted Windows runners blow bun's 5s default. | Keep our timeouts; take upstream's test changes. | | `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` | Slow-runner headroom: unknown-model test `timeoutMs`/bound 15s → 30s (test timeout 60s); 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) | Loaded GitHub-hosted runners spawn processes, fetch ripgrep, and build the lazy file index slower than upstream's Blacksmith runners; 5–30s budgets flake or fail outright. Hang regressions are still caught (a hang exceeds the bound; polls return as soon as ready). | Keep our numbers; 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 `OPENCODE_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. | +| `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/README.md` | `description` "opencode for VS Code" → "CoDev Code for VS Code"; README title → "CoDev Code VS Code Extension" | Manifest branding. `name`, `displayName`, command IDs/titles and README body (which names actual UI elements) stay upstream — the fork doesn't publish this extension; revisit before shipping it. | Keep our description + title; take upstream's other fields/body. | +| 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. | @@ -76,7 +77,7 @@ upstream maintainers — see README → Syncing with upstream for why and how. - **Auto-update**: the updater (`packages/opencode/src/installation/`) targets the `codev-code` npm package and the quickbeard/codev-code GitHub releases (see table row), so `codev upgrade` installs the fork, not stock opencode. The codev hub still launches - the agent with `OPENCODE_DISABLE_AUTOUPDATE=1` so the hub owns updates. Remaining gaps: + the agent with `CODEV_DISABLE_AUTOUPDATE=1` so the hub owns updates. Remaining gaps: the `curl` install path still fetches upstream's install script, and `packages/opencode/src/cli/cmd/uninstall.ts` still uninstalls `opencode-ai` (wrong package; unlisted divergence — patch before distributing outside the team). @@ -94,7 +95,7 @@ upstream maintainers — see README → Syncing with upstream for why and how. 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). + plumbing wired into deep-link handling). - **GitHub Action**: `github/` is rebranded (see table row), but the CLI side is not: `codev github run` (`packages/opencode/src/cli/cmd/github.handler.ts`) still posts upstream-branded comment footers ("opencode session" links, social-card images), @@ -103,7 +104,8 @@ upstream maintainers — see README → Syncing with upstream for why and how. `latest` (1.17.16, published from a pre-rename tree) also still ships the `codev-code` bin, so the action's `codev` invocation needs the next release. Patch before external distribution. -- **Internal names**: `@opencode-ai/*` package names, `OPENCODE_*` env vars, and file names +- **Internal names**: `@opencode-ai/*` package names and file names inside `~/.local/share/codev` (e.g. `opencode-local.db`) keep upstream naming on purpose. Renaming them would be a permanent merge-conflict machine for names users never see. - Do not "clean these up". + Do not "clean these up". (Env vars were originally in this bucket; that decision was + reversed — see the env-var rename row.) diff --git a/SECURITY.md b/SECURITY.md index 0394c10168..33dd50f0c3 100644 --- a/SECURITY.md +++ b/SECURITY.md @@ -20,7 +20,7 @@ If you need true isolation, run CoDev Code inside a Docker container or VM. ### Server Mode -Server mode is opt-in only. When enabled, set `OPENCODE_SERVER_PASSWORD` to require HTTP Basic Auth. Without this, the server runs unauthenticated (with a warning). It is the end user's responsibility to secure the server - any functionality it provides is not a vulnerability. +Server mode is opt-in only. When enabled, set `CODEV_SERVER_PASSWORD` to require HTTP Basic Auth. Without this, the server runs unauthenticated (with a warning). It is the end user's responsibility to secure the server - any functionality it provides is not a vulnerability. ### Out of Scope diff --git a/infra/enterprise.ts b/infra/enterprise.ts index cd2a96d9b3..a187073b3b 100644 --- a/infra/enterprise.ts +++ b/infra/enterprise.ts @@ -9,10 +9,10 @@ new sst.cloudflare.x.SolidStart("Teams", { buildCommand: "bun run build:cloudflare", link: [SECRET.SupportApiKey], environment: { - OPENCODE_STORAGE_ADAPTER: "r2", - OPENCODE_STORAGE_ACCOUNT_ID: sst.cloudflare.DEFAULT_ACCOUNT_ID, - OPENCODE_STORAGE_ACCESS_KEY_ID: SECRET.R2AccessKey.value, - OPENCODE_STORAGE_SECRET_ACCESS_KEY: SECRET.R2SecretKey.value, - OPENCODE_STORAGE_BUCKET: storage.name, + CODEV_STORAGE_ADAPTER: "r2", + CODEV_STORAGE_ACCOUNT_ID: sst.cloudflare.DEFAULT_ACCOUNT_ID, + CODEV_STORAGE_ACCESS_KEY_ID: SECRET.R2AccessKey.value, + CODEV_STORAGE_SECRET_ACCESS_KEY: SECRET.R2SecretKey.value, + CODEV_STORAGE_BUCKET: storage.name, }, }) diff --git a/nix/opencode.nix b/nix/opencode.nix index a22f7d3d24..7b2ff9655e 100644 --- a/nix/opencode.nix +++ b/nix/opencode.nix @@ -45,9 +45,9 @@ stdenvNoCC.mkDerivation (finalAttrs: { ''; env.MODELS_DEV_API_JSON = "${models-dev}/dist/_api.json"; - env.OPENCODE_DISABLE_MODELS_FETCH = true; - env.OPENCODE_VERSION = finalAttrs.version; - env.OPENCODE_CHANNEL = "prod"; + env.CODEV_DISABLE_MODELS_FETCH = true; + env.CODEV_VERSION = finalAttrs.version; + env.CODEV_CHANNEL = "prod"; buildPhase = '' runHook preBuild @@ -91,7 +91,7 @@ stdenvNoCC.mkDerivation (finalAttrs: { writableTmpDirAsHomeHook ]; doInstallCheck = true; - versionCheckKeepEnvironment = [ "HOME" "OPENCODE_DISABLE_MODELS_FETCH" ]; + versionCheckKeepEnvironment = [ "HOME" "CODEV_DISABLE_MODELS_FETCH" ]; versionCheckProgramArg = "--version"; passthru = { diff --git a/packages/app/e2e/performance/README.md b/packages/app/e2e/performance/README.md index ce868d573b..7e1a5cae03 100644 --- a/packages/app/e2e/performance/README.md +++ b/packages/app/e2e/performance/README.md @@ -23,7 +23,7 @@ The suite contains: - cached session repaint and mutation tracing - streaming timeline throughput, RAF-gap, long-task, geometry, and remount diagnostics -All benchmarks import the shared `benchmark` fixture. Pages created through Playwright's `page` fixture automatically capture main-frame navigation history and emit a Chrome trace when `OPENCODE_PERFORMANCE_TRACE_DIR` is set. Benchmarks that need isolated browser contexts use `withBenchmarkPage`, which owns the context and the same diagnostics lifecycle. +All benchmarks import the shared `benchmark` fixture. Pages created through Playwright's `page` fixture automatically capture main-frame navigation history and emit a Chrome trace when `CODEV_PERFORMANCE_TRACE_DIR` is set. Benchmarks that need isolated browser contexts use `withBenchmarkPage`, which owns the context and the same diagnostics lifecycle. New benchmarks should look like normal Playwright tests: @@ -58,10 +58,10 @@ Committed smoke and regression tests continue to own correctness coverage for pa ## Chrome traces -Set `OPENCODE_PERFORMANCE_TRACE_DIR` to emit a standard Chrome DevTools trace for every benchmark page automatically: +Set `CODEV_PERFORMANCE_TRACE_DIR` to emit a standard Chrome DevTools trace for every benchmark page automatically: ```sh -OPENCODE_PERFORMANCE_TRACE_DIR=/tmp/opencode-performance-traces \ +CODEV_PERFORMANCE_TRACE_DIR=/tmp/opencode-performance-traces \ bunx playwright test --config e2e/performance/playwright.config.ts \ timeline/session-tab-switch-benchmark.spec.ts ``` @@ -74,6 +74,6 @@ Trace capture mirrors [Puppeteer's official tracing defaults and lifecycle](http bunx devtools-tracing stats ``` -INP analysis requires a trace with a supported navigation/interaction insight. Selector statistics require a trace captured with `OPENCODE_PERFORMANCE_SELECTOR_TRACE=1`. +INP analysis requires a trace with a supported navigation/interaction insight. Selector statistics require a trace captured with `CODEV_PERFORMANCE_SELECTOR_TRACE=1`. `e2e/performance/playwright.uncapped.config.ts` disables Chromium frame-rate limiting for explicit uncapped diagnostics. Native product benchmarks should use the default Playwright configuration. diff --git a/packages/app/e2e/performance/benchmark.ts b/packages/app/e2e/performance/benchmark.ts index b9f8ea4341..b2f1b23314 100644 --- a/packages/app/e2e/performance/benchmark.ts +++ b/packages/app/e2e/performance/benchmark.ts @@ -29,7 +29,7 @@ export const benchmark = base.extend({ console.log( `BENCHMARK ${JSON.stringify({ schemaVersion: 2, - runID: process.env.OPENCODE_PERFORMANCE_RUN_ID, + runID: process.env.CODEV_PERFORMANCE_RUN_ID, name: benchmarkName(testInfo), status: missing ? "failed" : testInfo.status, expectedStatus: testInfo.expectedStatus, @@ -122,7 +122,7 @@ async function reportPerformancePage(name: string, diagnostics: PerformancePageD console.log( `BENCHMARK_PAGE ${JSON.stringify({ schemaVersion: 2, - runID: process.env.OPENCODE_PERFORMANCE_RUN_ID, + runID: process.env.CODEV_PERFORMANCE_RUN_ID, name, test: testInfo ? benchmarkName(testInfo) : undefined, retry: testInfo?.retry, @@ -130,7 +130,7 @@ async function reportPerformancePage(name: string, diagnostics: PerformancePageD context: { platform: process.platform, trace, - selectorTrace: process.env.OPENCODE_PERFORMANCE_SELECTOR_TRACE === "1", + selectorTrace: process.env.CODEV_PERFORMANCE_SELECTOR_TRACE === "1", }, navigations: diagnostics.navigations, })}`, diff --git a/packages/app/e2e/performance/chrome-trace.ts b/packages/app/e2e/performance/chrome-trace.ts index 343526e254..83b9832f50 100644 --- a/packages/app/e2e/performance/chrome-trace.ts +++ b/packages/app/e2e/performance/chrome-trace.ts @@ -19,10 +19,10 @@ const categories = [ ] export async function startChromeTrace(page: Page, name: string) { - const directory = process.env.OPENCODE_PERFORMANCE_TRACE_DIR + const directory = process.env.CODEV_PERFORMANCE_TRACE_DIR if (!directory) return - const selectors = process.env.OPENCODE_PERFORMANCE_SELECTOR_TRACE === "1" + const selectors = process.env.CODEV_PERFORMANCE_SELECTOR_TRACE === "1" const file = await prepareChromeTrace(directory, name, selectors) const session = await page.context().newCDPSession(page) try { @@ -73,7 +73,7 @@ export async function prepareChromeTrace( nonce = randomUUID().slice(0, 8), ) { await mkdir(directory, { recursive: true }) - const run = process.env.OPENCODE_PERFORMANCE_RUN_ID ?? "manual" + const run = process.env.CODEV_PERFORMANCE_RUN_ID ?? "manual" const hash = createHash("sha256").update(name).digest("hex").slice(0, 8) return path.join( directory, diff --git a/packages/app/e2e/performance/playwright.config.ts b/packages/app/e2e/performance/playwright.config.ts index d4793daee5..e930d53e7b 100644 --- a/packages/app/e2e/performance/playwright.config.ts +++ b/packages/app/e2e/performance/playwright.config.ts @@ -2,7 +2,7 @@ import config from "../../playwright.config" const port = Number(process.env.PLAYWRIGHT_PORT ?? 3000) process.env.PLAYWRIGHT_SERVER_PORT = String(port) -process.env.OPENCODE_PERFORMANCE_RUN_ID ??= `${new Date().toISOString().replace(/[:.]/g, "-")}-${process.pid}` +process.env.CODEV_PERFORMANCE_RUN_ID ??= `${new Date().toISOString().replace(/[:.]/g, "-")}-${process.pid}` export default { ...config, diff --git a/packages/app/e2e/performance/timeline-stability/README.md b/packages/app/e2e/performance/timeline-stability/README.md index 3e9def2757..5d771eb3bd 100644 --- a/packages/app/e2e/performance/timeline-stability/README.md +++ b/packages/app/e2e/performance/timeline-stability/README.md @@ -35,7 +35,7 @@ The suite does not provide complete coverage for: Playwright video, trace, screenshots, and observation JSON are diagnostic evidence. They are not pixel baselines and do not participate in normal pass/fail decisions. -For optional before/violation/after screenshots, set `OPENCODE_STABILITY_CAPTURE=1`. Capture is opt-in because compositor readback can perturb timing. +For optional before/violation/after screenshots, set `CODEV_STABILITY_CAPTURE=1`. Capture is opt-in because compositor readback can perturb timing. ## Test Layers diff --git a/packages/app/e2e/utils/visual-stability/capture.ts b/packages/app/e2e/utils/visual-stability/capture.ts index 3bb583a9d5..0c19211202 100644 --- a/packages/app/e2e/utils/visual-stability/capture.ts +++ b/packages/app/e2e/utils/visual-stability/capture.ts @@ -10,7 +10,7 @@ export type VisualCapture = { } export async function startVisualCapture(page: Page, startedAtEpoch: number) { - if (process.env.OPENCODE_STABILITY_CAPTURE !== "1") return + if (process.env.CODEV_STABILITY_CAPTURE !== "1") return const session = await page.context().newCDPSession(page) await session.send("Page.enable") const recording: VisualCapture = { diff --git a/packages/app/playwright.config.ts b/packages/app/playwright.config.ts index f68652363d..78756897db 100644 --- a/packages/app/playwright.config.ts +++ b/packages/app/playwright.config.ts @@ -9,7 +9,7 @@ const reuse = !process.env.CI const workers = Number(process.env.PLAYWRIGHT_WORKERS ?? (process.env.CI ? 5 : 0)) || undefined export default defineConfig({ testDir: "./e2e", - testIgnore: process.env.OPENCODE_PERFORMANCE === "1" ? "performance/**/*.test.ts" : "performance/**", + testIgnore: process.env.CODEV_PERFORMANCE === "1" ? "performance/**/*.test.ts" : "performance/**", outputDir: "./e2e/test-results", timeout: 60_000, expect: { @@ -26,8 +26,8 @@ export default defineConfig({ reuseExistingServer: reuse, timeout: 120_000, env: { - VITE_OPENCODE_SERVER_HOST: serverHost, - VITE_OPENCODE_SERVER_PORT: serverPort, + VITE_CODEV_SERVER_HOST: serverHost, + VITE_CODEV_SERVER_PORT: serverPort, }, }, use: { diff --git a/packages/app/src/components/help-button.tsx b/packages/app/src/components/help-button.tsx index 9109418fcf..4dbfb752a1 100644 --- a/packages/app/src/components/help-button.tsx +++ b/packages/app/src/components/help-button.tsx @@ -4,7 +4,7 @@ import { createSignal, Show } from "solid-js" import { createStore } from "solid-js/store" export function HelpButton() { - if (import.meta.env.VITE_OPENCODE_CHANNEL !== "dev") return null + if (import.meta.env.VITE_CODEV_CHANNEL !== "dev") return null const [state, setState] = /* persisted(Persist.global("help-button"), */ createStore({ dismissed: false }) /* ) */ const [shown, setShown] = createSignal(false) diff --git a/packages/app/src/components/settings-v2/general.tsx b/packages/app/src/components/settings-v2/general.tsx index 69dfb77fb0..dfcba2cc2c 100644 --- a/packages/app/src/components/settings-v2/general.tsx +++ b/packages/app/src/components/settings-v2/general.tsx @@ -330,7 +330,7 @@ export const SettingsGeneralV2: Component<{ - + - {["beta", "dev"].includes(import.meta.env.VITE_OPENCODE_CHANNEL) && ( + {["beta", "dev"].includes(import.meta.env.VITE_CODEV_CHANNEL) && (
- {import.meta.env.VITE_OPENCODE_CHANNEL.toUpperCase()} + {import.meta.env.VITE_CODEV_CHANNEL.toUpperCase()}
)} diff --git a/packages/app/src/context/settings.tsx b/packages/app/src/context/settings.tsx index 8d4f61079c..4a3b87b8fb 100644 --- a/packages/app/src/context/settings.tsx +++ b/packages/app/src/context/settings.tsx @@ -52,7 +52,7 @@ export interface Settings { export const monoDefault = "System Mono" export const sansDefault = "System Sans" export const terminalDefault = "JetBrainsMono Nerd Font Mono" -export const newLayoutDesignsDefault = import.meta.env.VITE_OPENCODE_CHANNEL !== "prod" +export const newLayoutDesignsDefault = import.meta.env.VITE_CODEV_CHANNEL !== "prod" const monoFallback = 'ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace' diff --git a/packages/app/src/entry.tsx b/packages/app/src/entry.tsx index aa4d99a143..fefdf7fb7b 100644 --- a/packages/app/src/entry.tsx +++ b/packages/app/src/entry.tsx @@ -102,7 +102,7 @@ if (!(root instanceof HTMLElement) && import.meta.env.DEV) { const getCurrentUrl = () => { if (location.hostname.includes("opencode.ai")) return "http://localhost:4096" if (import.meta.env.DEV) - return `http://${import.meta.env.VITE_OPENCODE_SERVER_HOST ?? "localhost"}:${import.meta.env.VITE_OPENCODE_SERVER_PORT ?? "4096"}` + return `http://${import.meta.env.VITE_CODEV_SERVER_HOST ?? "localhost"}:${import.meta.env.VITE_CODEV_SERVER_PORT ?? "4096"}` return location.origin } @@ -147,7 +147,7 @@ if (import.meta.env.VITE_SENTRY_DSN) { integrations: (integrations) => { return integrations.filter( (i) => - i.name !== "Breadcrumbs" && !(import.meta.env.OPENCODE_CHANNEL === "prod" && i.name === "GlobalHandlers"), + i.name !== "Breadcrumbs" && !(import.meta.env.CODEV_CHANNEL === "prod" && i.name === "GlobalHandlers"), ) }, }) diff --git a/packages/app/src/env.d.ts b/packages/app/src/env.d.ts index 39f827eb64..db3436e689 100644 --- a/packages/app/src/env.d.ts +++ b/packages/app/src/env.d.ts @@ -1,7 +1,7 @@ interface ImportMetaEnv { - readonly VITE_OPENCODE_SERVER_HOST: string - readonly VITE_OPENCODE_SERVER_PORT: string - readonly VITE_OPENCODE_CHANNEL?: "dev" | "beta" | "prod" + readonly VITE_CODEV_SERVER_HOST: string + readonly VITE_CODEV_SERVER_PORT: string + readonly VITE_CODEV_CHANNEL?: "dev" | "beta" | "prod" readonly VITE_SENTRY_DSN?: string readonly VITE_SENTRY_ENVIRONMENT?: string diff --git a/packages/app/src/pages/layout/helpers.ts b/packages/app/src/pages/layout/helpers.ts index ce793e282b..6028ee2247 100644 --- a/packages/app/src/pages/layout/helpers.ts +++ b/packages/app/src/pages/layout/helpers.ts @@ -92,10 +92,10 @@ export function homeSessionServerStatus(active: boolean, status: () => { working return status() } -const OPENCODE_PROJECT_ID = "4b0ea68d7af9a6031a7ffda7ad66e0cb83315750" +const CODEV_PROJECT_ID = "4b0ea68d7af9a6031a7ffda7ad66e0cb83315750" export function getProjectAvatarSource(id?: string, icon?: { color?: string; url?: string; override?: string }) { - if (id === OPENCODE_PROJECT_ID) return "https://opencode.ai/favicon.svg" + if (id === CODEV_PROJECT_ID) return "https://opencode.ai/favicon.svg" if (icon?.override) return icon.override if (icon?.color) return undefined return icon?.url diff --git a/packages/app/src/pages/new-session.tsx b/packages/app/src/pages/new-session.tsx index 7a8e44c5ab..37d0207e48 100644 --- a/packages/app/src/pages/new-session.tsx +++ b/packages/app/src/pages/new-session.tsx @@ -31,7 +31,7 @@ import { useSettingsDialog } from "@/components/settings-dialog" import { Persist, persisted } from "@/utils/persist" import createPresence from "solid-presence" -const workspaceBarEnabled = import.meta.env.VITE_OPENCODE_CHANNEL !== "prod" +const workspaceBarEnabled = import.meta.env.VITE_CODEV_CHANNEL !== "prod" const providerTipDismissalDuration = 30 * 24 * 60 * 60 * 1000 const providerTipExitDuration = 250 diff --git a/packages/app/vite.js b/packages/app/vite.js index e1f851653c..b0fbfed347 100644 --- a/packages/app/vite.js +++ b/packages/app/vite.js @@ -6,9 +6,9 @@ import { fileURLToPath } from "url" const theme = fileURLToPath(new URL("./public/oc-theme-preload.js", import.meta.url)) const channel = (() => { - const raw = process.env.OPENCODE_CHANNEL + const raw = process.env.CODEV_CHANNEL if (raw === "dev" || raw === "beta" || raw === "prod") return raw - if (process.env.OPENCODE_CHANNEL === "latest") return "prod" + if (process.env.CODEV_CHANNEL === "latest") return "prod" return "dev" })() @@ -26,7 +26,7 @@ export default [ }, }, define: { - "import.meta.env.VITE_OPENCODE_CHANNEL": JSON.stringify(channel), + "import.meta.env.VITE_CODEV_CHANNEL": JSON.stringify(channel), }, worker: { format: "es", diff --git a/packages/cli/bin/lildax.cjs b/packages/cli/bin/lildax.cjs index ab99b84b0f..543f025eb9 100644 --- a/packages/cli/bin/lildax.cjs +++ b/packages/cli/bin/lildax.cjs @@ -29,7 +29,7 @@ function run(target) { }) } -const envPath = process.env.OPENCODE_BIN_PATH +const envPath = process.env.CODEV_BIN_PATH const scriptDir = path.dirname(fs.realpathSync(__filename)) const cached = path.join(scriptDir, ".lildax") const platform = { darwin: "darwin", linux: "linux", win32: "windows" }[os.platform()] || os.platform() diff --git a/packages/cli/script/build.ts b/packages/cli/script/build.ts index 55869a6295..61a5a01317 100755 --- a/packages/cli/script/build.ts +++ b/packages/cli/script/build.ts @@ -87,11 +87,11 @@ for (const item of targets) { windows: {}, }, define: { - OPENCODE_VERSION: `'${Script.version}'`, - OPENCODE_CLI_NAME: `'${binary}'`, - OPENCODE_MODELS_DEV: modelsData, - OPENCODE_CHANNEL: `'${Script.channel}'`, - OPENCODE_LIBC: item.os === "linux" ? `'${item.abi ?? "glibc"}'` : "undefined", + CODEV_VERSION: `'${Script.version}'`, + CODEV_CLI_NAME: `'${binary}'`, + CODEV_MODELS_DEV: modelsData, + CODEV_CHANNEL: `'${Script.channel}'`, + CODEV_LIBC: item.os === "linux" ? `'${item.abi ?? "glibc"}'` : "undefined", // FFF_LIBC selects the fff native lib variant: "musl" or "gnu". FFF_LIBC: item.os === "linux" ? `'${item.abi ?? "gnu"}'` : "undefined", OTUI_TREE_SITTER_WORKER_PATH: diff --git a/packages/cli/script/generate.ts b/packages/cli/script/generate.ts index d98565e298..bd67773582 100755 --- a/packages/cli/script/generate.ts +++ b/packages/cli/script/generate.ts @@ -1,4 +1,4 @@ -const modelsUrl = process.env.OPENCODE_MODELS_URL || "https://models.dev" +const modelsUrl = process.env.CODEV_MODELS_URL || "https://models.dev" export const modelsData = process.env.MODELS_DEV_API_JSON ? await Bun.file(process.env.MODELS_DEV_API_JSON).text() diff --git a/packages/cli/src/commands/commands.ts b/packages/cli/src/commands/commands.ts index 19d1f5e68b..444b24cef0 100644 --- a/packages/cli/src/commands/commands.ts +++ b/packages/cli/src/commands/commands.ts @@ -1,9 +1,9 @@ import { Argument, Flag } from "effect/unstable/cli" import { Spec } from "../framework/spec" -declare const OPENCODE_CLI_NAME: string | undefined +declare const CODEV_CLI_NAME: string | undefined -export const Commands = Spec.make(typeof OPENCODE_CLI_NAME === "string" ? OPENCODE_CLI_NAME : "opencode", { +export const Commands = Spec.make(typeof CODEV_CLI_NAME === "string" ? CODEV_CLI_NAME : "opencode", { description: "OpenCode 2.0 preview command line interface", commands: [ Spec.make("api", { diff --git a/packages/codev-gateway/src/auth-file.ts b/packages/codev-gateway/src/auth-file.ts index c1be6c4e1b..56cabf88fd 100644 --- a/packages/codev-gateway/src/auth-file.ts +++ b/packages/codev-gateway/src/auth-file.ts @@ -54,10 +54,10 @@ interface AuthFileContents { // Keyed off the hub's auth.json rather than the ~/.codev-hub/ dir (mirroring // the hub's own fresh-install check): unrelated code creates the directory, // so only the file signals a hub session worth adopting. Home is resolved per -// call via OPENCODE_TEST_HOME (same convention as core's Global) because +// call via CODEV_TEST_HOME (same convention as core's Global) because // Bun's homedir() ignores runtime HOME changes, which tests rely on. function authDir() { - const home = process.env.OPENCODE_TEST_HOME ?? homedir() + const home = process.env.CODEV_TEST_HOME ?? homedir() const hub = join(home, ".codev-hub") if (existsSync(join(hub, "auth.json"))) return hub return join(home, ".codev") diff --git a/packages/codev-gateway/test/auth-file.test.ts b/packages/codev-gateway/test/auth-file.test.ts index 4e932d3ead..cc51c6e0f3 100644 --- a/packages/codev-gateway/test/auth-file.test.ts +++ b/packages/codev-gateway/test/auth-file.test.ts @@ -6,17 +6,17 @@ import { join } from "node:path" let tempDir: string let originalTestHome: string | undefined -// OPENCODE_TEST_HOME rather than HOME: Bun's homedir() ignores runtime HOME +// CODEV_TEST_HOME rather than HOME: Bun's homedir() ignores runtime HOME // changes, so overriding HOME here would silently hit the real ~/.codev. beforeEach(() => { tempDir = mkdtempSync(join(tmpdir(), "codev-gateway-auth-")) - originalTestHome = process.env.OPENCODE_TEST_HOME - process.env.OPENCODE_TEST_HOME = tempDir + originalTestHome = process.env.CODEV_TEST_HOME + process.env.CODEV_TEST_HOME = tempDir }) afterEach(() => { - if (originalTestHome === undefined) delete process.env.OPENCODE_TEST_HOME - if (originalTestHome !== undefined) process.env.OPENCODE_TEST_HOME = originalTestHome + if (originalTestHome === undefined) delete process.env.CODEV_TEST_HOME + if (originalTestHome !== undefined) process.env.CODEV_TEST_HOME = originalTestHome rmSync(tempDir, { recursive: true, force: true }) }) diff --git a/packages/core/src/database/database.ts b/packages/core/src/database/database.ts index d61adf047e..aa652a1488 100644 --- a/packages/core/src/database/database.ts +++ b/packages/core/src/database/database.ts @@ -41,14 +41,14 @@ export function layerFromPath(filename: string) { } export function path() { - if (Flag.OPENCODE_DB) { - if (Flag.OPENCODE_DB === ":memory:" || isAbsolute(Flag.OPENCODE_DB)) return Flag.OPENCODE_DB - return join(Global.Path.data, Flag.OPENCODE_DB) + if (Flag.CODEV_DB) { + if (Flag.CODEV_DB === ":memory:" || isAbsolute(Flag.CODEV_DB)) return Flag.CODEV_DB + return join(Global.Path.data, Flag.CODEV_DB) } if ( ["latest", "beta", "prod"].includes(InstallationChannel) || - process.env.OPENCODE_DISABLE_CHANNEL_DB === "1" || - process.env.OPENCODE_DISABLE_CHANNEL_DB === "true" + process.env.CODEV_DISABLE_CHANNEL_DB === "1" || + process.env.CODEV_DISABLE_CHANNEL_DB === "true" ) return join(Global.Path.data, "opencode.db") return join(Global.Path.data, `opencode-${InstallationChannel.replace(/[^a-zA-Z0-9._-]/g, "-")}.db`) diff --git a/packages/core/src/filesystem/search.ts b/packages/core/src/filesystem/search.ts index 72c9128cfd..bd7eb90b70 100644 --- a/packages/core/src/filesystem/search.ts +++ b/packages/core/src/filesystem/search.ts @@ -230,7 +230,7 @@ export const fffLayer = Layer.effect( }), ) -const layer = Layer.unwrap(Effect.sync(() => (Flag.OPENCODE_DISABLE_FFF || !Fff.available() ? ripgrepLayer : fffLayer))) +const layer = Layer.unwrap(Effect.sync(() => (Flag.CODEV_DISABLE_FFF || !Fff.available() ? ripgrepLayer : fffLayer))) export const locationLayer = layer diff --git a/packages/core/src/filesystem/watcher.ts b/packages/core/src/filesystem/watcher.ts index c5e2063191..de4e564f84 100644 --- a/packages/core/src/filesystem/watcher.ts +++ b/packages/core/src/filesystem/watcher.ts @@ -17,7 +17,7 @@ import { lazy } from "../util/lazy" import { Ignore } from "./ignore" import { Protected } from "./protected" -declare const OPENCODE_LIBC: string | undefined +declare const CODEV_LIBC: string | undefined const SUBSCRIBE_TIMEOUT_MS = 10_000 @@ -25,7 +25,7 @@ export const Event = FileSystemWatcher.Event const watcher = lazy((): typeof import("@parcel/watcher") | undefined => { try { - const libc = typeof OPENCODE_LIBC === "undefined" ? undefined : OPENCODE_LIBC + const libc = typeof CODEV_LIBC === "undefined" ? undefined : CODEV_LIBC const binding = require( `@parcel/watcher-${process.platform}-${process.arch}${process.platform === "linux" ? `-${libc || "glibc"}` : ""}`, ) @@ -57,7 +57,7 @@ export class Service extends Context.Service()("@opencode/v2 const layer = Layer.effect( Service, Effect.gen(function* () { - if (yield* Flag.OPENCODE_EXPERIMENTAL_DISABLE_FILEWATCHER) return Service.of({}) + if (yield* Flag.CODEV_EXPERIMENTAL_DISABLE_FILEWATCHER) return Service.of({}) const backend = getBackend() const location = yield* Location.Service @@ -106,7 +106,7 @@ const layer = Layer.effect( const config = (yield* (yield* Config.Service).entries()) .filter((entry): entry is Config.Document => entry.type === "document") .flatMap((item) => item.info.watcher?.ignore ?? []) - if (location.vcs && (yield* Flag.OPENCODE_EXPERIMENTAL_FILEWATCHER)) { + if (location.vcs && (yield* Flag.CODEV_EXPERIMENTAL_FILEWATCHER)) { yield* Effect.forkScoped( subscribe(location.directory, [...Ignore.PATTERNS, ...config, ...protecteds(location.directory)]), ) diff --git a/packages/core/src/flag/flag.ts b/packages/core/src/flag/flag.ts index a0eb78a13e..3f72859f24 100644 --- a/packages/core/src/flag/flag.ts +++ b/packages/core/src/flag/flag.ts @@ -5,74 +5,74 @@ export function truthy(key: string) { return value === "true" || value === "1" } -const copy = process.env["OPENCODE_EXPERIMENTAL_DISABLE_COPY_ON_SELECT"] -const fff = process.env["OPENCODE_DISABLE_FFF"] +const copy = process.env["CODEV_EXPERIMENTAL_DISABLE_COPY_ON_SELECT"] +const fff = process.env["CODEV_DISABLE_FFF"] function enabledByExperimental(key: string) { - return process.env[key] === undefined ? truthy("OPENCODE_EXPERIMENTAL") : truthy(key) + return process.env[key] === undefined ? truthy("CODEV_EXPERIMENTAL") : truthy(key) } export const Flag = { OTEL_EXPORTER_OTLP_ENDPOINT: process.env["OTEL_EXPORTER_OTLP_ENDPOINT"], OTEL_EXPORTER_OTLP_HEADERS: process.env["OTEL_EXPORTER_OTLP_HEADERS"], - OPENCODE_AUTO_HEAP_SNAPSHOT: truthy("OPENCODE_AUTO_HEAP_SNAPSHOT"), - OPENCODE_GIT_BASH_PATH: process.env["OPENCODE_GIT_BASH_PATH"], - OPENCODE_CONFIG: process.env["OPENCODE_CONFIG"], - OPENCODE_CONFIG_CONTENT: process.env["OPENCODE_CONFIG_CONTENT"], - OPENCODE_DISABLE_AUTOUPDATE: truthy("OPENCODE_DISABLE_AUTOUPDATE"), - OPENCODE_ALWAYS_NOTIFY_UPDATE: truthy("OPENCODE_ALWAYS_NOTIFY_UPDATE"), - OPENCODE_DISABLE_PRUNE: truthy("OPENCODE_DISABLE_PRUNE"), - OPENCODE_DISABLE_TERMINAL_TITLE: truthy("OPENCODE_DISABLE_TERMINAL_TITLE"), - OPENCODE_SHOW_TTFD: truthy("OPENCODE_SHOW_TTFD"), - OPENCODE_DISABLE_AUTOCOMPACT: truthy("OPENCODE_DISABLE_AUTOCOMPACT"), - OPENCODE_DISABLE_MODELS_FETCH: truthy("OPENCODE_DISABLE_MODELS_FETCH"), - OPENCODE_DISABLE_MOUSE: truthy("OPENCODE_DISABLE_MOUSE"), - OPENCODE_FAKE_VCS: process.env["OPENCODE_FAKE_VCS"], - OPENCODE_SERVER_PASSWORD: process.env["OPENCODE_SERVER_PASSWORD"], - OPENCODE_SERVER_USERNAME: process.env["OPENCODE_SERVER_USERNAME"], - OPENCODE_DISABLE_FFF: fff === undefined ? process.platform === "win32" : truthy("OPENCODE_DISABLE_FFF"), + CODEV_AUTO_HEAP_SNAPSHOT: truthy("CODEV_AUTO_HEAP_SNAPSHOT"), + CODEV_GIT_BASH_PATH: process.env["CODEV_GIT_BASH_PATH"], + CODEV_CONFIG: process.env["CODEV_CONFIG"], + CODEV_CONFIG_CONTENT: process.env["CODEV_CONFIG_CONTENT"], + CODEV_DISABLE_AUTOUPDATE: truthy("CODEV_DISABLE_AUTOUPDATE"), + CODEV_ALWAYS_NOTIFY_UPDATE: truthy("CODEV_ALWAYS_NOTIFY_UPDATE"), + CODEV_DISABLE_PRUNE: truthy("CODEV_DISABLE_PRUNE"), + CODEV_DISABLE_TERMINAL_TITLE: truthy("CODEV_DISABLE_TERMINAL_TITLE"), + CODEV_SHOW_TTFD: truthy("CODEV_SHOW_TTFD"), + CODEV_DISABLE_AUTOCOMPACT: truthy("CODEV_DISABLE_AUTOCOMPACT"), + CODEV_DISABLE_MODELS_FETCH: truthy("CODEV_DISABLE_MODELS_FETCH"), + CODEV_DISABLE_MOUSE: truthy("CODEV_DISABLE_MOUSE"), + CODEV_FAKE_VCS: process.env["CODEV_FAKE_VCS"], + CODEV_SERVER_PASSWORD: process.env["CODEV_SERVER_PASSWORD"], + CODEV_SERVER_USERNAME: process.env["CODEV_SERVER_USERNAME"], + CODEV_DISABLE_FFF: fff === undefined ? process.platform === "win32" : truthy("CODEV_DISABLE_FFF"), // Experimental - OPENCODE_EXPERIMENTAL_FILEWATCHER: Config.boolean("OPENCODE_EXPERIMENTAL_FILEWATCHER").pipe( + CODEV_EXPERIMENTAL_FILEWATCHER: Config.boolean("CODEV_EXPERIMENTAL_FILEWATCHER").pipe( Config.withDefault(false), ), - OPENCODE_EXPERIMENTAL_DISABLE_FILEWATCHER: Config.boolean("OPENCODE_EXPERIMENTAL_DISABLE_FILEWATCHER").pipe( + CODEV_EXPERIMENTAL_DISABLE_FILEWATCHER: Config.boolean("CODEV_EXPERIMENTAL_DISABLE_FILEWATCHER").pipe( Config.withDefault(false), ), - OPENCODE_EXPERIMENTAL_DISABLE_COPY_ON_SELECT: - copy === undefined ? process.platform === "win32" : truthy("OPENCODE_EXPERIMENTAL_DISABLE_COPY_ON_SELECT"), - OPENCODE_MODELS_URL: process.env["OPENCODE_MODELS_URL"], - OPENCODE_MODELS_PATH: process.env["OPENCODE_MODELS_PATH"], - OPENCODE_DB: process.env["OPENCODE_DB"], + CODEV_EXPERIMENTAL_DISABLE_COPY_ON_SELECT: + copy === undefined ? process.platform === "win32" : truthy("CODEV_EXPERIMENTAL_DISABLE_COPY_ON_SELECT"), + CODEV_MODELS_URL: process.env["CODEV_MODELS_URL"], + CODEV_MODELS_PATH: process.env["CODEV_MODELS_PATH"], + CODEV_DB: process.env["CODEV_DB"], - OPENCODE_WORKSPACE_ID: process.env["OPENCODE_WORKSPACE_ID"], - OPENCODE_EXPERIMENTAL_WORKSPACES: enabledByExperimental("OPENCODE_EXPERIMENTAL_WORKSPACES"), + CODEV_WORKSPACE_ID: process.env["CODEV_WORKSPACE_ID"], + CODEV_EXPERIMENTAL_WORKSPACES: enabledByExperimental("CODEV_EXPERIMENTAL_WORKSPACES"), // Evaluated at access time (not module load) because tests, the CLI, and // external tooling set these env vars at runtime. - get OPENCODE_DISABLE_PROJECT_CONFIG() { - return truthy("OPENCODE_DISABLE_PROJECT_CONFIG") + get CODEV_DISABLE_PROJECT_CONFIG() { + return truthy("CODEV_DISABLE_PROJECT_CONFIG") }, - get OPENCODE_EXPERIMENTAL_REFERENCES() { - return enabledByExperimental("OPENCODE_EXPERIMENTAL_REFERENCES") + get CODEV_EXPERIMENTAL_REFERENCES() { + return enabledByExperimental("CODEV_EXPERIMENTAL_REFERENCES") }, - get OPENCODE_TUI_CONFIG() { - return process.env["OPENCODE_TUI_CONFIG"] + get CODEV_TUI_CONFIG() { + return process.env["CODEV_TUI_CONFIG"] }, - get OPENCODE_CONFIG_DIR() { - return process.env["OPENCODE_CONFIG_DIR"] + get CODEV_CONFIG_DIR() { + return process.env["CODEV_CONFIG_DIR"] }, - get OPENCODE_PURE() { - return truthy("OPENCODE_PURE") + get CODEV_PURE() { + return truthy("CODEV_PURE") }, - get OPENCODE_PERMISSION() { - return process.env["OPENCODE_PERMISSION"] + get CODEV_PERMISSION() { + return process.env["CODEV_PERMISSION"] }, - get OPENCODE_PLUGIN_META_FILE() { - return process.env["OPENCODE_PLUGIN_META_FILE"] + get CODEV_PLUGIN_META_FILE() { + return process.env["CODEV_PLUGIN_META_FILE"] }, - get OPENCODE_CLIENT() { - return process.env["OPENCODE_CLIENT"] ?? "cli" + get CODEV_CLIENT() { + return process.env["CODEV_CLIENT"] ?? "cli" }, } diff --git a/packages/core/src/global.ts b/packages/core/src/global.ts index 352476d246..f572761fb3 100644 --- a/packages/core/src/global.ts +++ b/packages/core/src/global.ts @@ -16,7 +16,7 @@ const tmp = path.join(os.tmpdir(), app) const paths = { get home() { - return process.env.OPENCODE_TEST_HOME ?? os.homedir() + return process.env.CODEV_TEST_HOME ?? os.homedir() }, data, bin: path.join(cache, "bin"), @@ -61,7 +61,7 @@ export function make(input: Partial = {}): Interface { home: Path.home, data: Path.data, cache: Path.cache, - config: Flag.OPENCODE_CONFIG_DIR ?? Path.config, + config: Flag.CODEV_CONFIG_DIR ?? Path.config, state: Path.state, tmp: Path.tmp, bin: Path.bin, diff --git a/packages/core/src/installation/version.ts b/packages/core/src/installation/version.ts index 25d9cd99aa..9d1a24ab31 100644 --- a/packages/core/src/installation/version.ts +++ b/packages/core/src/installation/version.ts @@ -1,8 +1,8 @@ declare global { - const OPENCODE_VERSION: string - const OPENCODE_CHANNEL: string + const CODEV_VERSION: string + const CODEV_CHANNEL: string } -export const InstallationVersion = typeof OPENCODE_VERSION === "string" ? OPENCODE_VERSION : "local" -export const InstallationChannel = typeof OPENCODE_CHANNEL === "string" ? OPENCODE_CHANNEL : "local" +export const InstallationVersion = typeof CODEV_VERSION === "string" ? CODEV_VERSION : "local" +export const InstallationChannel = typeof CODEV_CHANNEL === "string" ? CODEV_CHANNEL : "local" export const InstallationLocal = InstallationChannel === "local" diff --git a/packages/core/src/instruction-context.ts b/packages/core/src/instruction-context.ts index 492fa42094..5aa1e8c64d 100644 --- a/packages/core/src/instruction-context.ts +++ b/packages/core/src/instruction-context.ts @@ -45,7 +45,7 @@ const layer = Layer.effectDiscard( fromProject === "" || (fromProject !== ".." && !fromProject.startsWith(`..${sep}`) && !isAbsolute(fromProject)) const discovered = new Set( yield* Effect.forEach( - Flag.OPENCODE_DISABLE_PROJECT_CONFIG || !insideProject + Flag.CODEV_DISABLE_PROJECT_CONFIG || !insideProject ? [] : yield* fs.up({ targets: ["AGENTS.md"], diff --git a/packages/core/src/models-dev.ts b/packages/core/src/models-dev.ts index c2325cb57f..856f8546a7 100644 --- a/packages/core/src/models-dev.ts +++ b/packages/core/src/models-dev.ts @@ -15,7 +15,7 @@ import { httpClient } from "./effect/app-node-platform" export const CatalogModelStatus = Schema.Literals(["alpha", "beta", "deprecated"]) export type CatalogModelStatus = typeof CatalogModelStatus.Type -const USER_AGENT = `opencode/${InstallationChannel}/${InstallationVersion}/${Flag.OPENCODE_CLIENT}` +const USER_AGENT = `opencode/${InstallationChannel}/${InstallationVersion}/${Flag.CODEV_CLIENT}` const CostTier = Schema.Struct({ input: Schema.Finite, @@ -111,7 +111,7 @@ export type Provider = Schema.Schema.Type export const Event = ModelsDev.Event -declare const OPENCODE_MODELS_DEV: Record | undefined +declare const CODEV_MODELS_DEV: Record | undefined export interface Interface { readonly get: () => Effect.Effect> @@ -135,7 +135,7 @@ const layer = Layer.effect( ), ) - const source = Flag.OPENCODE_MODELS_URL || "https://models.dev" + const source = Flag.CODEV_MODELS_URL || "https://models.dev" const filepath = path.join( Global.Path.cache, source === "https://models.dev" ? "models.json" : `models-${Hash.fast(source)}.json`, @@ -159,10 +159,10 @@ const layer = Layer.effect( ) }) - const loadFromDisk = fs.readJson(Flag.OPENCODE_MODELS_PATH ?? filepath).pipe( + const loadFromDisk = fs.readJson(Flag.CODEV_MODELS_PATH ?? filepath).pipe( Effect.catch((error) => { if ( - Flag.OPENCODE_MODELS_PATH === undefined && + Flag.CODEV_MODELS_PATH === undefined && error._tag === "FileSystemError" && error.method === "readJson" ) { @@ -174,7 +174,7 @@ const layer = Layer.effect( ) const loadSnapshot = Effect.sync(() => - typeof OPENCODE_MODELS_DEV === "undefined" ? undefined : OPENCODE_MODELS_DEV, + typeof CODEV_MODELS_DEV === "undefined" ? undefined : CODEV_MODELS_DEV, ) const fetchAndWrite = Effect.fn("ModelsDev.fetchAndWrite")(function* () { @@ -197,7 +197,7 @@ const layer = Layer.effect( if (fromDisk) return fromDisk const snapshot = yield* loadSnapshot if (snapshot) return snapshot - if (Flag.OPENCODE_DISABLE_MODELS_FETCH) return {} + if (Flag.CODEV_DISABLE_MODELS_FETCH) return {} // Flock is cross-process: concurrent opencode CLIs can race on this cache file. const text = yield* Effect.scoped( Effect.gen(function* () { @@ -230,7 +230,7 @@ const layer = Layer.effect( ) }) - if (!Flag.OPENCODE_DISABLE_MODELS_FETCH && !process.argv.includes("--get-yargs-completions")) { + if (!Flag.CODEV_DISABLE_MODELS_FETCH && !process.argv.includes("--get-yargs-completions")) { // Schedule.spaced runs the effect once, then waits between completions. yield* Effect.forkScoped(refresh().pipe(Effect.repeat(Schedule.spaced("60 minutes")), Effect.ignore)) } diff --git a/packages/core/src/observability/logging.ts b/packages/core/src/observability/logging.ts index 0047d8d5e3..99a0770876 100644 --- a/packages/core/src/observability/logging.ts +++ b/packages/core/src/observability/logging.ts @@ -54,7 +54,7 @@ export function fileLogger(file = path.join(Global.Path.log, "opencode.log"), id const stderrLogger = Logger.make((options) => process.stderr.write(formatter().log(options) + "\n")) export function minimumLogLevel() { - const value = process.env.OPENCODE_LOG_LEVEL?.toUpperCase() + const value = process.env.CODEV_LOG_LEVEL?.toUpperCase() const levels = { DEBUG: "Debug", INFO: "Info", @@ -65,7 +65,7 @@ export function minimumLogLevel() { } export function loggers() { - return process.env.OPENCODE_PRINT_LOGS === "1" ? [fileLogger(), stderrLogger] : [fileLogger()] + return process.env.CODEV_PRINT_LOGS === "1" ? [fileLogger(), stderrLogger] : [fileLogger()] } export * as Logging from "./logging" diff --git a/packages/core/src/observability/otlp.ts b/packages/core/src/observability/otlp.ts index dd99ebc143..507fcd83b3 100644 --- a/packages/core/src/observability/otlp.ts +++ b/packages/core/src/observability/otlp.ts @@ -40,7 +40,7 @@ export function resource(): { serviceName: string; serviceVersion: string; attri attributes: { ...resourceAttributes(), "deployment.environment.name": InstallationChannel, - "opencode.client": Flag.OPENCODE_CLIENT, + "opencode.client": Flag.CODEV_CLIENT, "opencode.run": runID, "service.instance.id": runID, }, diff --git a/packages/core/src/plugin/provider/opencode.ts b/packages/core/src/plugin/provider/opencode.ts index f07d72e5f4..3052624fde 100644 --- a/packages/core/src/plugin/provider/opencode.ts +++ b/packages/core/src/plugin/provider/opencode.ts @@ -164,7 +164,7 @@ export const OpencodePlugin = define { if (!hasKey) provider.request.body.apiKey = "public" }) diff --git a/packages/core/src/plugin/skill/customize-opencode.md b/packages/core/src/plugin/skill/customize-opencode.md index 1467604ee1..60bb390531 100644 --- a/packages/core/src/plugin/skill/customize-opencode.md +++ b/packages/core/src/plugin/skill/customize-opencode.md @@ -1,7 +1,7 @@ @@ -425,16 +425,16 @@ the `plan` agent's permission ruleset (`edit: deny *`). When a user's config is broken and opencode won't start, these env vars help: -- `OPENCODE_DISABLE_PROJECT_CONFIG=1`: skip the project's local `codev.json` +- `CODEV_DISABLE_PROJECT_CONFIG=1`: skip the project's local `codev.json` and start from globals only. Run from the project directory, opencode loads, the user edits the broken file, then they restart without the flag. -- `OPENCODE_CONFIG=/path/to/file.json`: load an additional explicit config. -- `OPENCODE_CONFIG_CONTENT='{"$schema":"https://opencode.ai/config.json"}'`: +- `CODEV_CONFIG=/path/to/file.json`: load an additional explicit config. +- `CODEV_CONFIG_CONTENT='{"$schema":"https://opencode.ai/config.json"}'`: inject inline JSON as a final local-scope merge. -- `OPENCODE_DISABLE_DEFAULT_PLUGINS=1`: skip default plugins. -- `OPENCODE_PURE=1`: skip external plugins entirely. -- `OPENCODE_DISABLE_EXTERNAL_SKILLS=1`, - `OPENCODE_DISABLE_CLAUDE_CODE_SKILLS=1`: skip the external skill scans under +- `CODEV_DISABLE_DEFAULT_PLUGINS=1`: skip default plugins. +- `CODEV_PURE=1`: skip external plugins entirely. +- `CODEV_DISABLE_EXTERNAL_SKILLS=1`, + `CODEV_DISABLE_CLAUDE_CODE_SKILLS=1`: skip the external skill scans under `~/.claude/` and `~/.agents/`. ## When proposing edits diff --git a/packages/core/src/pty.ts b/packages/core/src/pty.ts index e5be4d4b64..b4bafc947d 100644 --- a/packages/core/src/pty.ts +++ b/packages/core/src/pty.ts @@ -171,7 +171,7 @@ const layer = Layer.effect( ...process.env, ...input.env, TERM: "xterm-256color", - OPENCODE_TERMINAL: "1", + CODEV_TERMINAL: "1", } as Record if (process.platform === "win32") { env.LC_ALL = "C.UTF-8" diff --git a/packages/core/src/repository.ts b/packages/core/src/repository.ts index dbc6a8fbca..5f23f60676 100644 --- a/packages/core/src/repository.ts +++ b/packages/core/src/repository.ts @@ -166,7 +166,7 @@ function withSlash(input: string) { } function githubRemote(pathname: string) { - const base = process.env.OPENCODE_REPO_CLONE_GITHUB_BASE_URL + const base = process.env.CODEV_REPO_CLONE_GITHUB_BASE_URL if (!base) return `https://github.com/${pathname}.git` return new URL(`${pathname}.git`, withSlash(base)).href } diff --git a/packages/core/src/shell.ts b/packages/core/src/shell.ts index 29089106d9..c57402ecd5 100644 --- a/packages/core/src/shell.ts +++ b/packages/core/src/shell.ts @@ -122,7 +122,7 @@ function select(file: string | undefined, opts?: { acceptable?: boolean }) { export function gitbash() { if (process.platform !== "win32") return - if (Flag.OPENCODE_GIT_BASH_PATH) return Flag.OPENCODE_GIT_BASH_PATH + if (Flag.CODEV_GIT_BASH_PATH) return Flag.CODEV_GIT_BASH_PATH const git = which("git") if (!git) return const file = path.join(git, "..", "..", "bin", "bash.exe") diff --git a/packages/core/src/tool/websearch.ts b/packages/core/src/tool/websearch.ts index 6d62236316..31af623799 100644 --- a/packages/core/src/tool/websearch.ts +++ b/packages/core/src/tool/websearch.ts @@ -73,11 +73,11 @@ export class ConfigService extends Context.Service()("@op export const defaultConfigLayer = Layer.sync(ConfigService, () => ConfigService.of({ provider: - process.env.OPENCODE_WEBSEARCH_PROVIDER === "exa" || process.env.OPENCODE_WEBSEARCH_PROVIDER === "parallel" - ? process.env.OPENCODE_WEBSEARCH_PROVIDER + process.env.CODEV_WEBSEARCH_PROVIDER === "exa" || process.env.CODEV_WEBSEARCH_PROVIDER === "parallel" + ? process.env.CODEV_WEBSEARCH_PROVIDER : undefined, - enableExa: truthy("OPENCODE_EXPERIMENTAL") || truthy("OPENCODE_ENABLE_EXA") || truthy("OPENCODE_EXPERIMENTAL_EXA"), - enableParallel: truthy("OPENCODE_ENABLE_PARALLEL") || truthy("OPENCODE_EXPERIMENTAL_PARALLEL"), + enableExa: truthy("CODEV_EXPERIMENTAL") || truthy("CODEV_ENABLE_EXA") || truthy("CODEV_EXPERIMENTAL_EXA"), + enableParallel: truthy("CODEV_ENABLE_PARALLEL") || truthy("CODEV_EXPERIMENTAL_PARALLEL"), exaApiKey: process.env.EXA_API_KEY, parallelApiKey: process.env.PARALLEL_API_KEY, }), diff --git a/packages/core/test/effect/cross-spawn-spawner.test.ts b/packages/core/test/effect/cross-spawn-spawner.test.ts index fc4e3db6a9..06fcb1d7a3 100644 --- a/packages/core/test/effect/cross-spawn-spawner.test.ts +++ b/packages/core/test/effect/cross-spawn-spawner.test.ts @@ -384,14 +384,14 @@ describe("cross-spawn spawner", () => { const out = yield* ChildProcessSpawner.ChildProcessSpawner.use((svc) => svc.string( - ChildProcess.make("set", ["OPENCODE_TEST_SHELL"], { + ChildProcess.make("set", ["CODEV_TEST_SHELL"], { shell: true, extendEnv: true, - env: { OPENCODE_TEST_SHELL: "ok" }, + env: { CODEV_TEST_SHELL: "ok" }, }), ), ) - expect(out).toContain("OPENCODE_TEST_SHELL=ok") + expect(out).toContain("CODEV_TEST_SHELL=ok") }), ) diff --git a/packages/core/test/effect/observability.test.ts b/packages/core/test/effect/observability.test.ts index 4758563f28..242046a0a2 100644 --- a/packages/core/test/effect/observability.test.ts +++ b/packages/core/test/effect/observability.test.ts @@ -8,14 +8,14 @@ import { fileLogger } from "../../src/observability/logging" import { resource } from "../../src/observability/otlp" const otelResourceAttributes = process.env.OTEL_RESOURCE_ATTRIBUTES -const opencodeClient = process.env.OPENCODE_CLIENT +const opencodeClient = process.env.CODEV_CLIENT afterEach(() => { if (otelResourceAttributes === undefined) delete process.env.OTEL_RESOURCE_ATTRIBUTES else process.env.OTEL_RESOURCE_ATTRIBUTES = otelResourceAttributes - if (opencodeClient === undefined) delete process.env.OPENCODE_CLIENT - else process.env.OPENCODE_CLIENT = opencodeClient + if (opencodeClient === undefined) delete process.env.CODEV_CLIENT + else process.env.CODEV_CLIENT = opencodeClient }) describe("resource", () => { @@ -39,7 +39,7 @@ describe("resource", () => { }) test("keeps built-in attributes when env values conflict", () => { - process.env.OPENCODE_CLIENT = "cli" + process.env.CODEV_CLIENT = "cli" process.env.OTEL_RESOURCE_ATTRIBUTES = "opencode.client=web,service.instance.id=override,service.namespace=anomalyco" diff --git a/packages/core/test/filesystem/watcher.test.ts b/packages/core/test/filesystem/watcher.test.ts index 0a287ea010..110f77c683 100644 --- a/packages/core/test/filesystem/watcher.test.ts +++ b/packages/core/test/filesystem/watcher.test.ts @@ -30,8 +30,8 @@ const configLayer = Layer.succeed( const flagsLayer = ConfigProvider.layer( ConfigProvider.fromUnknown({ - OPENCODE_EXPERIMENTAL_FILEWATCHER: "true", - OPENCODE_EXPERIMENTAL_DISABLE_FILEWATCHER: "false", + CODEV_EXPERIMENTAL_FILEWATCHER: "true", + CODEV_EXPERIMENTAL_DISABLE_FILEWATCHER: "false", }), ) diff --git a/packages/core/test/instruction-context.test.ts b/packages/core/test/instruction-context.test.ts index 0a61ede3f0..5524750660 100644 --- a/packages/core/test/instruction-context.test.ts +++ b/packages/core/test/instruction-context.test.ts @@ -257,9 +257,9 @@ describe("InstructionContext", () => { it.effect("honors the project instruction opt-out", () => Effect.gen(function* () { - const previous = process.env.OPENCODE_DISABLE_PROJECT_CONFIG + const previous = process.env.CODEV_DISABLE_PROJECT_CONFIG let scanned = false - process.env.OPENCODE_DISABLE_PROJECT_CONFIG = "1" + process.env.CODEV_DISABLE_PROJECT_CONFIG = "1" yield* SystemContextRegistry.Service.pipe( Effect.flatMap((service) => service.load()), @@ -280,8 +280,8 @@ describe("InstructionContext", () => { ), Effect.ensuring( Effect.sync(() => { - if (previous === undefined) delete process.env.OPENCODE_DISABLE_PROJECT_CONFIG - else process.env.OPENCODE_DISABLE_PROJECT_CONFIG = previous + if (previous === undefined) delete process.env.CODEV_DISABLE_PROJECT_CONFIG + else process.env.CODEV_DISABLE_PROJECT_CONFIG = previous }), ), ) diff --git a/packages/core/test/models.test.ts b/packages/core/test/models.test.ts index a3ed86dc8c..1a9784a0e9 100644 --- a/packages/core/test/models.test.ts +++ b/packages/core/test/models.test.ts @@ -11,20 +11,20 @@ import { it } from "./lib/effect" import { readFile, rm, writeFile, utimes, mkdir } from "fs/promises" import path from "path" -// test/preload.ts pins OPENCODE_MODELS_PATH to a fixture so other tests can +// test/preload.ts pins CODEV_MODELS_PATH to a fixture so other tests can // resolve providers without network. These tests need to drive the on-disk // cache themselves and silence the eager refresh fork. Save/restore around // the suite — never leak the mutation to subsequent test files in the same // bun process. -const ORIGINAL_MODELS_PATH = Flag.OPENCODE_MODELS_PATH -const ORIGINAL_DISABLE_FETCH = Flag.OPENCODE_DISABLE_MODELS_FETCH +const ORIGINAL_MODELS_PATH = Flag.CODEV_MODELS_PATH +const ORIGINAL_DISABLE_FETCH = Flag.CODEV_DISABLE_MODELS_FETCH beforeAll(() => { - Flag.OPENCODE_MODELS_PATH = undefined - Flag.OPENCODE_DISABLE_MODELS_FETCH = true + Flag.CODEV_MODELS_PATH = undefined + Flag.CODEV_DISABLE_MODELS_FETCH = true }) afterAll(() => { - Flag.OPENCODE_MODELS_PATH = ORIGINAL_MODELS_PATH - Flag.OPENCODE_DISABLE_MODELS_FETCH = ORIGINAL_DISABLE_FETCH + Flag.CODEV_MODELS_PATH = ORIGINAL_MODELS_PATH + Flag.CODEV_DISABLE_MODELS_FETCH = ORIGINAL_DISABLE_FETCH }) const cacheFile = path.join(Global.Path.cache, "models.json") @@ -161,12 +161,12 @@ describe("ModelsDev Service", () => { const context = yield* Layer.build(buildLayer(state)) const result = yield* Effect.acquireUseRelease( Effect.sync(() => { - Flag.OPENCODE_DISABLE_MODELS_FETCH = false + Flag.CODEV_DISABLE_MODELS_FETCH = false }), () => ModelsDev.Service.use((s) => s.get()).pipe(Effect.provide(context)), () => Effect.sync(() => { - Flag.OPENCODE_DISABLE_MODELS_FETCH = true + Flag.CODEV_DISABLE_MODELS_FETCH = true }), ) expect(result).toEqual(fixture2) diff --git a/packages/core/test/plugin/models-dev.test.ts b/packages/core/test/plugin/models-dev.test.ts index 6c0f7e0702..f1bd1df688 100644 --- a/packages/core/test/plugin/models-dev.test.ts +++ b/packages/core/test/plugin/models-dev.test.ts @@ -128,11 +128,11 @@ describe("ModelsDevPlugin", () => { Effect.acquireUseRelease( Effect.sync(() => { const previous = { - path: Flag.OPENCODE_MODELS_PATH, - disabled: Flag.OPENCODE_DISABLE_MODELS_FETCH, + path: Flag.CODEV_MODELS_PATH, + disabled: Flag.CODEV_DISABLE_MODELS_FETCH, } - Flag.OPENCODE_MODELS_PATH = path.join(import.meta.dir, "fixtures", "models-dev.json") - Flag.OPENCODE_DISABLE_MODELS_FETCH = true + Flag.CODEV_MODELS_PATH = path.join(import.meta.dir, "fixtures", "models-dev.json") + Flag.CODEV_DISABLE_MODELS_FETCH = true return previous }), () => @@ -162,8 +162,8 @@ describe("ModelsDevPlugin", () => { }).pipe(Effect.provide(AppNodeBuilder.build(ModelsDev.node))), (previous) => Effect.sync(() => { - Flag.OPENCODE_MODELS_PATH = previous.path - Flag.OPENCODE_DISABLE_MODELS_FETCH = previous.disabled + Flag.CODEV_MODELS_PATH = previous.path + Flag.CODEV_DISABLE_MODELS_FETCH = previous.disabled }), ), ) diff --git a/packages/core/test/plugin/provider-opencode.test.ts b/packages/core/test/plugin/provider-opencode.test.ts index 20af84d02f..c734c904ba 100644 --- a/packages/core/test/plugin/provider-opencode.test.ts +++ b/packages/core/test/plugin/provider-opencode.test.ts @@ -198,7 +198,7 @@ describe("OpencodePlugin", () => { ) it.effect("uses a public key and disables paid models without credentials", () => - withEnv({ OPENCODE_API_KEY: undefined }, () => + withEnv({ CODEV_API_KEY: undefined }, () => Effect.gen(function* () { const catalog = yield* Catalog.Service yield* catalog.transform((catalog) => { @@ -224,7 +224,7 @@ describe("OpencodePlugin", () => { ) it.effect("keeps free models without credentials", () => - withEnv({ OPENCODE_API_KEY: undefined }, () => + withEnv({ CODEV_API_KEY: undefined }, () => Effect.gen(function* () { const catalog = yield* Catalog.Service yield* catalog.transform((catalog) => { @@ -250,7 +250,7 @@ describe("OpencodePlugin", () => { ) it.effect("treats output-only cost as free without credentials", () => - withEnv({ OPENCODE_API_KEY: undefined }, () => + withEnv({ CODEV_API_KEY: undefined }, () => Effect.gen(function* () { const catalog = yield* Catalog.Service yield* catalog.transform((catalog) => { @@ -277,8 +277,8 @@ describe("OpencodePlugin", () => { ), ) - it.effect("uses OPENCODE_API_KEY as credentials", () => - withEnv({ OPENCODE_API_KEY: "secret" }, () => + it.effect("uses CODEV_API_KEY as credentials", () => + withEnv({ CODEV_API_KEY: "secret" }, () => Effect.gen(function* () { const catalog = yield* Catalog.Service yield* catalog.transform((catalog) => { @@ -304,14 +304,14 @@ describe("OpencodePlugin", () => { ) it.effect("uses configured provider env vars as credentials", () => - withEnv({ OPENCODE_API_KEY: undefined, CUSTOM_OPENCODE_API_KEY: "secret" }, () => + withEnv({ CODEV_API_KEY: undefined, CUSTOM_CODEV_API_KEY: "secret" }, () => Effect.gen(function* () { const catalog = yield* Catalog.Service const integrations = yield* Integration.Service yield* integrations.transform((editor) => { editor.method.update({ integrationID: Integration.ID.make("opencode"), - method: { type: "env", names: ["CUSTOM_OPENCODE_API_KEY"] }, + method: { type: "env", names: ["CUSTOM_CODEV_API_KEY"] }, }) }) yield* catalog.transform((catalog) => { @@ -337,7 +337,7 @@ describe("OpencodePlugin", () => { ) it.effect("uses configured apiKey as credentials", () => - withEnv({ OPENCODE_API_KEY: undefined }, () => + withEnv({ CODEV_API_KEY: undefined }, () => Effect.gen(function* () { const catalog = yield* Catalog.Service yield* catalog.transform((catalog) => { @@ -369,7 +369,7 @@ describe("OpencodePlugin", () => { ) it.effect("ignores non-opencode providers and models", () => - withEnv({ OPENCODE_API_KEY: undefined }, () => + withEnv({ CODEV_API_KEY: undefined }, () => Effect.gen(function* () { const catalog = yield* Catalog.Service yield* catalog.transform((catalog) => { diff --git a/packages/core/test/preload.ts b/packages/core/test/preload.ts index 39b237d70a..9ff0a6e455 100644 --- a/packages/core/test/preload.ts +++ b/packages/core/test/preload.ts @@ -1,5 +1,5 @@ import path from "path" -process.env.OPENCODE_DB = ":memory:" -process.env.OPENCODE_MODELS_PATH = path.join(import.meta.dir, "plugin", "fixtures", "models-dev.json") -process.env.OPENCODE_DISABLE_MODELS_FETCH = "true" +process.env.CODEV_DB = ":memory:" +process.env.CODEV_MODELS_PATH = path.join(import.meta.dir, "plugin", "fixtures", "models-dev.json") +process.env.CODEV_DISABLE_MODELS_FETCH = "true" diff --git a/packages/core/test/pty/pty-session.test.ts b/packages/core/test/pty/pty-session.test.ts index 6d049b49ae..b8889f7838 100644 --- a/packages/core/test/pty/pty-session.test.ts +++ b/packages/core/test/pty/pty-session.test.ts @@ -45,7 +45,7 @@ const subscribePtyEvents = Effect.fn("PtySessionTest.subscribePtyEvents")(functi const createPty = Effect.fn("PtySessionTest.createPty")(function* (command: string, args: string[] = []) { const pty = yield* Pty.Service return yield* Effect.acquireRelease( - pty.create({ command, args, cwd: "/tmp", env: { TERM: "xterm-256color", OPENCODE_TERMINAL: "1" } }), + pty.create({ command, args, cwd: "/tmp", env: { TERM: "xterm-256color", CODEV_TERMINAL: "1" } }), (info) => pty.remove(info.id).pipe(Effect.ignore), ) }) diff --git a/packages/desktop/electron-builder.config.test.ts b/packages/desktop/electron-builder.config.test.ts index eee2b825cb..5a57b30856 100644 --- a/packages/desktop/electron-builder.config.test.ts +++ b/packages/desktop/electron-builder.config.test.ts @@ -11,14 +11,14 @@ const channels = [ for (const channel of channels) { test(`uses one Linux desktop identity for ${channel.channel}`, async () => { - const previous = process.env.OPENCODE_CHANNEL - process.env.OPENCODE_CHANNEL = channel.channel + const previous = process.env.CODEV_CHANNEL + process.env.CODEV_CHANNEL = channel.channel const module = await import(`./electron-builder.config.ts?channel=${channel.channel}`) const config = module.default as Configuration - if (previous === undefined) delete process.env.OPENCODE_CHANNEL - else process.env.OPENCODE_CHANNEL = previous + if (previous === undefined) delete process.env.CODEV_CHANNEL + else process.env.CODEV_CHANNEL = previous expect(config.appId).toBe(channel.appId) expect(config.extraMetadata?.desktopName).toBe(`${channel.appId}.desktop`) @@ -28,14 +28,14 @@ for (const channel of channels) { } test("keeps a hidden prod launcher for old Linux pins", async () => { - const previous = process.env.OPENCODE_CHANNEL - process.env.OPENCODE_CHANNEL = "prod" + const previous = process.env.CODEV_CHANNEL + process.env.CODEV_CHANNEL = "prod" const module = await import("./electron-builder.config.ts?compat=prod") const config = module.default as Configuration - if (previous === undefined) delete process.env.OPENCODE_CHANNEL - else process.env.OPENCODE_CHANNEL = previous + if (previous === undefined) delete process.env.CODEV_CHANNEL + else process.env.CODEV_CHANNEL = previous expect(config.deb?.fpm?.[0]).toEndWith(`${legacyDesktopEntry}=/usr/share/applications/opencode-desktop.desktop`) expect(config.rpm?.fpm?.[0]).toEndWith(`${legacyDesktopEntry}=/usr/share/applications/opencode-desktop.desktop`) diff --git a/packages/desktop/electron-builder.config.ts b/packages/desktop/electron-builder.config.ts index 3ef10ba206..af7adbc221 100644 --- a/packages/desktop/electron-builder.config.ts +++ b/packages/desktop/electron-builder.config.ts @@ -27,7 +27,7 @@ async function signWindows(configuration: { path: string }) { } const channel = (() => { - const raw = process.env.OPENCODE_CHANNEL + const raw = process.env.CODEV_CHANNEL if (raw === "dev" || raw === "beta" || raw === "prod") return raw return "dev" })() diff --git a/packages/desktop/electron.vite.config.ts b/packages/desktop/electron.vite.config.ts index 5d25be209e..15bd30a5bc 100644 --- a/packages/desktop/electron.vite.config.ts +++ b/packages/desktop/electron.vite.config.ts @@ -3,12 +3,12 @@ import { defineConfig } from "electron-vite" import appPlugin from "@opencode-ai/app/vite" import * as fs from "node:fs/promises" -const OPENCODE_SERVER_DIST = "../opencode/dist/node" +const CODEV_SERVER_DIST = "../opencode/dist/node" const channel = (() => { - const raw = process.env.OPENCODE_CHANNEL + const raw = process.env.CODEV_CHANNEL if (raw === "dev" || raw === "beta" || raw === "prod") return raw - if (process.env.OPENCODE_CHANNEL === "latest") return "prod" + if (process.env.CODEV_CHANNEL === "latest") return "prod" return "dev" })() @@ -34,7 +34,7 @@ const sentry = export default defineConfig({ main: { define: { - "import.meta.env.OPENCODE_CHANNEL": JSON.stringify(channel), + "import.meta.env.CODEV_CHANNEL": JSON.stringify(channel), }, build: { rollupOptions: { @@ -65,15 +65,15 @@ const require = __cjs_mod__.createRequire(import.meta.url); name: "opencode:virtual-server-module", enforce: "pre", resolveId(id) { - if (id === "virtual:opencode-server") return this.resolve(`${OPENCODE_SERVER_DIST}/node.js`) + if (id === "virtual:opencode-server") return this.resolve(`${CODEV_SERVER_DIST}/node.js`) }, }, { name: "opencode:copy-server-assets", async writeBundle() { - for (const l of await fs.readdir(OPENCODE_SERVER_DIST)) { + for (const l of await fs.readdir(CODEV_SERVER_DIST)) { if (!l.endsWith(".wasm")) continue - await fs.writeFile(`./out/main/chunks/${l}`, await fs.readFile(`${OPENCODE_SERVER_DIST}/${l}`)) + await fs.writeFile(`./out/main/chunks/${l}`, await fs.readFile(`${CODEV_SERVER_DIST}/${l}`)) } }, }, diff --git a/packages/desktop/scripts/finalize-latest-json.ts b/packages/desktop/scripts/finalize-latest-json.ts index cb0f26b94d..5c4af23ed6 100644 --- a/packages/desktop/scripts/finalize-latest-json.ts +++ b/packages/desktop/scripts/finalize-latest-json.ts @@ -16,11 +16,11 @@ const dryRun = values["dry-run"] const repo = process.env.GH_REPO if (!repo) throw new Error("GH_REPO is required") -const releaseId = process.env.OPENCODE_RELEASE -if (!releaseId) throw new Error("OPENCODE_RELEASE is required") +const releaseId = process.env.CODEV_RELEASE +if (!releaseId) throw new Error("CODEV_RELEASE is required") -const version = process.env.OPENCODE_VERSION -if (!version) throw new Error("OPENCODE_VERSION is required") +const version = process.env.CODEV_VERSION +if (!version) throw new Error("CODEV_VERSION is required") const dir = process.env.LATEST_YML_DIR if (!dir) throw new Error("LATEST_YML_DIR is required") diff --git a/packages/desktop/scripts/finalize-latest-yml.ts b/packages/desktop/scripts/finalize-latest-yml.ts index aa2ae5c96e..8f13bf29e4 100644 --- a/packages/desktop/scripts/finalize-latest-yml.ts +++ b/packages/desktop/scripts/finalize-latest-yml.ts @@ -9,8 +9,8 @@ if (!dir) throw new Error("LATEST_YML_DIR is required") const repo = process.env.GH_REPO if (!repo) throw new Error("GH_REPO is required") -const version = process.env.OPENCODE_VERSION -if (!version) throw new Error("OPENCODE_VERSION is required") +const version = process.env.CODEV_VERSION +if (!version) throw new Error("CODEV_VERSION is required") type FileEntry = { url: string diff --git a/packages/desktop/scripts/predev.ts b/packages/desktop/scripts/predev.ts index 37c31d7eed..4f0d3340ff 100644 --- a/packages/desktop/scripts/predev.ts +++ b/packages/desktop/scripts/predev.ts @@ -1,5 +1,5 @@ import { $ } from "bun" -await $`bun ./scripts/copy-icons.ts ${process.env.OPENCODE_CHANNEL ?? "dev"}` +await $`bun ./scripts/copy-icons.ts ${process.env.CODEV_CHANNEL ?? "dev"}` await $`cd ../opencode && bun script/build-node.ts` diff --git a/packages/desktop/scripts/utils.ts b/packages/desktop/scripts/utils.ts index 19b96b0a16..dc2284dfab 100644 --- a/packages/desktop/scripts/utils.ts +++ b/packages/desktop/scripts/utils.ts @@ -3,7 +3,7 @@ import { $ } from "bun" export type Channel = "dev" | "beta" | "prod" export function resolveChannel(): Channel { - const raw = Bun.env.OPENCODE_CHANNEL + const raw = Bun.env.CODEV_CHANNEL if (raw === "dev" || raw === "beta" || raw === "prod") return raw return "dev" } diff --git a/packages/desktop/src/main/constants.ts b/packages/desktop/src/main/constants.ts index 258deb7c6d..cedb4209ee 100644 --- a/packages/desktop/src/main/constants.ts +++ b/packages/desktop/src/main/constants.ts @@ -1,7 +1,7 @@ import { app } from "electron" type Channel = "dev" | "beta" | "prod" -const raw = import.meta.env.OPENCODE_CHANNEL +const raw = import.meta.env.CODEV_CHANNEL export const CHANNEL: Channel = raw === "dev" || raw === "beta" || raw === "prod" ? raw : "dev" export const UPDATER_ENABLED = app.isPackaged && CHANNEL !== "dev" diff --git a/packages/desktop/src/main/env.d.ts b/packages/desktop/src/main/env.d.ts index d69e6feec2..f436dbb292 100644 --- a/packages/desktop/src/main/env.d.ts +++ b/packages/desktop/src/main/env.d.ts @@ -1,5 +1,5 @@ interface ImportMetaEnv { - readonly OPENCODE_CHANNEL: string + readonly CODEV_CHANNEL: string } interface ImportMeta { diff --git a/packages/desktop/src/main/index.ts b/packages/desktop/src/main/index.ts index f378bc043f..e33fbfbbb3 100644 --- a/packages/desktop/src/main/index.ts +++ b/packages/desktop/src/main/index.ts @@ -53,7 +53,7 @@ const APP_IDS: Record = { beta: "ai.opencode.desktop.beta", prod: "ai.opencode.desktop", } -const TEST_ONBOARDING = process.env.OPENCODE_TEST_ONBOARDING === "1" +const TEST_ONBOARDING = process.env.CODEV_TEST_ONBOARDING === "1" const jsCallStackFeature = "DocumentPolicyIncludeJSCallStacksInCrashReports" let logger: ReturnType @@ -112,7 +112,7 @@ const main = Effect.gen(function* () { process.chdir(homedir()) } catch {} - process.env.OPENCODE_DISABLE_EMBEDDED_WEB_UI = "true" + process.env.CODEV_DISABLE_EMBEDDED_WEB_UI = "true" const appId = app.isPackaged ? APP_IDS[CHANNEL] : "ai.opencode.desktop.dev" const onboardingTestRoot = ((): string | undefined => { @@ -123,7 +123,7 @@ const main = Effect.gen(function* () { ;["data", "config", "cache", "state", "desktop", "session"].forEach((dir) => mkdirSync(join(root, dir), { recursive: true }), ) - process.env.OPENCODE_DB = ":memory:" + process.env.CODEV_DB = ":memory:" process.env.XDG_DATA_HOME = join(root, "data") process.env.XDG_CONFIG_HOME = join(root, "config") process.env.XDG_CACHE_HOME = join(root, "cache") @@ -305,7 +305,7 @@ const main = Effect.gen(function* () { ) const port = yield* Effect.gen(function* () { - const fromEnv = process.env.OPENCODE_PORT + const fromEnv = process.env.CODEV_PORT if (fromEnv) { const parsed = Number.parseInt(fromEnv, 10) if (!Number.isNaN(parsed)) return parsed diff --git a/packages/desktop/src/main/server.ts b/packages/desktop/src/main/server.ts index b213dbc82a..92849f80f0 100644 --- a/packages/desktop/src/main/server.ts +++ b/packages/desktop/src/main/server.ts @@ -45,9 +45,9 @@ export function preferAppEnv(userDataPath: string) { const shell = process.platform === "win32" ? null : getUserShell() Object.assign(process.env, { ...(shell ? loadShellEnv(shell, getLogger()) : null), - OPENCODE_EXPERIMENTAL_ICON_DISCOVERY: "true", - OPENCODE_EXPERIMENTAL_FILEWATCHER: "true", - OPENCODE_CLIENT: "desktop", + CODEV_EXPERIMENTAL_ICON_DISCOVERY: "true", + CODEV_EXPERIMENTAL_FILEWATCHER: "true", + CODEV_CLIENT: "desktop", XDG_STATE_HOME: process.env.XDG_STATE_HOME ?? userDataPath, }) } @@ -213,7 +213,7 @@ function createSidecarEnv(): Record { ) delete env.DEBUG if (process.platform === "linux") delete env.LD_PRELOAD - if (!app.isPackaged) env.OPENCODE_DISABLE_CHANNEL_DB = "1" + if (!app.isPackaged) env.CODEV_DISABLE_CHANNEL_DB = "1" return env } diff --git a/packages/desktop/src/main/shell-env.test.ts b/packages/desktop/src/main/shell-env.test.ts index e71708ad04..f833804de7 100644 --- a/packages/desktop/src/main/shell-env.test.ts +++ b/packages/desktop/src/main/shell-env.test.ts @@ -25,13 +25,13 @@ describe("shell env", () => { }, { PATH: "/desktop/path", - OPENCODE_CLIENT: "desktop", + CODEV_CLIENT: "desktop", }, ) expect(env.PATH).toBe("/desktop/path") expect(env.HOME).toBe("/tmp/home") - expect(env.OPENCODE_CLIENT).toBe("desktop") + expect(env.CODEV_CLIENT).toBe("desktop") }) test("resolveUserShell falls back to the login shell before /bin/sh", () => { diff --git a/packages/desktop/src/main/sidecar.ts b/packages/desktop/src/main/sidecar.ts index 246871fb2b..b6dd322c2b 100644 --- a/packages/desktop/src/main/sidecar.ts +++ b/packages/desktop/src/main/sidecar.ts @@ -82,8 +82,8 @@ async function stop() { function prepareSidecarEnv(password: string, userDataPath: string) { Object.assign(process.env, { - OPENCODE_SERVER_USERNAME: "opencode", - OPENCODE_SERVER_PASSWORD: password, + CODEV_SERVER_USERNAME: "opencode", + CODEV_SERVER_PASSWORD: password, XDG_STATE_HOME: process.env.XDG_STATE_HOME ?? userDataPath, }) } diff --git a/packages/desktop/src/main/wsl/sidecar.ts b/packages/desktop/src/main/wsl/sidecar.ts index 522e575a47..ea365119ff 100644 --- a/packages/desktop/src/main/wsl/sidecar.ts +++ b/packages/desktop/src/main/wsl/sidecar.ts @@ -29,10 +29,10 @@ export async function spawnWslSidecar( 'PATH=$(awk -v RS=: -v ORS=: \'$0 !~ /^\\/mnt\\//\' <<<"$PATH" | sed "s/:$//")', "export PATH", "export WSLENV=", - "export OPENCODE_EXPERIMENTAL_DISABLE_FILEWATCHER=true", - "export OPENCODE_CLIENT=desktop", - `export OPENCODE_SERVER_USERNAME=${shellEscape(username)}`, - `export OPENCODE_SERVER_PASSWORD=${shellEscape(password)}`, + "export CODEV_EXPERIMENTAL_DISABLE_FILEWATCHER=true", + "export CODEV_CLIENT=desktop", + `export CODEV_SERVER_USERNAME=${shellEscape(username)}`, + `export CODEV_SERVER_PASSWORD=${shellEscape(password)}`, 'export XDG_STATE_HOME="$HOME/.local/state"', `exec ${shellEscape(opencode)} --print-logs --log-level ${app.isPackaged ? "WARN" : "INFO"} serve --hostname 0.0.0.0 --port ${port}`, ].join("\n") diff --git a/packages/desktop/src/renderer/index.tsx b/packages/desktop/src/renderer/index.tsx index 966fb0c0bf..5e21311b8c 100644 --- a/packages/desktop/src/renderer/index.tsx +++ b/packages/desktop/src/renderer/index.tsx @@ -50,7 +50,7 @@ if (import.meta.env.VITE_SENTRY_DSN) { (i) => i.name !== "Breadcrumbs" && !( - import.meta.env.OPENCODE_CHANNEL === "prod" && + import.meta.env.CODEV_CHANNEL === "prod" && (i.name === "GlobalHandlers" || i.name === "BrowserApiErrors") ), ) diff --git a/packages/enterprise/package.json b/packages/enterprise/package.json index 80aa77e490..bfeefc0ec8 100644 --- a/packages/enterprise/package.json +++ b/packages/enterprise/package.json @@ -8,7 +8,7 @@ "typecheck": "tsgo --noEmit", "dev": "vite dev", "build": "vite build", - "build:cloudflare": "OPENCODE_DEPLOYMENT_TARGET=cloudflare vite build", + "build:cloudflare": "CODEV_DEPLOYMENT_TARGET=cloudflare vite build", "start": "vite start", "shell-prod": "sst shell --target Teams --stage production" }, diff --git a/packages/enterprise/src/core/storage.ts b/packages/enterprise/src/core/storage.ts index 58d61aca78..29c8b9386c 100644 --- a/packages/enterprise/src/core/storage.ts +++ b/packages/enterprise/src/core/storage.ts @@ -64,27 +64,27 @@ export namespace Storage { } function s3(): Adapter { - const bucket = process.env.OPENCODE_STORAGE_BUCKET! - const region = process.env.OPENCODE_STORAGE_REGION || "us-east-1" + const bucket = process.env.CODEV_STORAGE_BUCKET! + const region = process.env.CODEV_STORAGE_REGION || "us-east-1" const client = new AwsClient({ region, - accessKeyId: process.env.OPENCODE_STORAGE_ACCESS_KEY_ID!, - secretAccessKey: process.env.OPENCODE_STORAGE_SECRET_ACCESS_KEY!, + accessKeyId: process.env.CODEV_STORAGE_ACCESS_KEY_ID!, + secretAccessKey: process.env.CODEV_STORAGE_SECRET_ACCESS_KEY!, }) return createAdapter(client, `https://s3.${region}.amazonaws.com`, bucket) } function r2() { - const accountId = process.env.OPENCODE_STORAGE_ACCOUNT_ID! + const accountId = process.env.CODEV_STORAGE_ACCOUNT_ID! const client = new AwsClient({ - accessKeyId: process.env.OPENCODE_STORAGE_ACCESS_KEY_ID!, - secretAccessKey: process.env.OPENCODE_STORAGE_SECRET_ACCESS_KEY!, + accessKeyId: process.env.CODEV_STORAGE_ACCESS_KEY_ID!, + secretAccessKey: process.env.CODEV_STORAGE_SECRET_ACCESS_KEY!, }) - return createAdapter(client, `https://${accountId}.r2.cloudflarestorage.com`, process.env.OPENCODE_STORAGE_BUCKET!) + return createAdapter(client, `https://${accountId}.r2.cloudflarestorage.com`, process.env.CODEV_STORAGE_BUCKET!) } const adapter = lazy(() => { - const type = process.env.OPENCODE_STORAGE_ADAPTER + const type = process.env.CODEV_STORAGE_ADAPTER if (type === "r2") return r2() if (type === "s3") return s3() throw new Error("No storage adapter configured") diff --git a/packages/enterprise/vite.config.ts b/packages/enterprise/vite.config.ts index 90f4665c59..deb04ccf0b 100644 --- a/packages/enterprise/vite.config.ts +++ b/packages/enterprise/vite.config.ts @@ -4,7 +4,7 @@ import { nitro } from "nitro/vite" import tailwindcss from "@tailwindcss/vite" const nitroConfig: any = (() => { - const target = process.env.OPENCODE_DEPLOYMENT_TARGET + const target = process.env.CODEV_DEPLOYMENT_TARGET if (target === "cloudflare") { return { compatibilityDate: "2024-09-19", @@ -23,7 +23,7 @@ export default defineConfig({ solidStart() as PluginOption, nitro({ ...nitroConfig, - baseURL: process.env.OPENCODE_BASE_URL, + baseURL: process.env.CODEV_BASE_URL, }), ], server: { diff --git a/packages/opencode/bin/opencode b/packages/opencode/bin/opencode index e4c0214e3e..00ab21ccd0 100755 --- a/packages/opencode/bin/opencode +++ b/packages/opencode/bin/opencode @@ -43,7 +43,7 @@ function run(target) { }) } -const envPath = process.env.OPENCODE_BIN_PATH +const envPath = process.env.CODEV_BIN_PATH const scriptPath = fs.realpathSync(__filename) const scriptDir = path.dirname(scriptPath) diff --git a/packages/opencode/script/build-node.ts b/packages/opencode/script/build-node.ts index e6a4171f70..5102230f4a 100755 --- a/packages/opencode/script/build-node.ts +++ b/packages/opencode/script/build-node.ts @@ -20,8 +20,8 @@ await Bun.build({ sourcemap: "linked", external: ["jsonc-parser", "@lydell/node-pty"], define: { - OPENCODE_MODELS_DEV: generated.modelsData, - OPENCODE_CHANNEL: `'${Script.channel}'`, + CODEV_MODELS_DEV: generated.modelsData, + CODEV_CHANNEL: `'${Script.channel}'`, }, files: { "opencode-web-ui.gen.ts": "", diff --git a/packages/opencode/script/build.ts b/packages/opencode/script/build.ts index 8dd53ca604..01c9240b3c 100755 --- a/packages/opencode/script/build.ts +++ b/packages/opencode/script/build.ts @@ -28,7 +28,7 @@ const createEmbeddedWebUIBundle = async () => { console.log(`Building Web UI to embed in the binary`) const appDir = path.join(import.meta.dirname, "../../app") const dist = path.join(appDir, "dist") - await $`OPENCODE_CHANNEL=${Script.channel} bun run --cwd ${appDir} build` + await $`CODEV_CHANNEL=${Script.channel} bun run --cwd ${appDir} build` const files = (await Array.fromAsync(new Bun.Glob("**/*").scan({ cwd: dist }))) .map((file) => file.replaceAll("\\", "/")) .filter((file) => !file.endsWith(".map")) @@ -188,12 +188,12 @@ for (const item of targets) { entrypoints: ["./src/index.ts", parserWorker, workerPath, ...(embeddedFileMap ? ["opencode-web-ui.gen.ts"] : [])], define: { FFF_LIBC: JSON.stringify(item.abi === "musl" ? "musl" : "gnu"), - OPENCODE_VERSION: `'${Script.version}'`, - OPENCODE_MODELS_DEV: generated.modelsData, + CODEV_VERSION: `'${Script.version}'`, + CODEV_MODELS_DEV: generated.modelsData, OTUI_TREE_SITTER_WORKER_PATH: bunfsRoot + workerRelativePath, - OPENCODE_WORKER_PATH: workerPath, - OPENCODE_CHANNEL: `'${Script.channel}'`, - OPENCODE_LIBC: item.os === "linux" ? `'${item.abi ?? "glibc"}'` : "", + CODEV_WORKER_PATH: workerPath, + CODEV_CHANNEL: `'${Script.channel}'`, + CODEV_LIBC: item.os === "linux" ? `'${item.abi ?? "glibc"}'` : "", ...(item.os === "linux" ? { "process.env.OPENTUI_LIBC": JSON.stringify(item.abi ?? "glibc") } : {}), }, }) diff --git a/packages/opencode/script/generate.ts b/packages/opencode/script/generate.ts index 91a2d30eb7..72907d2a57 100644 --- a/packages/opencode/script/generate.ts +++ b/packages/opencode/script/generate.ts @@ -7,7 +7,7 @@ const dir = path.resolve(__dirname, "..") process.chdir(dir) -const modelsUrl = process.env.OPENCODE_MODELS_URL || "https://models.dev" +const modelsUrl = process.env.CODEV_MODELS_URL || "https://models.dev" export const modelsData = process.env.MODELS_DEV_API_JSON ? await Bun.file(process.env.MODELS_DEV_API_JSON).text() : await fetch(`${modelsUrl}/api.json`).then((x) => x.text()) diff --git a/packages/opencode/script/release.ts b/packages/opencode/script/release.ts index 462f382dc5..01c7a91055 100644 --- a/packages/opencode/script/release.ts +++ b/packages/opencode/script/release.ts @@ -59,7 +59,7 @@ if ((await $`npm view codev-code@${version} version`.nothrow().quiet()).exitCode process.exit(1) } -const env = { ...process.env, OPENCODE_VERSION: version, OPENCODE_CHANNEL: channel } +const env = { ...process.env, CODEV_VERSION: version, CODEV_CHANNEL: channel } if (!skipBuild) await $`bun ${import.meta.dirname}/build.ts`.env(env) await $`bun ${import.meta.dirname}/publish.ts`.env(env) diff --git a/packages/opencode/specs/effect/todo.md b/packages/opencode/specs/effect/todo.md index 57760ab280..b024d6c198 100644 --- a/packages/opencode/specs/effect/todo.md +++ b/packages/opencode/specs/effect/todo.md @@ -207,7 +207,7 @@ Problems to reduce: - Importing the module creates directories. - Tests override `Global.Path` by mutating exported module state. - Most callers use `Global.Path` directly instead of the Effect service. -- `Global.make()` still reads mutable `Flag.OPENCODE_CONFIG_DIR`. +- `Global.make()` still reads mutable `Flag.CODEV_CONFIG_DIR`. Next PR candidates: diff --git a/packages/opencode/specs/tui-plugins.md b/packages/opencode/specs/tui-plugins.md index b6fcbbb7bc..831f46274e 100644 --- a/packages/opencode/specs/tui-plugins.md +++ b/packages/opencode/specs/tui-plugins.md @@ -213,7 +213,7 @@ npm plugins can declare a version compatibility range in `package.json` using th - There is no uninstall, list, or update CLI command for external plugins. - Local file plugins are configured directly in `tui.json`. -When `plugin` entries exist in a writable `.codev` dir or `OPENCODE_CONFIG_DIR`, OpenCode installs `@opencode-ai/plugin` into that dir and writes: +When `plugin` entries exist in a writable `.codev` dir or `CODEV_CONFIG_DIR`, OpenCode installs `@opencode-ai/plugin` into that dir and writes: - `package.json` - `bun.lock` @@ -483,7 +483,7 @@ Metadata is persisted by plugin id. - Internal TUI plugins load first. - External TUI plugins load from `tuiConfig.plugin`. -- `--pure` / `OPENCODE_PURE` skips external TUI plugins only. +- `--pure` / `CODEV_PURE` skips external TUI plugins only. - External plugin resolution and import are parallel. - Packages with no `./tui` entrypoint and valid `oc-themes` are loaded as synthetic no-op TUI plugin modules. - Theme-only packages loaded this way appear in `api.plugins.list()` and plugin manager rows like other external plugins. diff --git a/packages/opencode/src/acp/profile.ts b/packages/opencode/src/acp/profile.ts index 9e728b6a1a..9a5454224e 100644 --- a/packages/opencode/src/acp/profile.ts +++ b/packages/opencode/src/acp/profile.ts @@ -1,4 +1,4 @@ -const enabled = process.env.OPENCODE_ACP_PROFILE === "1" +const enabled = process.env.CODEV_ACP_PROFILE === "1" const started = performance.now() export function mark(name: string, fields?: Record) { diff --git a/packages/opencode/src/auth/index.ts b/packages/opencode/src/auth/index.ts index a133e88498..cefdcf9768 100644 --- a/packages/opencode/src/auth/index.ts +++ b/packages/opencode/src/auth/index.ts @@ -56,9 +56,9 @@ const layer = Layer.effect( const decode = Schema.decodeUnknownOption(Info) const all = Effect.fn("Auth.all")(function* () { - if (process.env.OPENCODE_AUTH_CONTENT) { + if (process.env.CODEV_AUTH_CONTENT) { try { - return JSON.parse(process.env.OPENCODE_AUTH_CONTENT) + return JSON.parse(process.env.CODEV_AUTH_CONTENT) } catch (err) {} } diff --git a/packages/opencode/src/cli/cmd/acp.ts b/packages/opencode/src/cli/cmd/acp.ts index da47d95795..33622ffa53 100644 --- a/packages/opencode/src/cli/cmd/acp.ts +++ b/packages/opencode/src/cli/cmd/acp.ts @@ -20,7 +20,7 @@ export const AcpCommand = effectCmd({ const { Server } = yield* Effect.promise(() => import("@/server/server")) const { ACP } = yield* Effect.promise(() => import("@/acp/agent")) ACPProfile.mark("cli.acp.handler") - process.env.OPENCODE_CLIENT = "acp" + process.env.CODEV_CLIENT = "acp" const opts = yield* resolveNetworkOptions(args) const server = yield* Effect.promise(() => ACPProfile.measure("cli.acp.server.listen", () => Server.listen(opts))) diff --git a/packages/opencode/src/cli/cmd/attach.ts b/packages/opencode/src/cli/cmd/attach.ts index d0219acf88..064c2817c6 100644 --- a/packages/opencode/src/cli/cmd/attach.ts +++ b/packages/opencode/src/cli/cmd/attach.ts @@ -35,12 +35,12 @@ export const AttachCommand = cmd({ .option("password", { alias: ["p"], type: "string", - describe: "basic auth password (defaults to OPENCODE_SERVER_PASSWORD)", + describe: "basic auth password (defaults to CODEV_SERVER_PASSWORD)", }) .option("username", { alias: ["u"], type: "string", - describe: "basic auth username (defaults to OPENCODE_SERVER_USERNAME or 'opencode')", + describe: "basic auth username (defaults to CODEV_SERVER_USERNAME or 'opencode')", }) .option("mini", { type: "boolean", diff --git a/packages/opencode/src/cli/cmd/debug/index.ts b/packages/opencode/src/cli/cmd/debug/index.ts index 9dcaa33b36..b61bf88552 100644 --- a/packages/opencode/src/cli/cmd/debug/index.ts +++ b/packages/opencode/src/cli/cmd/debug/index.ts @@ -62,7 +62,7 @@ const InfoCommand = effectCmd({ console.log(`os: ${os.type()} ${os.release()} ${os.arch()}`) console.log(`terminal: ${terminal || "unknown"}`) console.log("plugins:") - if (Flag.OPENCODE_PURE) { + if (Flag.CODEV_PURE) { console.log("external plugins disabled (--pure)") return } diff --git a/packages/opencode/src/cli/cmd/run.ts b/packages/opencode/src/cli/cmd/run.ts index 06903b3fe5..eba924eb32 100644 --- a/packages/opencode/src/cli/cmd/run.ts +++ b/packages/opencode/src/cli/cmd/run.ts @@ -194,12 +194,12 @@ export const RunCommand = effectCmd({ .option("password", { alias: ["p"], type: "string", - describe: "basic auth password (defaults to OPENCODE_SERVER_PASSWORD)", + describe: "basic auth password (defaults to CODEV_SERVER_PASSWORD)", }) .option("username", { alias: ["u"], type: "string", - describe: "basic auth username (defaults to OPENCODE_SERVER_USERNAME or 'opencode')", + describe: "basic auth username (defaults to CODEV_SERVER_USERNAME or 'opencode')", }) .option("dir", { type: "string", diff --git a/packages/opencode/src/cli/cmd/run/footer.prompt.tsx b/packages/opencode/src/cli/cmd/run/footer.prompt.tsx index 0280982d50..85531970a0 100644 --- a/packages/opencode/src/cli/cmd/run/footer.prompt.tsx +++ b/packages/opencode/src/cli/cmd/run/footer.prompt.tsx @@ -23,7 +23,7 @@ import { movePromptHistory, pushPromptHistory, } from "./prompt.shared" -import { OPENCODE_BASE_MODE, useBindings } from "@opencode-ai/tui/keymap" +import { CODEV_BASE_MODE, useBindings } from "@opencode-ai/tui/keymap" import { realignEditorPromptParts, resolveEditorSlashValue } from "./prompt.editor" import { FOOTER_MENU_ROWS, createFooterMenuState, type RunFooterMenuItem } from "./footer.menu" import type { RunFooterTheme } from "./theme" @@ -976,7 +976,7 @@ export function createPromptState(input: PromptInput): PromptState { } useBindings(() => ({ - mode: OPENCODE_BASE_MODE, + mode: CODEV_BASE_MODE, enabled: baseBindingsEnabled(), commands: [ { @@ -993,7 +993,7 @@ export function createPromptState(input: PromptInput): PromptState { })) useBindings(() => ({ - mode: OPENCODE_BASE_MODE, + mode: CODEV_BASE_MODE, enabled: input.prompt(), commands: [ { @@ -1010,7 +1010,7 @@ export function createPromptState(input: PromptInput): PromptState { })) useBindings(() => ({ - mode: OPENCODE_BASE_MODE, + mode: CODEV_BASE_MODE, enabled: input.prompt() && !visible(), commands: [ { @@ -1026,7 +1026,7 @@ export function createPromptState(input: PromptInput): PromptState { })) useBindings(() => ({ - mode: OPENCODE_BASE_MODE, + mode: CODEV_BASE_MODE, enabled: input.prompt() && !visible(), commands: [ { @@ -1053,7 +1053,7 @@ export function createPromptState(input: PromptInput): PromptState { })) useBindings(() => ({ - mode: OPENCODE_BASE_MODE, + mode: CODEV_BASE_MODE, enabled: input.prompt() && !visible(), bindings: [ { @@ -1071,7 +1071,7 @@ export function createPromptState(input: PromptInput): PromptState { })) useBindings(() => ({ - mode: OPENCODE_BASE_MODE, + mode: CODEV_BASE_MODE, enabled: input.prompt() && shell() && !visible(), bindings: [ { @@ -1094,7 +1094,7 @@ export function createPromptState(input: PromptInput): PromptState { })) useBindings(() => ({ - mode: OPENCODE_BASE_MODE, + mode: CODEV_BASE_MODE, enabled: input.prompt() && visible(), commands: [ { diff --git a/packages/opencode/src/cli/cmd/run/footer.view.tsx b/packages/opencode/src/cli/cmd/run/footer.view.tsx index 4b4c00f9a8..d334ebd251 100644 --- a/packages/opencode/src/cli/cmd/run/footer.view.tsx +++ b/packages/opencode/src/cli/cmd/run/footer.view.tsx @@ -28,7 +28,7 @@ import { RunPermissionBody } from "./footer.permission" import { RunQuestionBody } from "./footer.question" import { footerWidthPolicy } from "./footer.width" import { - OPENCODE_BASE_MODE, + CODEV_BASE_MODE, formatKeyBindings, formatKeySequence, useBindings, @@ -498,7 +498,7 @@ export function RunFooterView(props: RunFooterViewProps) { }) useBindings(() => ({ - mode: OPENCODE_BASE_MODE, + mode: CODEV_BASE_MODE, enabled: active().type === "prompt" && route().type === "composer" && !composer.visible(), commands: [ { @@ -521,7 +521,7 @@ export function RunFooterView(props: RunFooterViewProps) { })) useBindings(() => ({ - mode: OPENCODE_BASE_MODE, + mode: CODEV_BASE_MODE, enabled: active().type === "prompt" && route().type === "composer" && foregroundSubagents(), priority: 1, commands: [ @@ -536,7 +536,7 @@ export function RunFooterView(props: RunFooterViewProps) { })) useBindings(() => ({ - mode: OPENCODE_BASE_MODE, + mode: CODEV_BASE_MODE, enabled: active().type === "prompt" && route().type === "composer" && tabs().length > 0, commands: [ { @@ -550,7 +550,7 @@ export function RunFooterView(props: RunFooterViewProps) { })) useBindings(() => ({ - mode: OPENCODE_BASE_MODE, + mode: CODEV_BASE_MODE, enabled: active().type === "prompt" && route().type === "composer" && queuedPrompts().length > 0, commands: [ { diff --git a/packages/opencode/src/cli/cmd/run/runtime.ts b/packages/opencode/src/cli/cmd/run/runtime.ts index 90cddffa22..2de3105124 100644 --- a/packages/opencode/src/cli/cmd/run/runtime.ts +++ b/packages/opencode/src/cli/cmd/run/runtime.ts @@ -404,7 +404,7 @@ async function runInteractiveRuntime(input: RunRuntimeInput, deps: RunRuntimeDep .then(loadCatalog) .catch(() => {}) - if (Flag.OPENCODE_SHOW_TTFD) { + if (Flag.CODEV_SHOW_TTFD) { footer.append({ kind: "system", text: `startup ${Math.max(0, Math.round(performance.now() - start))}ms`, diff --git a/packages/opencode/src/cli/cmd/run/trace.ts b/packages/opencode/src/cli/cmd/run/trace.ts index 5ed220393b..6db6492698 100644 --- a/packages/opencode/src/cli/cmd/run/trace.ts +++ b/packages/opencode/src/cli/cmd/run/trace.ts @@ -1,6 +1,6 @@ // Dev-only JSONL event trace for direct interactive mode. // -// Enable with OPENCODE_DIRECT_TRACE=1. Writes one JSON line per event to +// Enable with CODEV_DIRECT_TRACE=1. Writes one JSON line per event to // ~/.local/share/opencode/log/direct/-.jsonl. Also writes // a latest.json pointer so you can quickly find the most recent trace. // @@ -55,7 +55,7 @@ export function trace(): Trace | undefined { return state || undefined } - if (!process.env.OPENCODE_DIRECT_TRACE) { + if (!process.env.CODEV_DIRECT_TRACE) { state = false return undefined } diff --git a/packages/opencode/src/cli/cmd/serve.ts b/packages/opencode/src/cli/cmd/serve.ts index 995fd53f9d..b818818955 100644 --- a/packages/opencode/src/cli/cmd/serve.ts +++ b/packages/opencode/src/cli/cmd/serve.ts @@ -12,8 +12,8 @@ export const ServeCommand = effectCmd({ instance: false, handler: Effect.fn("Cli.serve")(function* (args) { const { Server } = yield* Effect.promise(() => import("../../server/server")) - if (!Flag.OPENCODE_SERVER_PASSWORD) { - console.log("Warning: OPENCODE_SERVER_PASSWORD is not set; server is unsecured.") + if (!Flag.CODEV_SERVER_PASSWORD) { + console.log("Warning: CODEV_SERVER_PASSWORD is not set; server is unsecured.") } const opts = yield* resolveNetworkOptions(args) const server = yield* Effect.promise(() => Server.listen(opts)) diff --git a/packages/opencode/src/cli/cmd/session.ts b/packages/opencode/src/cli/cmd/session.ts index 9e6ddda9d2..a45025dc8f 100644 --- a/packages/opencode/src/cli/cmd/session.ts +++ b/packages/opencode/src/cli/cmd/session.ts @@ -26,8 +26,8 @@ function pagerCmd(): string[] { if (Filesystem.stat(lessOnPath)?.size) return [lessOnPath, ...lessOptions] } - if (Flag.OPENCODE_GIT_BASH_PATH) { - const less = path.join(Flag.OPENCODE_GIT_BASH_PATH, "..", "..", "usr", "bin", "less.exe") + if (Flag.CODEV_GIT_BASH_PATH) { + const less = path.join(Flag.CODEV_GIT_BASH_PATH, "..", "..", "usr", "bin", "less.exe") if (Filesystem.stat(less)?.size) return [less, ...lessOptions] } diff --git a/packages/opencode/src/cli/cmd/tui.ts b/packages/opencode/src/cli/cmd/tui.ts index 3194c6e712..6607c063ec 100644 --- a/packages/opencode/src/cli/cmd/tui.ts +++ b/packages/opencode/src/cli/cmd/tui.ts @@ -16,7 +16,7 @@ import { validateSession } from "../tui/validate-session" import { win32InstallCtrlCGuard } from "@opencode-ai/tui/terminal-win32" declare global { - const OPENCODE_WORKER_PATH: string + const CODEV_WORKER_PATH: string } type RpcClient = ReturnType> @@ -50,7 +50,7 @@ function createEventSource(client: RpcClient): EventSource { } async function target() { - if (typeof OPENCODE_WORKER_PATH !== "undefined") return OPENCODE_WORKER_PATH + if (typeof CODEV_WORKER_PATH !== "undefined") return CODEV_WORKER_PATH const dist = new URL("./cli/tui/worker.js", import.meta.url) if (await Filesystem.exists(fileURLToPath(dist))) return dist return new URL("../tui/worker.ts", import.meta.url) diff --git a/packages/opencode/src/cli/cmd/web.ts b/packages/opencode/src/cli/cmd/web.ts index 4483aa9942..7bfb87f76d 100644 --- a/packages/opencode/src/cli/cmd/web.ts +++ b/packages/opencode/src/cli/cmd/web.ts @@ -37,8 +37,8 @@ export const WebCommand = effectCmd({ instance: false, handler: Effect.fn("Cli.web")(function* (args) { const { Server } = yield* Effect.promise(() => import("../../server/server")) - if (!Flag.OPENCODE_SERVER_PASSWORD) { - UI.println(UI.Style.TEXT_WARNING_BOLD + "! OPENCODE_SERVER_PASSWORD is not set; server is unsecured.") + if (!Flag.CODEV_SERVER_PASSWORD) { + UI.println(UI.Style.TEXT_WARNING_BOLD + "! CODEV_SERVER_PASSWORD is not set; server is unsecured.") } const opts = yield* resolveNetworkOptions(args) const server = yield* Effect.promise(() => Server.listen(opts)) diff --git a/packages/opencode/src/cli/heap.ts b/packages/opencode/src/cli/heap.ts index e8ec8f1bd0..108477e275 100644 --- a/packages/opencode/src/cli/heap.ts +++ b/packages/opencode/src/cli/heap.ts @@ -10,7 +10,7 @@ let lock = false let armed = true export function start() { - if (!Flag.OPENCODE_AUTO_HEAP_SNAPSHOT) return + if (!Flag.CODEV_AUTO_HEAP_SNAPSHOT) return if (timer) return const run = async () => { diff --git a/packages/opencode/src/cli/upgrade.ts b/packages/opencode/src/cli/upgrade.ts index 62b230a633..707260e5e9 100644 --- a/packages/opencode/src/cli/upgrade.ts +++ b/packages/opencode/src/cli/upgrade.ts @@ -7,12 +7,12 @@ import { GlobalBus } from "@/bus/global" export async function upgrade() { const config = await AppRuntime.runPromise(Config.Service.use((cfg) => cfg.getGlobal())) - if (config.autoupdate === false || Flag.OPENCODE_DISABLE_AUTOUPDATE) return + if (config.autoupdate === false || Flag.CODEV_DISABLE_AUTOUPDATE) return const method = await Installation.method() const latest = await Installation.latest(method).catch(() => {}) if (!latest) return - if (Flag.OPENCODE_ALWAYS_NOTIFY_UPDATE) { + if (Flag.CODEV_ALWAYS_NOTIFY_UPDATE) { GlobalBus.emit("event", { directory: "global", payload: { diff --git a/packages/opencode/src/config/config.ts b/packages/opencode/src/config/config.ts index e9b6506d9f..b24daa2df0 100644 --- a/packages/opencode/src/config/config.ts +++ b/packages/opencode/src/config/config.ts @@ -245,7 +245,7 @@ const layer = Layer.effect( let result: Info = {} // Seed the default global config with the schema for editor completion, but avoid writing when the user // explicitly routes config through env-provided paths or content. - if (!Flag.OPENCODE_CONFIG && !Flag.OPENCODE_CONFIG_DIR && !Flag.OPENCODE_CONFIG_CONTENT) { + if (!Flag.CODEV_CONFIG && !Flag.CODEV_CONFIG_DIR && !Flag.CODEV_CONFIG_CONTENT) { const file = globalConfigFile() if (!existsSync(file)) { yield* fs @@ -302,7 +302,7 @@ const layer = Layer.effect( const pluginScopeForSource = Effect.fnUntraced(function* (source: string) { if (source.startsWith("http://") || source.startsWith("https://")) return "global" - if (source === "OPENCODE_CONFIG_CONTENT") return "local" + if (source === "CODEV_CONFIG_CONTENT") return "local" if (containsPath(source, ctx)) return "local" return "global" }) @@ -378,12 +378,12 @@ const layer = Layer.effect( const global = Object.keys(authEnv).length ? yield* loadGlobal(authEnv) : yield* getGlobal() yield* merge(Global.Path.config, global, "global") - if (Flag.OPENCODE_CONFIG) { - yield* merge(Flag.OPENCODE_CONFIG, yield* loadFile(Flag.OPENCODE_CONFIG, authEnv)) - yield* Effect.logDebug("loaded custom config", { path: Flag.OPENCODE_CONFIG }) + if (Flag.CODEV_CONFIG) { + yield* merge(Flag.CODEV_CONFIG, yield* loadFile(Flag.CODEV_CONFIG, authEnv)) + yield* Effect.logDebug("loaded custom config", { path: Flag.CODEV_CONFIG }) } - if (!Flag.OPENCODE_DISABLE_PROJECT_CONFIG) { + if (!Flag.CODEV_DISABLE_PROJECT_CONFIG) { for (const file of yield* ConfigPaths.files("codev", ctx.directory, ctx.worktree).pipe(Effect.orDie)) { yield* merge(file, yield* loadFile(file, authEnv), "local") } @@ -395,14 +395,14 @@ const layer = Layer.effect( const directories = yield* ConfigPaths.directories(ctx.directory, ctx.worktree) - if (Flag.OPENCODE_CONFIG_DIR) { - yield* Effect.logDebug("loading config from OPENCODE_CONFIG_DIR", { path: Flag.OPENCODE_CONFIG_DIR }) + if (Flag.CODEV_CONFIG_DIR) { + yield* Effect.logDebug("loading config from CODEV_CONFIG_DIR", { path: Flag.CODEV_CONFIG_DIR }) } const deps: Fiber.Fiber[] = [] for (const dir of directories) { - if (dir.endsWith(".codev") || dir === Flag.OPENCODE_CONFIG_DIR) { + if (dir.endsWith(".codev") || dir === Flag.CODEV_CONFIG_DIR) { for (const file of ["codev.json", "codev.jsonc"]) { const source = path.join(dir, file) yield* Effect.logDebug(`loading config from ${source}`) @@ -445,14 +445,14 @@ const layer = Layer.effect( yield* mergePluginOrigins(dir, list) } - if (process.env.OPENCODE_CONFIG_CONTENT) { - const source = "OPENCODE_CONFIG_CONTENT" - const next = yield* loadConfig(process.env.OPENCODE_CONFIG_CONTENT, { + if (process.env.CODEV_CONFIG_CONTENT) { + const source = "CODEV_CONFIG_CONTENT" + const next = yield* loadConfig(process.env.CODEV_CONFIG_CONTENT, { dir: ctx.directory, source, }) yield* merge(source, next, "local") - yield* Effect.logDebug("loaded custom config from OPENCODE_CONFIG_CONTENT") + yield* Effect.logDebug("loaded custom config from CODEV_CONFIG_CONTENT") } const activeAccount = Option.getOrUndefined( @@ -468,8 +468,8 @@ const layer = Layer.effect( { concurrency: 2 }, ) if (Option.isSome(tokenOpt)) { - process.env["OPENCODE_CONSOLE_TOKEN"] = tokenOpt.value - yield* env.set("OPENCODE_CONSOLE_TOKEN", tokenOpt.value) + process.env["CODEV_CONSOLE_TOKEN"] = tokenOpt.value + yield* env.set("CODEV_CONSOLE_TOKEN", tokenOpt.value) } if (Option.isSome(configOpt)) { @@ -522,11 +522,11 @@ const layer = Layer.effect( }) } - if (Flag.OPENCODE_PERMISSION) { + if (Flag.CODEV_PERMISSION) { try { - result.permission = mergeDeep(result.permission ?? {}, JSON.parse(Flag.OPENCODE_PERMISSION)) + result.permission = mergeDeep(result.permission ?? {}, JSON.parse(Flag.CODEV_PERMISSION)) } catch (err) { - yield* Effect.logWarning("OPENCODE_PERMISSION contains invalid JSON, skipping", { err }) + yield* Effect.logWarning("CODEV_PERMISSION contains invalid JSON, skipping", { err }) } } @@ -562,10 +562,10 @@ const layer = Layer.effect( result.share = "disabled" } - if (Flag.OPENCODE_DISABLE_AUTOCOMPACT) { + if (Flag.CODEV_DISABLE_AUTOCOMPACT) { result.compaction = { ...result.compaction, auto: false } } - if (Flag.OPENCODE_DISABLE_PRUNE) { + if (Flag.CODEV_DISABLE_PRUNE) { result.compaction = { ...result.compaction, prune: false } } diff --git a/packages/opencode/src/config/managed.ts b/packages/opencode/src/config/managed.ts index 9fa16bf781..59d4547701 100644 --- a/packages/opencode/src/config/managed.ts +++ b/packages/opencode/src/config/managed.ts @@ -29,7 +29,7 @@ function systemManagedConfigDir(): string { } export function managedConfigDir() { - return process.env.OPENCODE_TEST_MANAGED_CONFIG_DIR || systemManagedConfigDir() + return process.env.CODEV_TEST_MANAGED_CONFIG_DIR || systemManagedConfigDir() } export function parseManagedPlist(json: string): string { diff --git a/packages/opencode/src/config/paths.ts b/packages/opencode/src/config/paths.ts index 0b2b14c9d8..249ff8c88d 100644 --- a/packages/opencode/src/config/paths.ts +++ b/packages/opencode/src/config/paths.ts @@ -24,7 +24,7 @@ export const directories = Effect.fn("ConfigPaths.directories")(function* (direc const afs = yield* FSUtil.Service return unique([ Global.Path.config, - ...(!Flag.OPENCODE_DISABLE_PROJECT_CONFIG + ...(!Flag.CODEV_DISABLE_PROJECT_CONFIG ? yield* afs.up({ targets: [".codev"], start: directory, @@ -36,7 +36,7 @@ export const directories = Effect.fn("ConfigPaths.directories")(function* (direc start: Global.Path.home, stop: Global.Path.home, })), - ...(Flag.OPENCODE_CONFIG_DIR ? [Flag.OPENCODE_CONFIG_DIR] : []), + ...(Flag.CODEV_CONFIG_DIR ? [Flag.CODEV_CONFIG_DIR] : []), ]) }) diff --git a/packages/opencode/src/config/tui-migrate.ts b/packages/opencode/src/config/tui-migrate.ts index 103456e809..4f1f3038a0 100644 --- a/packages/opencode/src/config/tui-migrate.ts +++ b/packages/opencode/src/config/tui-migrate.ts @@ -120,7 +120,7 @@ async function opencodeFiles(input: { directories: string[]; cwd: string }) { for (const dir of unique(input.directories)) { files.push(...ConfigPaths.fileInDirectory(dir, "codev")) } - if (Flag.OPENCODE_CONFIG) files.push(Flag.OPENCODE_CONFIG) + if (Flag.CODEV_CONFIG) files.push(Flag.CODEV_CONFIG) const existing = await Promise.all( unique(files).map(async (file) => { diff --git a/packages/opencode/src/config/tui.ts b/packages/opencode/src/config/tui.ts index d40136892a..81486477b3 100644 --- a/packages/opencode/src/config/tui.ts +++ b/packages/opencode/src/config/tui.ts @@ -169,11 +169,11 @@ const loadState = Effect.fn("TuiConfig.loadState")(function* (ctx: { directory: }) // Every config dir we may read from: global config dir, any `.codev` - // folders between cwd and home, and OPENCODE_CONFIG_DIR. + // folders between cwd and home, and CODEV_CONFIG_DIR. const directories = yield* ConfigPaths.directories(ctx.directory) yield* Effect.promise(() => migrateTuiConfig({ directories, cwd: ctx.directory })) - const projectFiles = Flag.OPENCODE_DISABLE_PROJECT_CONFIG ? [] : yield* ConfigPaths.files("tui", ctx.directory) + const projectFiles = Flag.CODEV_DISABLE_PROJECT_CONFIG ? [] : yield* ConfigPaths.files("tui", ctx.directory) const acc: Acc = { result: {}, @@ -185,9 +185,9 @@ const loadState = Effect.fn("TuiConfig.loadState")(function* (ctx: { directory: yield* mergeFile(acc, file) } - // 2. Explicit OPENCODE_TUI_CONFIG override, if set. - if (Flag.OPENCODE_TUI_CONFIG) { - const configFile = Flag.OPENCODE_TUI_CONFIG + // 2. Explicit CODEV_TUI_CONFIG override, if set. + if (Flag.CODEV_TUI_CONFIG) { + const configFile = Flag.CODEV_TUI_CONFIG yield* mergeFile(acc, configFile) yield* Effect.logDebug("loaded custom tui config", { path: configFile }) } @@ -197,13 +197,13 @@ const loadState = Effect.fn("TuiConfig.loadState")(function* (ctx: { directory: yield* mergeFile(acc, file) } - // 4. `.codev` directories (and OPENCODE_CONFIG_DIR) discovered while + // 4. `.codev` directories (and CODEV_CONFIG_DIR) discovered while // walking up the tree. Also returned below so callers can install plugin // dependencies from each location. - const dirs = unique(directories).filter((dir) => dir.endsWith(".codev") || dir === Flag.OPENCODE_CONFIG_DIR) + const dirs = unique(directories).filter((dir) => dir.endsWith(".codev") || dir === Flag.CODEV_CONFIG_DIR) for (const dir of dirs) { - if (!dir.endsWith(".codev") && dir !== Flag.OPENCODE_CONFIG_DIR) continue + if (!dir.endsWith(".codev") && dir !== Flag.CODEV_CONFIG_DIR) continue for (const file of ConfigPaths.fileInDirectory(dir, "tui")) { yield* mergeFile(acc, file) } diff --git a/packages/opencode/src/control-plane/workspace.ts b/packages/opencode/src/control-plane/workspace.ts index 8f746e2568..95c0984db9 100644 --- a/packages/opencode/src/control-plane/workspace.ts +++ b/packages/opencode/src/control-plane/workspace.ts @@ -527,9 +527,9 @@ const layer = Layer.effect( .pipe(Effect.orDie) const env = { - OPENCODE_AUTH_CONTENT: JSON.stringify(yield* auth.all()), - OPENCODE_WORKSPACE_ID: config.id, - OPENCODE_EXPERIMENTAL_WORKSPACES: "true", + CODEV_AUTH_CONTENT: JSON.stringify(yield* auth.all()), + CODEV_WORKSPACE_ID: config.id, + CODEV_EXPERIMENTAL_WORKSPACES: "true", OTEL_EXPORTER_OTLP_HEADERS: process.env.OTEL_EXPORTER_OTLP_HEADERS, OTEL_EXPORTER_OTLP_ENDPOINT: process.env.OTEL_EXPORTER_OTLP_ENDPOINT, OTEL_RESOURCE_ATTRIBUTES: process.env.OTEL_RESOURCE_ATTRIBUTES, diff --git a/packages/opencode/src/effect/config-service.ts b/packages/opencode/src/effect/config-service.ts index 516c040f57..047f28973f 100644 --- a/packages/opencode/src/effect/config-service.ts +++ b/packages/opencode/src/effect/config-service.ts @@ -30,8 +30,8 @@ export type ServiceClass = Context.ServiceClas * class ServerAuthConfig extends ConfigService.Service()( * "@opencode/ServerAuthConfig", * { - * password: Config.string("OPENCODE_SERVER_PASSWORD").pipe(Config.option), - * username: Config.string("OPENCODE_SERVER_USERNAME").pipe(Config.withDefault("opencode")), + * password: Config.string("CODEV_SERVER_PASSWORD").pipe(Config.option), + * username: Config.string("CODEV_SERVER_USERNAME").pipe(Config.withDefault("opencode")), * }, * ) {} * diff --git a/packages/opencode/src/effect/runtime-flags.ts b/packages/opencode/src/effect/runtime-flags.ts index 65e02f0763..1d7c78d8c4 100644 --- a/packages/opencode/src/effect/runtime-flags.ts +++ b/packages/opencode/src/effect/runtime-flags.ts @@ -7,53 +7,53 @@ const positiveInteger = (name: string) => Config.map((value) => (Number.isInteger(value) && value > 0 ? value : undefined)), Config.orElse(() => Config.succeed(undefined)), ) -const experimental = bool("OPENCODE_EXPERIMENTAL") +const experimental = bool("CODEV_EXPERIMENTAL") const enabledByExperimental = (name: string) => Config.all({ experimental, enabled: Config.boolean(name).pipe(Config.option) }).pipe( Config.map((flags) => Option.getOrElse(flags.enabled, () => flags.experimental)), ) export class Service extends ConfigService.Service()("@opencode/RuntimeFlags", { - autoShare: bool("OPENCODE_AUTO_SHARE"), - pure: bool("OPENCODE_PURE"), - disableDefaultPlugins: bool("OPENCODE_DISABLE_DEFAULT_PLUGINS"), - disableEmbeddedWebUi: bool("OPENCODE_DISABLE_EMBEDDED_WEB_UI"), - disableExternalSkills: bool("OPENCODE_DISABLE_EXTERNAL_SKILLS"), - disableLspDownload: bool("OPENCODE_DISABLE_LSP_DOWNLOAD"), + autoShare: bool("CODEV_AUTO_SHARE"), + pure: bool("CODEV_PURE"), + disableDefaultPlugins: bool("CODEV_DISABLE_DEFAULT_PLUGINS"), + disableEmbeddedWebUi: bool("CODEV_DISABLE_EMBEDDED_WEB_UI"), + disableExternalSkills: bool("CODEV_DISABLE_EXTERNAL_SKILLS"), + disableLspDownload: bool("CODEV_DISABLE_LSP_DOWNLOAD"), disableClaudeCodePrompt: Config.all({ - broad: bool("OPENCODE_DISABLE_CLAUDE_CODE"), - direct: bool("OPENCODE_DISABLE_CLAUDE_CODE_PROMPT"), + broad: bool("CODEV_DISABLE_CLAUDE_CODE"), + direct: bool("CODEV_DISABLE_CLAUDE_CODE_PROMPT"), }).pipe(Config.map((flags) => flags.broad || flags.direct)), disableClaudeCodeSkills: Config.all({ - broad: bool("OPENCODE_DISABLE_CLAUDE_CODE"), - direct: bool("OPENCODE_DISABLE_CLAUDE_CODE_SKILLS"), + broad: bool("CODEV_DISABLE_CLAUDE_CODE"), + direct: bool("CODEV_DISABLE_CLAUDE_CODE_SKILLS"), }).pipe(Config.map((flags) => flags.broad || flags.direct)), enableExa: Config.all({ experimental, - enabled: bool("OPENCODE_ENABLE_EXA"), - legacy: bool("OPENCODE_EXPERIMENTAL_EXA"), + enabled: bool("CODEV_ENABLE_EXA"), + legacy: bool("CODEV_EXPERIMENTAL_EXA"), }).pipe(Config.map((flags) => flags.experimental || flags.enabled || flags.legacy)), enableParallel: Config.all({ - enabled: bool("OPENCODE_ENABLE_PARALLEL"), - legacy: bool("OPENCODE_EXPERIMENTAL_PARALLEL"), + enabled: bool("CODEV_ENABLE_PARALLEL"), + legacy: bool("CODEV_EXPERIMENTAL_PARALLEL"), }).pipe(Config.map((flags) => flags.enabled || flags.legacy)), - enableExperimentalModels: bool("OPENCODE_ENABLE_EXPERIMENTAL_MODELS"), - enableQuestionTool: bool("OPENCODE_ENABLE_QUESTION_TOOL"), - experimentalReferences: enabledByExperimental("OPENCODE_EXPERIMENTAL_REFERENCES"), - experimentalBackgroundSubagents: enabledByExperimental("OPENCODE_EXPERIMENTAL_BACKGROUND_SUBAGENTS"), - experimentalLspTy: bool("OPENCODE_EXPERIMENTAL_LSP_TY"), - experimentalLspTool: enabledByExperimental("OPENCODE_EXPERIMENTAL_LSP_TOOL"), - experimentalOxfmt: enabledByExperimental("OPENCODE_EXPERIMENTAL_OXFMT"), - experimentalPlanMode: enabledByExperimental("OPENCODE_EXPERIMENTAL_PLAN_MODE"), - experimentalCodeMode: enabledByExperimental("OPENCODE_EXPERIMENTAL_CODE_MODE"), - experimentalEventSystem: enabledByExperimental("OPENCODE_EXPERIMENTAL_EVENT_SYSTEM"), - experimentalWorkspaces: enabledByExperimental("OPENCODE_EXPERIMENTAL_WORKSPACES"), - experimentalIconDiscovery: enabledByExperimental("OPENCODE_EXPERIMENTAL_ICON_DISCOVERY"), - outputTokenMax: positiveInteger("OPENCODE_EXPERIMENTAL_OUTPUT_TOKEN_MAX"), - bashDefaultTimeoutMs: positiveInteger("OPENCODE_EXPERIMENTAL_BASH_DEFAULT_TIMEOUT_MS"), - experimentalNativeLlm: bool("OPENCODE_EXPERIMENTAL_NATIVE_LLM"), - experimentalWebSockets: bool("OPENCODE_EXPERIMENTAL_WEBSOCKETS"), - client: Config.string("OPENCODE_CLIENT").pipe(Config.withDefault("cli")), + enableExperimentalModels: bool("CODEV_ENABLE_EXPERIMENTAL_MODELS"), + enableQuestionTool: bool("CODEV_ENABLE_QUESTION_TOOL"), + experimentalReferences: enabledByExperimental("CODEV_EXPERIMENTAL_REFERENCES"), + experimentalBackgroundSubagents: enabledByExperimental("CODEV_EXPERIMENTAL_BACKGROUND_SUBAGENTS"), + experimentalLspTy: bool("CODEV_EXPERIMENTAL_LSP_TY"), + experimentalLspTool: enabledByExperimental("CODEV_EXPERIMENTAL_LSP_TOOL"), + experimentalOxfmt: enabledByExperimental("CODEV_EXPERIMENTAL_OXFMT"), + experimentalPlanMode: enabledByExperimental("CODEV_EXPERIMENTAL_PLAN_MODE"), + experimentalCodeMode: enabledByExperimental("CODEV_EXPERIMENTAL_CODE_MODE"), + experimentalEventSystem: enabledByExperimental("CODEV_EXPERIMENTAL_EVENT_SYSTEM"), + experimentalWorkspaces: enabledByExperimental("CODEV_EXPERIMENTAL_WORKSPACES"), + experimentalIconDiscovery: enabledByExperimental("CODEV_EXPERIMENTAL_ICON_DISCOVERY"), + outputTokenMax: positiveInteger("CODEV_EXPERIMENTAL_OUTPUT_TOKEN_MAX"), + bashDefaultTimeoutMs: positiveInteger("CODEV_EXPERIMENTAL_BASH_DEFAULT_TIMEOUT_MS"), + experimentalNativeLlm: bool("CODEV_EXPERIMENTAL_NATIVE_LLM"), + experimentalWebSockets: bool("CODEV_EXPERIMENTAL_WEBSOCKETS"), + client: Config.string("CODEV_CLIENT").pipe(Config.withDefault("cli")), }) {} export type Info = Context.Service.Shape diff --git a/packages/opencode/src/ide/index.ts b/packages/opencode/src/ide/index.ts index 31b3add14b..848312187e 100644 --- a/packages/opencode/src/ide/index.ts +++ b/packages/opencode/src/ide/index.ts @@ -30,7 +30,7 @@ export function ide() { } export function alreadyInstalled() { - return process.env["OPENCODE_CALLER"] === "vscode" || process.env["OPENCODE_CALLER"] === "vscode-insiders" + return process.env["CODEV_CALLER"] === "vscode" || process.env["CODEV_CALLER"] === "vscode-insiders" } export async function install(ide: (typeof SUPPORTED_IDES)[number]["name"]) { diff --git a/packages/opencode/src/index.ts b/packages/opencode/src/index.ts index 7e8c170edf..eccaa4b937 100644 --- a/packages/opencode/src/index.ts +++ b/packages/opencode/src/index.ts @@ -65,17 +65,17 @@ const cli = yargs(args) type: "boolean", }) .middleware(async (opts) => { - if (opts.printLogs) process.env.OPENCODE_PRINT_LOGS = "1" - if (opts.logLevel) process.env.OPENCODE_LOG_LEVEL = opts.logLevel + if (opts.printLogs) process.env.CODEV_PRINT_LOGS = "1" + if (opts.logLevel) process.env.CODEV_LOG_LEVEL = opts.logLevel if (opts.pure) { - process.env.OPENCODE_PURE = "1" + process.env.CODEV_PURE = "1" } Heap.start() process.env.AGENT = "1" - process.env.OPENCODE = "1" - process.env.OPENCODE_PID = String(process.pid) + process.env.CODEV = "1" + process.env.CODEV_PID = String(process.pid) }) .usage("") .completion("completion", "generate shell completion script") diff --git a/packages/opencode/src/plugin/meta.ts b/packages/opencode/src/plugin/meta.ts index 54f784d179..934c2e8f83 100644 --- a/packages/opencode/src/plugin/meta.ts +++ b/packages/opencode/src/plugin/meta.ts @@ -46,7 +46,7 @@ type Core = Omit()("@opencode/ServerAuthConfig", { - password: EffectConfig.string("OPENCODE_SERVER_PASSWORD").pipe(EffectConfig.option), - username: EffectConfig.string("OPENCODE_SERVER_USERNAME").pipe(EffectConfig.withDefault("opencode")), + password: EffectConfig.string("CODEV_SERVER_PASSWORD").pipe(EffectConfig.option), + username: EffectConfig.string("CODEV_SERVER_USERNAME").pipe(EffectConfig.withDefault("opencode")), }) {} export type Info = Context.Service.Shape @@ -34,10 +34,10 @@ export function authorized(credentials: DecodedCredentials, config: Info) { } export function header(credentials?: Credentials) { - const password = credentials?.password ?? Flag.OPENCODE_SERVER_PASSWORD + const password = credentials?.password ?? Flag.CODEV_SERVER_PASSWORD if (!password) return undefined - const username = credentials?.username ?? Flag.OPENCODE_SERVER_USERNAME ?? "opencode" + const username = credentials?.username ?? Flag.CODEV_SERVER_USERNAME ?? "opencode" return `Basic ${Buffer.from(`${username}:${password}`).toString("base64")}` } diff --git a/packages/opencode/src/server/routes/instance/httpapi/middleware/fence.ts b/packages/opencode/src/server/routes/instance/httpapi/middleware/fence.ts index c5cbc7b820..b1ef89aaa6 100644 --- a/packages/opencode/src/server/routes/instance/httpapi/middleware/fence.ts +++ b/packages/opencode/src/server/routes/instance/httpapi/middleware/fence.ts @@ -12,7 +12,7 @@ export const fenceLayer = HttpRouter.middleware<{ requires: Database.Service; ha return (effect) => Effect.gen(function* () { const request = yield* HttpServerRequest.HttpServerRequest - if (!Flag.OPENCODE_WORKSPACE_ID || ignoredMethods.has(request.method)) return yield* effect + if (!Flag.CODEV_WORKSPACE_ID || ignoredMethods.has(request.method)) return yield* effect const previous = yield* Fence.load(db) const response = yield* effect diff --git a/packages/opencode/src/server/routes/instance/httpapi/middleware/workspace-routing.ts b/packages/opencode/src/server/routes/instance/httpapi/middleware/workspace-routing.ts index 873abd8349..4d9597341c 100644 --- a/packages/opencode/src/server/routes/instance/httpapi/middleware/workspace-routing.ts +++ b/packages/opencode/src/server/routes/instance/httpapi/middleware/workspace-routing.ts @@ -63,7 +63,7 @@ function requestURL(request: HttpServerRequest.HttpServerRequest): URL { } function configuredWorkspaceID(): WorkspaceV2.ID | undefined { - return Flag.OPENCODE_WORKSPACE_ID ? WorkspaceV2.ID.make(Flag.OPENCODE_WORKSPACE_ID) : undefined + return Flag.CODEV_WORKSPACE_ID ? WorkspaceV2.ID.make(Flag.CODEV_WORKSPACE_ID) : undefined } function selectedWorkspaceID(url: URL, sessionWorkspaceID?: WorkspaceV2.ID): WorkspaceV2.ID | undefined { diff --git a/packages/opencode/src/session/instruction.ts b/packages/opencode/src/session/instruction.ts index 7f593550d4..ac98e9af50 100644 --- a/packages/opencode/src/session/instruction.ts +++ b/packages/opencode/src/session/instruction.ts @@ -78,7 +78,7 @@ const layer: Layer.Layer< const relative = Effect.fnUntraced(function* (instruction: string) { const ctx = yield* InstanceState.context - if (!Flag.OPENCODE_DISABLE_PROJECT_CONFIG) { + if (!Flag.CODEV_DISABLE_PROJECT_CONFIG) { return yield* fs .globUp(instruction, ctx.directory, ctx.worktree) .pipe(Effect.catch(() => Effect.succeed([] as string[]))) @@ -120,7 +120,7 @@ const layer: Layer.Layer< } // The first project-level match wins so we don't stack AGENTS.md/CLAUDE.md from every ancestor. - if (!Flag.OPENCODE_DISABLE_PROJECT_CONFIG) { + if (!Flag.CODEV_DISABLE_PROJECT_CONFIG) { for (const file of instructionFiles) { const matches = yield* fs .findUp(file, ctx.directory, ctx.worktree) diff --git a/packages/opencode/src/session/llm/AGENTS.md b/packages/opencode/src/session/llm/AGENTS.md index cfb6a89cef..1d4895dacb 100644 --- a/packages/opencode/src/session/llm/AGENTS.md +++ b/packages/opencode/src/session/llm/AGENTS.md @@ -85,6 +85,6 @@ Both runtimes converge on the same `LLMEvent` stream consumed by the session pro Safety boundary: - AI SDK remains the default. -- `OPENCODE_EXPERIMENTAL_NATIVE_LLM=true` or the umbrella `OPENCODE_EXPERIMENTAL=true` opts in. Native is not a global replacement. +- `CODEV_EXPERIMENTAL_NATIVE_LLM=true` or the umbrella `CODEV_EXPERIMENTAL=true` opts in. Native is not a global replacement. - Native execution currently supports OpenAI, opencode-managed OpenAI-compatible, and Anthropic API-key paths backed by `@ai-sdk/openai`, `@ai-sdk/openai-compatible`, or `@ai-sdk/anthropic` catalog entries. - Unsupported providers, OpenAI OAuth, and missing API-key cases fall back to AI SDK. diff --git a/packages/opencode/src/share/share-next.ts b/packages/opencode/src/share/share-next.ts index 60112e10d9..794a65e9c3 100644 --- a/packages/opencode/src/share/share-next.ts +++ b/packages/opencode/src/share/share-next.ts @@ -20,7 +20,7 @@ import { ProviderV2 } from "@opencode-ai/core/provider" import { ModelV2 } from "@opencode-ai/core/model" import { EventV2 } from "@opencode-ai/core/event" -const disabled = process.env["OPENCODE_DISABLE_SHARE"] === "true" || process.env["OPENCODE_DISABLE_SHARE"] === "1" +const disabled = process.env["CODEV_DISABLE_SHARE"] === "true" || process.env["CODEV_DISABLE_SHARE"] === "1" export type Api = { create: string diff --git a/packages/opencode/src/skill/index.ts b/packages/opencode/src/skill/index.ts index 305cd4c653..d382b6a5cc 100644 --- a/packages/opencode/src/skill/index.ts +++ b/packages/opencode/src/skill/index.ts @@ -21,7 +21,7 @@ import { escapeHtml } from "@/util/html" const CLAUDE_EXTERNAL_DIR = ".claude" const AGENTS_EXTERNAL_DIR = ".agents" const EXTERNAL_SKILL_PATTERN = "skills/**/SKILL.md" -const OPENCODE_SKILL_PATTERN = "{skill,skills}/**/SKILL.md" +const CODEV_SKILL_PATTERN = "{skill,skills}/**/SKILL.md" const SKILL_PATTERN = "**/SKILL.md" // Built-in skill that ships with opencode. The model's intuition for what an @@ -29,10 +29,10 @@ const SKILL_PATTERN = "**/SKILL.md" // invalid config, so users hit cryptic startup errors. Loading this skill // when the model is asked to touch opencode's own config files gives it the // actual schemas instead of guesses. -const CUSTOMIZE_OPENCODE_SKILL_NAME = "customize-opencode" -const CUSTOMIZE_OPENCODE_SKILL_DESCRIPTION = +const CUSTOMIZE_CODEV_SKILL_NAME = "customize-opencode" +const CUSTOMIZE_CODEV_SKILL_DESCRIPTION = "Use ONLY when the user is editing or creating opencode's own configuration: codev.json, codev.jsonc, files under .codev/, or files under ~/.config/codev/. Also use when creating or fixing opencode agents, subagents, skills, plugins, MCP servers, or permission rules. Do not use for the user's own application code, or for any project that is not configuring opencode itself." -const CUSTOMIZE_OPENCODE_SKILL_BODY = SkillPlugin.CustomizeOpencodeContent +const CUSTOMIZE_CODEV_SKILL_BODY = SkillPlugin.CustomizeOpencodeContent export const Info = Schema.Struct({ name: Schema.String, @@ -204,7 +204,7 @@ const discoverSkills = Effect.fnUntraced(function* ( const configDirs = yield* config.directories() for (const dir of configDirs) { - yield* scan(state, dir, OPENCODE_SKILL_PATTERN) + yield* scan(state, dir, CODEV_SKILL_PATTERN) } const cfg = yield* config.get() @@ -275,11 +275,11 @@ const layer = Layer.effect( const s: State = { skills: {}, dirs: new Set() } // Register the built-in skill BEFORE disk discovery so a user-disk // skill with the same name can override it. - s.skills[CUSTOMIZE_OPENCODE_SKILL_NAME] = { - name: CUSTOMIZE_OPENCODE_SKILL_NAME, - description: CUSTOMIZE_OPENCODE_SKILL_DESCRIPTION, + s.skills[CUSTOMIZE_CODEV_SKILL_NAME] = { + name: CUSTOMIZE_CODEV_SKILL_NAME, + description: CUSTOMIZE_CODEV_SKILL_DESCRIPTION, location: "", - content: CUSTOMIZE_OPENCODE_SKILL_BODY, + content: CUSTOMIZE_CODEV_SKILL_BODY, } yield* loadSkills(s, yield* InstanceState.get(discovered), events) return s diff --git a/packages/opencode/src/temporary.ts b/packages/opencode/src/temporary.ts index 95461f301b..7205870daa 100644 --- a/packages/opencode/src/temporary.ts +++ b/packages/opencode/src/temporary.ts @@ -24,8 +24,8 @@ const cli = yargs(hideBin(process.argv)) type: "boolean", }) .middleware((opts) => { - if (opts.printLogs) process.env.OPENCODE_PRINT_LOGS = "1" - if (opts.logLevel) process.env.OPENCODE_LOG_LEVEL = opts.logLevel + if (opts.printLogs) process.env.CODEV_PRINT_LOGS = "1" + if (opts.logLevel) process.env.CODEV_LOG_LEVEL = opts.logLevel }) .command(TuiThreadCommand) .parse() diff --git a/packages/opencode/src/tool/task.ts b/packages/opencode/src/tool/task.ts index b0a866c90e..d6a928a6d6 100644 --- a/packages/opencode/src/tool/task.ts +++ b/packages/opencode/src/tool/task.ts @@ -97,7 +97,7 @@ export const TaskTool = Tool.define( const runInBackground = params.background === true if (runInBackground && !flags.experimentalBackgroundSubagents) { return yield* Effect.fail( - new Error("Background subagents require OPENCODE_EXPERIMENTAL_BACKGROUND_SUBAGENTS=true"), + new Error("Background subagents require CODEV_EXPERIMENTAL_BACKGROUND_SUBAGENTS=true"), ) } diff --git a/packages/opencode/src/tool/websearch.ts b/packages/opencode/src/tool/websearch.ts index d08ae1d153..829d0b0d0f 100644 --- a/packages/opencode/src/tool/websearch.ts +++ b/packages/opencode/src/tool/websearch.ts @@ -28,7 +28,7 @@ const WebSearchProviderSchema = Schema.Literals(["exa", "parallel"]) export type WebSearchProvider = Schema.Schema.Type export function selectWebSearchProvider(sessionID: string, flags = { exa: false, parallel: false }): WebSearchProvider { - const override = process.env.OPENCODE_WEBSEARCH_PROVIDER + const override = process.env.CODEV_WEBSEARCH_PROVIDER if (override === "exa" || override === "parallel") return override if (flags.parallel) return "parallel" if (flags.exa) return "exa" diff --git a/packages/opencode/src/util/repository.ts b/packages/opencode/src/util/repository.ts index dfeee4322a..f7805bf9e9 100644 --- a/packages/opencode/src/util/repository.ts +++ b/packages/opencode/src/util/repository.ts @@ -97,7 +97,7 @@ function withSlash(input: string) { } function githubRemote(pathname: string) { - const base = process.env.OPENCODE_REPO_CLONE_GITHUB_BASE_URL + const base = process.env.CODEV_REPO_CLONE_GITHUB_BASE_URL if (!base) return `https://github.com/${pathname}.git` return new URL(`${pathname}.git`, withSlash(base)).href } diff --git a/packages/opencode/test/agent/agent.test.ts b/packages/opencode/test/agent/agent.test.ts index 990de68fb4..f3ce8060b7 100644 --- a/packages/opencode/test/agent/agent.test.ts +++ b/packages/opencode/test/agent/agent.test.ts @@ -612,11 +612,11 @@ description: Permission skill. ), ) - const home = process.env.OPENCODE_TEST_HOME - process.env.OPENCODE_TEST_HOME = test.directory + const home = process.env.CODEV_TEST_HOME + process.env.CODEV_TEST_HOME = test.directory yield* Effect.addFinalizer(() => Effect.sync(() => { - process.env.OPENCODE_TEST_HOME = home + process.env.CODEV_TEST_HOME = home }), ) diff --git a/packages/opencode/test/cli/acp/config-options.test.ts b/packages/opencode/test/cli/acp/config-options.test.ts index 2a61cd51d0..6d30c28827 100644 --- a/packages/opencode/test/cli/acp/config-options.test.ts +++ b/packages/opencode/test/cli/acp/config-options.test.ts @@ -19,7 +19,7 @@ describe("codev acp config option subprocess", () => { Effect.gen(function* () { const acp = yield* createAcpClient( { opencode }, - { OPENCODE_CONFIG_CONTENT: JSON.stringify(verifierConfig(llm.url)) }, + { CODEV_CONFIG_CONTENT: JSON.stringify(verifierConfig(llm.url)) }, ) yield* initialize(acp) const model = expectSelectOption((yield* newSession(acp, home)).configOptions, "model") @@ -37,7 +37,7 @@ describe("codev acp config option subprocess", () => { Effect.gen(function* () { const acp = yield* createAcpClient( { opencode }, - { OPENCODE_CONFIG_CONTENT: JSON.stringify(verifierConfig(llm.url)) }, + { CODEV_CONFIG_CONTENT: JSON.stringify(verifierConfig(llm.url)) }, ) yield* initialize(acp) const session = yield* newSession(acp, home) @@ -64,7 +64,7 @@ describe("codev acp config option subprocess", () => { Effect.gen(function* () { const acp = yield* createAcpClient( { opencode }, - { OPENCODE_CONFIG_CONTENT: JSON.stringify(verifierConfig(llm.url)) }, + { CODEV_CONFIG_CONTENT: JSON.stringify(verifierConfig(llm.url)) }, ) yield* initialize(acp) const effort = expectSelectOption((yield* newSession(acp, home)).configOptions, "effort") @@ -82,7 +82,7 @@ describe("codev acp config option subprocess", () => { Effect.gen(function* () { const acp = yield* createAcpClient( { opencode }, - { OPENCODE_CONFIG_CONTENT: JSON.stringify(verifierConfig(llm.url)) }, + { CODEV_CONFIG_CONTENT: JSON.stringify(verifierConfig(llm.url)) }, ) yield* initialize(acp) const session = yield* newSession(acp, home) diff --git a/packages/opencode/test/cli/acp/initialize-auth.test.ts b/packages/opencode/test/cli/acp/initialize-auth.test.ts index 2233667ffd..48f910c20d 100644 --- a/packages/opencode/test/cli/acp/initialize-auth.test.ts +++ b/packages/opencode/test/cli/acp/initialize-auth.test.ts @@ -41,7 +41,7 @@ describe("codev acp initialize/auth subprocess", () => { const rejected = yield* acp.request("authenticate", { methodId: "missing-auth-method" }) expectErrorCode(rejected.error, -32602) - expect(JSON.stringify(rejected.error)).not.toContain(process.env.OPENCODE_AUTH_CONTENT ?? "not-present") + expect(JSON.stringify(rejected.error)).not.toContain(process.env.CODEV_AUTH_CONTENT ?? "not-present") }), 60_000, ) diff --git a/packages/opencode/test/cli/acp/lifecycle.test.ts b/packages/opencode/test/cli/acp/lifecycle.test.ts index 470ddaafab..8b8d26bc2f 100644 --- a/packages/opencode/test/cli/acp/lifecycle.test.ts +++ b/packages/opencode/test/cli/acp/lifecycle.test.ts @@ -32,7 +32,7 @@ describe("codev acp lifecycle subprocess", () => { Effect.gen(function* () { const acp = yield* createAcpClient( { opencode }, - { OPENCODE_CONFIG_CONTENT: JSON.stringify(verifierConfig(llm.url)) }, + { CODEV_CONFIG_CONTENT: JSON.stringify(verifierConfig(llm.url)) }, ) const initialized = yield* initialize(acp) expect(initialized.agentCapabilities?.sessionCapabilities?.close).toEqual({}) @@ -49,7 +49,7 @@ describe("codev acp lifecycle subprocess", () => { Effect.gen(function* () { const acp = yield* createAcpClient( { opencode }, - { OPENCODE_CONFIG_CONTENT: JSON.stringify(verifierConfig(llm.url)) }, + { CODEV_CONFIG_CONTENT: JSON.stringify(verifierConfig(llm.url)) }, ) const initialized = yield* initialize(acp) expect(initialized.agentCapabilities?.loadSession).toBe(true) @@ -73,7 +73,7 @@ describe("codev acp lifecycle subprocess", () => { Effect.gen(function* () { const acp = yield* createAcpClient( { opencode }, - { OPENCODE_CONFIG_CONTENT: JSON.stringify(verifierConfig(llm.url)) }, + { CODEV_CONFIG_CONTENT: JSON.stringify(verifierConfig(llm.url)) }, ) yield* initialize(acp) const session = yield* newSession(acp, home) @@ -101,7 +101,7 @@ describe("codev acp lifecycle subprocess", () => { Effect.gen(function* () { const acp = yield* createAcpClient( { opencode }, - { OPENCODE_CONFIG_CONTENT: JSON.stringify(verifierConfig(llm.url)) }, + { CODEV_CONFIG_CONTENT: JSON.stringify(verifierConfig(llm.url)) }, ) yield* initialize(acp) const session = yield* newSession(acp, home) diff --git a/packages/opencode/test/cli/acp/prompt-content.test.ts b/packages/opencode/test/cli/acp/prompt-content.test.ts index 93bc092831..afe3c8fd66 100644 --- a/packages/opencode/test/cli/acp/prompt-content.test.ts +++ b/packages/opencode/test/cli/acp/prompt-content.test.ts @@ -18,7 +18,7 @@ describe("codev acp prompt content subprocess", () => { yield* Effect.promise(() => writeFile(path.join(home, "README.md"), "# ACP content smoke\n")) const acp = yield* createAcpClient( { opencode }, - { OPENCODE_CONFIG_CONTENT: JSON.stringify(promptContentConfig(llm.url)) }, + { CODEV_CONFIG_CONTENT: JSON.stringify(promptContentConfig(llm.url)) }, ) yield* initialize(acp) const session = yield* newSession(acp, home) diff --git a/packages/opencode/test/cli/acp/skills.test.ts b/packages/opencode/test/cli/acp/skills.test.ts index 43435c1da6..ccb5c92ef7 100644 --- a/packages/opencode/test/cli/acp/skills.test.ts +++ b/packages/opencode/test/cli/acp/skills.test.ts @@ -16,7 +16,7 @@ describe("codev acp skills subprocess", () => { yield* Effect.promise(() => Bun.write(path.join(skills, "verifier-skill", "SKILL.md"), verifierSkill)) const acp = yield* createAcpClient( { opencode }, - { OPENCODE_CONFIG_CONTENT: JSON.stringify(verifierConfig(llm.url, skills)) }, + { CODEV_CONFIG_CONTENT: JSON.stringify(verifierConfig(llm.url, skills)) }, ) yield* initialize(acp) const session = yield* newSession(acp, home) diff --git a/packages/opencode/test/cli/help/__snapshots__/help-snapshots.test.ts.snap b/packages/opencode/test/cli/help/__snapshots__/help-snapshots.test.ts.snap index 7875b0f20b..deb3a7727b 100644 --- a/packages/opencode/test/cli/help/__snapshots__/help-snapshots.test.ts.snap +++ b/packages/opencode/test/cli/help/__snapshots__/help-snapshots.test.ts.snap @@ -72,9 +72,8 @@ Options: -c, --continue continue the last session [boolean] -s, --session session id to continue [string] --fork fork the session when continuing (use with --continue or --session) [boolean] - -p, --password basic auth password (defaults to OPENCODE_SERVER_PASSWORD) [string] - -u, --username basic auth username (defaults to OPENCODE_SERVER_USERNAME or 'opencode') - [string] + -p, --password basic auth password (defaults to CODEV_SERVER_PASSWORD) [string] + -u, --username basic auth username (defaults to CODEV_SERVER_USERNAME or 'opencode') [string] --mini start the minimal interactive interface [boolean] [default: false] --no-replay disable mini session history replay on resume and after resize [boolean] --replay-limit cap visible mini replay to the newest N messages [number]" @@ -106,9 +105,8 @@ Options: -f, --file file(s) to attach to message [array] --title title for the session (uses truncated prompt if no value provided) [string] --attach attach to a running codev server (e.g., http://localhost:4096) [string] - -p, --password basic auth password (defaults to OPENCODE_SERVER_PASSWORD) [string] - -u, --username basic auth username (defaults to OPENCODE_SERVER_USERNAME or 'opencode') - [string] + -p, --password basic auth password (defaults to CODEV_SERVER_PASSWORD) [string] + -u, --username basic auth username (defaults to CODEV_SERVER_USERNAME or 'opencode') [string] --dir directory to run in, path on remote server if attaching [string] --port port for the local server (defaults to random port if no value provided) [number] diff --git a/packages/opencode/test/cli/run/run-process.test.ts b/packages/opencode/test/cli/run/run-process.test.ts index 1bd9a37e22..67a832b321 100644 --- a/packages/opencode/test/cli/run/run-process.test.ts +++ b/packages/opencode/test/cli/run/run-process.test.ts @@ -2,7 +2,7 @@ // These exercise the real CLI binary against a TestLLMServer running in the // same process. See `test/lib/cli-process.ts` for the harness — each test uses // `opencode.run(message, opts?)` to spawn `bun src/index.ts run ...` with -// `OPENCODE_CONFIG_CONTENT` providing the test provider config inline. +// `CODEV_CONFIG_CONTENT` providing the test provider config inline. import { describe, expect } from "bun:test" import { Effect } from "effect" import { reply } from "../../lib/llm-server" diff --git a/packages/opencode/test/cli/smokes/read-only.test.ts b/packages/opencode/test/cli/smokes/read-only.test.ts index ff98e35acc..d2cc702aae 100644 --- a/packages/opencode/test/cli/smokes/read-only.test.ts +++ b/packages/opencode/test/cli/smokes/read-only.test.ts @@ -20,7 +20,7 @@ import { cliIt } from "../../lib/cli-process" describe("codev read-only commands (smoke)", () => { // `mcp list` reads MCP server config and pings each one. With the empty - // OPENCODE_CONFIG_CONTENT={} we provide, no servers should be configured + // CODEV_CONFIG_CONTENT={} we provide, no servers should be configured // and the command should report that cleanly. cliIt.live( "mcp list: exits 0", @@ -75,7 +75,7 @@ describe("codev read-only commands (smoke)", () => { 60_000, ) - // `session list` reads the session DB. Fresh OPENCODE_TEST_HOME means + // `session list` reads the session DB. Fresh CODEV_TEST_HOME means // empty DB. Exit 0 with no sessions. cliIt.live( "session list: exits 0", @@ -100,7 +100,7 @@ describe("codev read-only commands (smoke)", () => { // `db path` prints the DB file location. Under harness isolation the DB // resolves to SQLite's `:memory:` (no on-disk pollution between tests); - // in production it'd be a path under OPENCODE_TEST_HOME / XDG_DATA_HOME. + // in production it'd be a path under CODEV_TEST_HOME / XDG_DATA_HOME. // Accept either form — both prove the resolver ran without crashing. cliIt.live( "db path: exits 0 and prints a path or :memory:", diff --git a/packages/opencode/test/cli/tui/editor-context-zed.test.ts b/packages/opencode/test/cli/tui/editor-context-zed.test.ts index 3cd6adb18d..8a82f3d587 100644 --- a/packages/opencode/test/cli/tui/editor-context-zed.test.ts +++ b/packages/opencode/test/cli/tui/editor-context-zed.test.ts @@ -83,14 +83,14 @@ test("resolveZedDbPath skips candidates that cannot be stated", async () => { const loop = path.join(tmp.path, "loop") await symlink(loop, loop) const home = spyOn(os, "homedir").mockImplementation(() => tmp.path) - const previous = process.env.OPENCODE_ZED_DB - process.env.OPENCODE_ZED_DB = loop + const previous = process.env.CODEV_ZED_DB + process.env.CODEV_ZED_DB = loop try { expect(resolveZedDbPath()).toBeUndefined() } finally { - if (previous === undefined) delete process.env.OPENCODE_ZED_DB - else process.env.OPENCODE_ZED_DB = previous + if (previous === undefined) delete process.env.CODEV_ZED_DB + else process.env.CODEV_ZED_DB = previous home.mockRestore() } }) diff --git a/packages/opencode/test/cli/tui/editor-context.test.tsx b/packages/opencode/test/cli/tui/editor-context.test.tsx index 2b114b5cec..25b2a4f8e3 100644 --- a/packages/opencode/test/cli/tui/editor-context.test.tsx +++ b/packages/opencode/test/cli/tui/editor-context.test.tsx @@ -10,11 +10,11 @@ import { TestTuiContexts } from "../../fixture/tui-environment" import { discoverEditorConnection } from "@opencode-ai/tui/editor" const originalClaudePort = process.env.CLAUDE_CODE_SSE_PORT -const originalOpencodePort = process.env.OPENCODE_EDITOR_SSE_PORT +const originalOpencodePort = process.env.CODEV_EDITOR_SSE_PORT afterEach(() => { process.env.CLAUDE_CODE_SSE_PORT = originalClaudePort - process.env.OPENCODE_EDITOR_SSE_PORT = originalOpencodePort + process.env.CODEV_EDITOR_SSE_PORT = originalOpencodePort }) function nextTick() { @@ -33,7 +33,7 @@ function mountEditorContext(WebSocketImpl?: typeof WebSocket) { return null } - const value = process.env.CLAUDE_CODE_SSE_PORT || process.env.OPENCODE_EDITOR_SSE_PORT + const value = process.env.CLAUDE_CODE_SSE_PORT || process.env.CODEV_EDITOR_SSE_PORT return ( @@ -125,7 +125,7 @@ test("useEditorContext reconnect switches editor server by session directory", a ) process.env.CLAUDE_CODE_SSE_PORT = undefined - process.env.OPENCODE_EDITOR_SSE_PORT = undefined + process.env.CODEV_EDITOR_SSE_PORT = undefined spyOn(process, "cwd").mockImplementation(() => startupDirectory) spyOn(os, "homedir").mockImplementation(() => tmp.path) const firstSocket = new FakeWebSocket("ws://127.0.0.1:3001") @@ -166,7 +166,7 @@ test("useEditorContext favors configured port over lock files", async () => { ) process.env.CLAUDE_CODE_SSE_PORT = "4010" - process.env.OPENCODE_EDITOR_SSE_PORT = undefined + process.env.CODEV_EDITOR_SSE_PORT = undefined spyOn(process, "cwd").mockImplementation(() => startupDirectory) spyOn(os, "homedir").mockImplementation(() => tmp.path) const socket = new FakeWebSocket("ws://127.0.0.1:4010") @@ -194,7 +194,7 @@ test("useEditorContext clears selection when reconnecting", async () => { ) process.env.CLAUDE_CODE_SSE_PORT = undefined - process.env.OPENCODE_EDITOR_SSE_PORT = undefined + process.env.CODEV_EDITOR_SSE_PORT = undefined spyOn(process, "cwd").mockImplementation(() => startupDirectory) spyOn(os, "homedir").mockImplementation(() => tmp.path) const socket = new FakeWebSocket("ws://127.0.0.1:3001") @@ -254,7 +254,7 @@ test("useEditorContext preserves selection for the next reconnect when requested ) process.env.CLAUDE_CODE_SSE_PORT = undefined - process.env.OPENCODE_EDITOR_SSE_PORT = undefined + process.env.CODEV_EDITOR_SSE_PORT = undefined spyOn(process, "cwd").mockImplementation(() => startupDirectory) spyOn(os, "homedir").mockImplementation(() => tmp.path) const socket = new FakeWebSocket("ws://127.0.0.1:3001") @@ -281,10 +281,10 @@ test("useEditorContext preserves selection for the next reconnect when requested mounted.dispose() }) -test("useEditorContext connects with OPENCODE_EDITOR_SSE_PORT", async () => { +test("useEditorContext connects with CODEV_EDITOR_SSE_PORT", async () => { await using tmp = await tmpdir() process.env.CLAUDE_CODE_SSE_PORT = undefined - process.env.OPENCODE_EDITOR_SSE_PORT = "4020" + process.env.CODEV_EDITOR_SSE_PORT = "4020" spyOn(process, "cwd").mockImplementation(() => tmp.path) const socket = new FakeWebSocket("ws://127.0.0.1:4020") diff --git a/packages/opencode/test/cli/tui/plugin-add.test.ts b/packages/opencode/test/cli/tui/plugin-add.test.ts index bf509b8de0..145e6a24ac 100644 --- a/packages/opencode/test/cli/tui/plugin-add.test.ts +++ b/packages/opencode/test/cli/tui/plugin-add.test.ts @@ -31,7 +31,7 @@ test("adds tui plugin at runtime from spec", async () => { }, }) - process.env.OPENCODE_PLUGIN_META_FILE = path.join(tmp.path, "plugin-meta.json") + process.env.CODEV_PLUGIN_META_FILE = path.join(tmp.path, "plugin-meta.json") const config = createTuiResolvedConfig({ plugin: [], }) @@ -58,7 +58,7 @@ test("adds tui plugin at runtime from spec", async () => { await TuiPluginRuntime.dispose() cwd.mockRestore() wait.mockRestore() - delete process.env.OPENCODE_PLUGIN_META_FILE + delete process.env.CODEV_PLUGIN_META_FILE } }) @@ -73,7 +73,7 @@ test("retries runtime add for file plugins after dependency wait", async () => { }, }) - process.env.OPENCODE_PLUGIN_META_FILE = path.join(tmp.path, "plugin-meta.json") + process.env.CODEV_PLUGIN_META_FILE = path.join(tmp.path, "plugin-meta.json") const config = createTuiResolvedConfig({ plugin: [], }) @@ -105,6 +105,6 @@ test("retries runtime add for file plugins after dependency wait", async () => { await TuiPluginRuntime.dispose() cwd.mockRestore() wait.mockRestore() - delete process.env.OPENCODE_PLUGIN_META_FILE + delete process.env.CODEV_PLUGIN_META_FILE } }) diff --git a/packages/opencode/test/cli/tui/plugin-install.test.ts b/packages/opencode/test/cli/tui/plugin-install.test.ts index 3d4f1ece9d..a50f20fbaf 100644 --- a/packages/opencode/test/cli/tui/plugin-install.test.ts +++ b/packages/opencode/test/cli/tui/plugin-install.test.ts @@ -50,7 +50,7 @@ test("installs plugin without loading it", async () => { }, }) - process.env.OPENCODE_PLUGIN_META_FILE = path.join(tmp.path, "plugin-meta.json") + process.env.CODEV_PLUGIN_META_FILE = path.join(tmp.path, "plugin-meta.json") const config = createTuiResolvedConfig({ plugin: [], }) @@ -82,6 +82,6 @@ test("installs plugin without loading it", async () => { await TuiPluginRuntime.dispose() cwd.mockRestore() wait.mockRestore() - delete process.env.OPENCODE_PLUGIN_META_FILE + delete process.env.CODEV_PLUGIN_META_FILE } }) diff --git a/packages/opencode/test/cli/tui/plugin-loader-entrypoint.test.ts b/packages/opencode/test/cli/tui/plugin-loader-entrypoint.test.ts index 3b6adeb302..83c7954edc 100644 --- a/packages/opencode/test/cli/tui/plugin-loader-entrypoint.test.ts +++ b/packages/opencode/test/cli/tui/plugin-loader-entrypoint.test.ts @@ -44,7 +44,7 @@ test("loads npm tui plugin from package ./tui export", async () => { }, }) - process.env.OPENCODE_PLUGIN_META_FILE = path.join(tmp.path, "plugin-meta.json") + process.env.CODEV_PLUGIN_META_FILE = path.join(tmp.path, "plugin-meta.json") const config = createTuiResolvedConfig({ plugin: [[tmp.extra.spec, { marker: tmp.extra.marker }]], plugin_origins: [ @@ -71,7 +71,7 @@ test("loads npm tui plugin from package ./tui export", async () => { install.mockRestore() cwd.mockRestore() wait.mockRestore() - delete process.env.OPENCODE_PLUGIN_META_FILE + delete process.env.CODEV_PLUGIN_META_FILE } }) @@ -105,7 +105,7 @@ test("does not use npm package exports dot for tui entry", async () => { }, }) - process.env.OPENCODE_PLUGIN_META_FILE = path.join(tmp.path, "plugin-meta.json") + process.env.CODEV_PLUGIN_META_FILE = path.join(tmp.path, "plugin-meta.json") const config = createTuiResolvedConfig({ plugin: [tmp.extra.spec], plugin_origins: [ @@ -129,7 +129,7 @@ test("does not use npm package exports dot for tui entry", async () => { install.mockRestore() cwd.mockRestore() wait.mockRestore() - delete process.env.OPENCODE_PLUGIN_META_FILE + delete process.env.CODEV_PLUGIN_META_FILE } }) @@ -167,7 +167,7 @@ test("rejects npm tui export that resolves outside plugin directory", async () = }, }) - process.env.OPENCODE_PLUGIN_META_FILE = path.join(tmp.path, "plugin-meta.json") + process.env.CODEV_PLUGIN_META_FILE = path.join(tmp.path, "plugin-meta.json") const config = createTuiResolvedConfig({ plugin: [tmp.extra.spec], plugin_origins: [ @@ -193,7 +193,7 @@ test("rejects npm tui export that resolves outside plugin directory", async () = install.mockRestore() cwd.mockRestore() wait.mockRestore() - delete process.env.OPENCODE_PLUGIN_META_FILE + delete process.env.CODEV_PLUGIN_META_FILE } }) @@ -229,7 +229,7 @@ test("rejects npm tui plugin that exports server and tui together", async () => }, }) - process.env.OPENCODE_PLUGIN_META_FILE = path.join(tmp.path, "plugin-meta.json") + process.env.CODEV_PLUGIN_META_FILE = path.join(tmp.path, "plugin-meta.json") const config = createTuiResolvedConfig({ plugin: [tmp.extra.spec], plugin_origins: [ @@ -253,7 +253,7 @@ test("rejects npm tui plugin that exports server and tui together", async () => install.mockRestore() cwd.mockRestore() wait.mockRestore() - delete process.env.OPENCODE_PLUGIN_META_FILE + delete process.env.CODEV_PLUGIN_META_FILE } }) @@ -287,7 +287,7 @@ test("does not use npm package main for tui entry", async () => { }, }) - process.env.OPENCODE_PLUGIN_META_FILE = path.join(tmp.path, "plugin-meta.json") + process.env.CODEV_PLUGIN_META_FILE = path.join(tmp.path, "plugin-meta.json") const config = createTuiResolvedConfig({ plugin: [tmp.extra.spec], plugin_origins: [ @@ -317,7 +317,7 @@ test("does not use npm package main for tui entry", async () => { wait.mockRestore() warn.mockRestore() error.mockRestore() - delete process.env.OPENCODE_PLUGIN_META_FILE + delete process.env.CODEV_PLUGIN_META_FILE } }) @@ -352,7 +352,7 @@ test("does not use directory package main for tui entry", async () => { }, }) - process.env.OPENCODE_PLUGIN_META_FILE = path.join(tmp.path, "plugin-meta.json") + process.env.CODEV_PLUGIN_META_FILE = path.join(tmp.path, "plugin-meta.json") const config = createTuiResolvedConfig({ plugin: [tmp.extra.spec], plugin_origins: [ @@ -374,7 +374,7 @@ test("does not use directory package main for tui entry", async () => { await TuiPluginRuntime.dispose() cwd.mockRestore() wait.mockRestore() - delete process.env.OPENCODE_PLUGIN_META_FILE + delete process.env.CODEV_PLUGIN_META_FILE } }) @@ -399,7 +399,7 @@ test("uses directory index fallback for tui when package.json is missing", async }, }) - process.env.OPENCODE_PLUGIN_META_FILE = path.join(tmp.path, "plugin-meta.json") + process.env.CODEV_PLUGIN_META_FILE = path.join(tmp.path, "plugin-meta.json") const config = createTuiResolvedConfig({ plugin: [tmp.extra.spec], plugin_origins: [ @@ -421,7 +421,7 @@ test("uses directory index fallback for tui when package.json is missing", async await TuiPluginRuntime.dispose() cwd.mockRestore() wait.mockRestore() - delete process.env.OPENCODE_PLUGIN_META_FILE + delete process.env.CODEV_PLUGIN_META_FILE } }) @@ -456,7 +456,7 @@ test("uses npm package name when tui plugin id is omitted", async () => { }, }) - process.env.OPENCODE_PLUGIN_META_FILE = path.join(tmp.path, "plugin-meta.json") + process.env.CODEV_PLUGIN_META_FILE = path.join(tmp.path, "plugin-meta.json") const config = createTuiResolvedConfig({ plugin: [[tmp.extra.spec, { marker: tmp.extra.marker }]], plugin_origins: [ @@ -480,6 +480,6 @@ test("uses npm package name when tui plugin id is omitted", async () => { install.mockRestore() cwd.mockRestore() wait.mockRestore() - delete process.env.OPENCODE_PLUGIN_META_FILE + delete process.env.CODEV_PLUGIN_META_FILE } }) diff --git a/packages/opencode/test/cli/tui/plugin-loader-pure.test.ts b/packages/opencode/test/cli/tui/plugin-loader-pure.test.ts index 8a754d0467..b5a06ae4fb 100644 --- a/packages/opencode/test/cli/tui/plugin-loader-pure.test.ts +++ b/packages/opencode/test/cli/tui/plugin-loader-pure.test.ts @@ -33,10 +33,10 @@ test("skips external tui plugins in pure mode", async () => { }, }) - const pure = process.env.OPENCODE_PURE - const meta = process.env.OPENCODE_PLUGIN_META_FILE - process.env.OPENCODE_PURE = "1" - process.env.OPENCODE_PLUGIN_META_FILE = tmp.extra.meta + const pure = process.env.CODEV_PURE + const meta = process.env.CODEV_PLUGIN_META_FILE + process.env.CODEV_PURE = "1" + process.env.CODEV_PLUGIN_META_FILE = tmp.extra.meta const config = createTuiResolvedConfig({ plugin: [[tmp.extra.spec, { marker: tmp.extra.marker }]], @@ -59,14 +59,14 @@ test("skips external tui plugins in pure mode", async () => { cwd.mockRestore() wait.mockRestore() if (pure === undefined) { - delete process.env.OPENCODE_PURE + delete process.env.CODEV_PURE } else { - process.env.OPENCODE_PURE = pure + process.env.CODEV_PURE = pure } if (meta === undefined) { - delete process.env.OPENCODE_PLUGIN_META_FILE + delete process.env.CODEV_PLUGIN_META_FILE } else { - process.env.OPENCODE_PLUGIN_META_FILE = meta + process.env.CODEV_PLUGIN_META_FILE = meta } } }) diff --git a/packages/opencode/test/cli/tui/plugin-loader.test.ts b/packages/opencode/test/cli/tui/plugin-loader.test.ts index c017b0c915..32d35e8665 100644 --- a/packages/opencode/test/cli/tui/plugin-loader.test.ts +++ b/packages/opencode/test/cli/tui/plugin-loader.test.ts @@ -624,7 +624,7 @@ test("continues loading when a plugin is missing config metadata", async () => { }, }) - process.env.OPENCODE_PLUGIN_META_FILE = path.join(tmp.path, "plugin-meta.json") + process.env.CODEV_PLUGIN_META_FILE = path.join(tmp.path, "plugin-meta.json") const config = createTuiResolvedConfig({ plugin: [ [tmp.extra.badSpec, { marker: path.join(tmp.path, "bad.txt") }], @@ -659,7 +659,7 @@ test("continues loading when a plugin is missing config metadata", async () => { await TuiPluginRuntime.dispose() cwd.mockRestore() wait.mockRestore() - delete process.env.OPENCODE_PLUGIN_META_FILE + delete process.env.CODEV_PLUGIN_META_FILE } }) @@ -696,7 +696,7 @@ test("does not wait on permanent tui plugin startup failures", async () => { }, }) - process.env.OPENCODE_PLUGIN_META_FILE = path.join(tmp.path, "plugin-meta.json") + process.env.CODEV_PLUGIN_META_FILE = path.join(tmp.path, "plugin-meta.json") const wait = spyOn(TuiConfig, "waitForDependencies").mockResolvedValue() const cwd = spyOn(process, "cwd").mockImplementation(() => tmp.path) @@ -724,7 +724,7 @@ test("does not wait on permanent tui plugin startup failures", async () => { await TuiPluginRuntime.dispose() cwd.mockRestore() wait.mockRestore() - delete process.env.OPENCODE_PLUGIN_META_FILE + delete process.env.CODEV_PLUGIN_META_FILE } }) @@ -781,7 +781,7 @@ export default { }, }) - process.env.OPENCODE_PLUGIN_META_FILE = path.join(tmp.path, "plugin-meta.json") + process.env.CODEV_PLUGIN_META_FILE = path.join(tmp.path, "plugin-meta.json") const cwd = spyOn(process, "cwd").mockImplementation(() => tmp.path) try { @@ -802,7 +802,7 @@ export default { } finally { await TuiPluginRuntime.dispose() cwd.mockRestore() - delete process.env.OPENCODE_PLUGIN_META_FILE + delete process.env.CODEV_PLUGIN_META_FILE if (backupJson === undefined) { await fs.rm(globalJson, { force: true }).catch(() => {}) @@ -1268,7 +1268,7 @@ test("updates installed theme when plugin metadata changes", async () => { }, }) - process.env.OPENCODE_PLUGIN_META_FILE = path.join(tmp.path, "plugin-meta.json") + process.env.CODEV_PLUGIN_META_FILE = path.join(tmp.path, "plugin-meta.json") const cwd = spyOn(process, "cwd").mockImplementation(() => tmp.path) const wait = spyOn(TuiConfig, "waitForDependencies").mockResolvedValue() @@ -1320,13 +1320,13 @@ test("updates installed theme when plugin metadata changes", async () => { expect(text).toContain("#222222") expect(text).not.toContain("#111111") const list = await Filesystem.readJson }>>( - process.env.OPENCODE_PLUGIN_META_FILE!, + process.env.CODEV_PLUGIN_META_FILE!, ) expect(list["demo.theme-update"]?.themes?.[tmp.extra.themeName]?.dest).toBe(tmp.extra.dest) } finally { await TuiPluginRuntime.dispose() cwd.mockRestore() wait.mockRestore() - delete process.env.OPENCODE_PLUGIN_META_FILE + delete process.env.CODEV_PLUGIN_META_FILE } }) diff --git a/packages/opencode/test/cli/tui/plugin-toggle.test.ts b/packages/opencode/test/cli/tui/plugin-toggle.test.ts index 4702655054..ac9cda503e 100644 --- a/packages/opencode/test/cli/tui/plugin-toggle.test.ts +++ b/packages/opencode/test/cli/tui/plugin-toggle.test.ts @@ -39,7 +39,7 @@ test("toggles plugin runtime state by exported id", async () => { }, }) - process.env.OPENCODE_PLUGIN_META_FILE = path.join(tmp.path, "plugin-meta.json") + process.env.CODEV_PLUGIN_META_FILE = path.join(tmp.path, "plugin-meta.json") const config = createTuiResolvedConfig({ plugin: [[tmp.extra.spec, { marker: tmp.extra.marker }]], plugin_enabled: { @@ -87,7 +87,7 @@ test("toggles plugin runtime state by exported id", async () => { await TuiPluginRuntime.dispose() cwd.mockRestore() wait.mockRestore() - delete process.env.OPENCODE_PLUGIN_META_FILE + delete process.env.CODEV_PLUGIN_META_FILE } }) @@ -180,7 +180,7 @@ test("kv plugin_enabled overrides tui config on startup", async () => { }, }) - process.env.OPENCODE_PLUGIN_META_FILE = path.join(tmp.path, "plugin-meta.json") + process.env.CODEV_PLUGIN_META_FILE = path.join(tmp.path, "plugin-meta.json") const config = createTuiResolvedConfig({ plugin: [[tmp.extra.spec, { marker: tmp.extra.marker }]], plugin_enabled: { @@ -217,7 +217,7 @@ test("kv plugin_enabled overrides tui config on startup", async () => { await TuiPluginRuntime.dispose() cwd.mockRestore() wait.mockRestore() - delete process.env.OPENCODE_PLUGIN_META_FILE + delete process.env.CODEV_PLUGIN_META_FILE } }) diff --git a/packages/opencode/test/config/config.test.ts b/packages/opencode/test/config/config.test.ts index f5dc4596e5..b4b7c42ce9 100644 --- a/packages/opencode/test/config/config.test.ts +++ b/packages/opencode/test/config/config.test.ts @@ -129,9 +129,9 @@ const clearEffect = (wait = false) => ) const clear = (wait = false) => Effect.runPromise(clearEffect(wait)) // Get managed config directory from environment (set in preload.ts) -const managedConfigDir = process.env.OPENCODE_TEST_MANAGED_CONFIG_DIR! +const managedConfigDir = process.env.CODEV_TEST_MANAGED_CONFIG_DIR! const originalTestToken = process.env.TEST_TOKEN -const originalConsoleToken = process.env.OPENCODE_CONSOLE_TOKEN +const originalConsoleToken = process.env.CODEV_CONSOLE_TOKEN beforeEach(async () => { await clear(true) @@ -141,8 +141,8 @@ afterEach(async () => { await fs.rm(managedConfigDir, { force: true, recursive: true }).catch(() => {}) if (originalTestToken === undefined) delete process.env.TEST_TOKEN else process.env.TEST_TOKEN = originalTestToken - if (originalConsoleToken === undefined) delete process.env.OPENCODE_CONSOLE_TOKEN - else process.env.OPENCODE_CONSOLE_TOKEN = originalConsoleToken + if (originalConsoleToken === undefined) delete process.env.CODEV_CONSOLE_TOKEN + else process.env.CODEV_CONSOLE_TOKEN = originalConsoleToken await clear(true) }) @@ -319,12 +319,12 @@ it.effect("creates global jsonc config with schema when no global configs exist" ), ) -it.effect("does not create global config when OPENCODE_CONFIG_DIR is set", () => +it.effect("does not create global config when CODEV_CONFIG_DIR is set", () => Effect.gen(function* () { const custom = yield* tmpdirScoped() yield* withGlobalConfig({}, ({ dir }) => withProcessEnv( - "OPENCODE_CONFIG_DIR", + "CODEV_CONFIG_DIR", custom, Effect.gen(function* () { yield* Config.use.get().pipe(provideInstanceEffect(dir)) @@ -583,7 +583,7 @@ const accountTokenIt = configIt({ config: () => Effect.succeed( Option.some({ - provider: { opencode: { options: { apiKey: "{env:OPENCODE_CONSOLE_TOKEN}" } } }, + provider: { opencode: { options: { apiKey: "{env:CODEV_CONSOLE_TOKEN}" } } }, }), ), token: () => Effect.succeed(Option.some(AccessToken.make("st_test_token"))), @@ -909,7 +909,7 @@ it.instance("gets config directories", () => }), ) -it.effect("does not try to install dependencies in read-only OPENCODE_CONFIG_DIR", () => +it.effect("does not try to install dependencies in read-only CODEV_CONFIG_DIR", () => Effect.gen(function* () { if (process.platform === "win32") return @@ -919,11 +919,11 @@ it.effect("does not try to install dependencies in read-only OPENCODE_CONFIG_DIR yield* FSUtil.use.chmod(readonly, 0o555) yield* Effect.addFinalizer(() => FSUtil.use.chmod(readonly, 0o755).pipe(Effect.ignore)) - yield* withProcessEnv("OPENCODE_CONFIG_DIR", readonly, Config.use.get().pipe(provideInstanceEffect(dir))) + yield* withProcessEnv("CODEV_CONFIG_DIR", readonly, Config.use.get().pipe(provideInstanceEffect(dir))) }).pipe(Effect.provide(testInstanceStoreLayer), Effect.provide(LayerNode.compile(CrossSpawnSpawner.node))), ) -it.effect("ignores an inaccessible OPENCODE_CONFIG_DIR", () => +it.effect("ignores an inaccessible CODEV_CONFIG_DIR", () => Effect.gen(function* () { if (process.platform === "win32") return @@ -933,29 +933,29 @@ it.effect("ignores an inaccessible OPENCODE_CONFIG_DIR", () => yield* FSUtil.use.chmod(configDir, 0o000) yield* Effect.addFinalizer(() => FSUtil.use.chmod(configDir, 0o755).pipe(Effect.ignore)) - yield* withProcessEnv("OPENCODE_CONFIG_DIR", configDir, Config.use.get().pipe(provideInstanceEffect(dir))) + yield* withProcessEnv("CODEV_CONFIG_DIR", configDir, Config.use.get().pipe(provideInstanceEffect(dir))) }).pipe(Effect.provide(testInstanceStoreLayer), Effect.provide(LayerNode.compile(CrossSpawnSpawner.node))), ) -it.effect("creates a missing OPENCODE_CONFIG_DIR", () => +it.effect("creates a missing CODEV_CONFIG_DIR", () => Effect.gen(function* () { const dir = yield* tmpdirScoped() const configDir = path.join(dir, "configdir") - yield* withProcessEnv("OPENCODE_CONFIG_DIR", configDir, Config.use.get().pipe(provideInstanceEffect(dir))) + yield* withProcessEnv("CODEV_CONFIG_DIR", configDir, Config.use.get().pipe(provideInstanceEffect(dir))) expect(yield* FSUtil.use.readFileString(path.join(configDir, ".gitignore"))).toContain("node_modules") }).pipe(Effect.provide(testInstanceStoreLayer), Effect.provide(LayerNode.compile(CrossSpawnSpawner.node))), ) -it.effect("installs dependencies in writable OPENCODE_CONFIG_DIR", () => +it.effect("installs dependencies in writable CODEV_CONFIG_DIR", () => Effect.gen(function* () { const dir = yield* tmpdirScoped() const configDir = path.join(dir, "configdir") yield* FSUtil.use.ensureDir(configDir) yield* withProcessEnv( - "OPENCODE_CONFIG_DIR", + "CODEV_CONFIG_DIR", configDir, Config.Service.use((svc) => svc.get().pipe(Effect.andThen(svc.waitForDependencies()))).pipe( provideInstanceEffect(dir), @@ -1026,7 +1026,7 @@ it.effect("global config remains global when project config is disabled", () => local: { model: "local/model" }, }, withProcessEnv( - "OPENCODE_DISABLE_PROJECT_CONFIG", + "CODEV_DISABLE_PROJECT_CONFIG", "true", Effect.gen(function* () { const config = yield* Config.use.get() @@ -1180,7 +1180,7 @@ it.instance("migrates legacy write tool to edit permission", () => ) // Managed settings tests -// Note: preload.ts sets OPENCODE_TEST_MANAGED_CONFIG which Global.Path.managedConfig uses +// Note: preload.ts sets CODEV_TEST_MANAGED_CONFIG which Global.Path.managedConfig uses it.instance( "managed settings override user settings", @@ -1810,12 +1810,12 @@ describe("deduplicatePluginOrigins", () => { ) }) -describe("OPENCODE_DISABLE_PROJECT_CONFIG", () => { +describe("CODEV_DISABLE_PROJECT_CONFIG", () => { it.instance( "skips project config files when flag is set", () => withProcessEnv( - "OPENCODE_DISABLE_PROJECT_CONFIG", + "CODEV_DISABLE_PROJECT_CONFIG", "true", Effect.gen(function* () { const config = yield* Config.use.get() @@ -1828,7 +1828,7 @@ describe("OPENCODE_DISABLE_PROJECT_CONFIG", () => { it.instance("skips project .codev/ directories when flag is set", () => withProcessEnv( - "OPENCODE_DISABLE_PROJECT_CONFIG", + "CODEV_DISABLE_PROJECT_CONFIG", "true", Effect.gen(function* () { const test = yield* TestInstance @@ -1844,7 +1844,7 @@ describe("OPENCODE_DISABLE_PROJECT_CONFIG", () => { it.instance("still loads global config when flag is set", () => withProcessEnv( - "OPENCODE_DISABLE_PROJECT_CONFIG", + "CODEV_DISABLE_PROJECT_CONFIG", "true", Effect.gen(function* () { const config = yield* Config.use.get() @@ -1858,7 +1858,7 @@ describe("OPENCODE_DISABLE_PROJECT_CONFIG", () => { "skips relative instructions with warning when flag is set but no config dir", () => withProcessEnvs( - { OPENCODE_CONFIG_DIR: undefined, OPENCODE_DISABLE_PROJECT_CONFIG: "true" }, + { CODEV_CONFIG_DIR: undefined, CODEV_DISABLE_PROJECT_CONFIG: "true" }, Effect.gen(function* () { const test = yield* TestInstance yield* FSUtil.use.writeWithDirs(path.join(test.directory, "CUSTOM.md"), "# Custom Instructions") @@ -1871,12 +1871,12 @@ describe("OPENCODE_DISABLE_PROJECT_CONFIG", () => { ) it.instance( - "OPENCODE_CONFIG_DIR still works when flag is set", + "CODEV_CONFIG_DIR still works when flag is set", () => Effect.gen(function* () { const configDir = yield* tmpdirScoped({ config: { model: "configdir/model" } }) yield* withProcessEnvs( - { OPENCODE_DISABLE_PROJECT_CONFIG: "true", OPENCODE_CONFIG_DIR: configDir }, + { CODEV_DISABLE_PROJECT_CONFIG: "true", CODEV_CONFIG_DIR: configDir }, Effect.gen(function* () { const config = yield* Config.use.get() expect(config.model).toBe("configdir/model") @@ -1887,13 +1887,13 @@ describe("OPENCODE_DISABLE_PROJECT_CONFIG", () => { ) }) -// Regression for #28206: malformed OPENCODE_PERMISSION JSON used to crash +// Regression for #28206: malformed CODEV_PERMISSION JSON used to crash // the app on startup with an unhandled SyntaxError. Loading the config with // an invalid JSON value in this env var should not throw. -describe("OPENCODE_PERMISSION env var", () => { - it.instance("does not crash when OPENCODE_PERMISSION contains invalid JSON", () => +describe("CODEV_PERMISSION env var", () => { + it.instance("does not crash when CODEV_PERMISSION contains invalid JSON", () => withProcessEnv( - "OPENCODE_PERMISSION", + "CODEV_PERMISSION", "{invalid", Effect.gen(function* () { const config = yield* Config.use.get() @@ -1904,13 +1904,13 @@ describe("OPENCODE_PERMISSION env var", () => { ) }) -describe("OPENCODE_CONFIG_CONTENT token substitution", () => { - it.instance("substitutes {env:} tokens in OPENCODE_CONFIG_CONTENT", () => +describe("CODEV_CONFIG_CONTENT token substitution", () => { + it.instance("substitutes {env:} tokens in CODEV_CONFIG_CONTENT", () => withProcessEnv( "TEST_CONFIG_VAR", "test_api_key_12345", withProcessEnv( - "OPENCODE_CONFIG_CONTENT", + "CODEV_CONFIG_CONTENT", JSON.stringify({ $schema: "https://opencode.ai/config.json", username: "{env:TEST_CONFIG_VAR}", @@ -1923,12 +1923,12 @@ describe("OPENCODE_CONFIG_CONTENT token substitution", () => { ), ) - it.instance("substitutes {file:} tokens in OPENCODE_CONFIG_CONTENT", () => + it.instance("substitutes {file:} tokens in CODEV_CONFIG_CONTENT", () => Effect.gen(function* () { const test = yield* TestInstance yield* FSUtil.use.writeWithDirs(path.join(test.directory, "api_key.txt"), "secret_key_from_file") yield* withProcessEnv( - "OPENCODE_CONFIG_CONTENT", + "CODEV_CONFIG_CONTENT", JSON.stringify({ $schema: "https://opencode.ai/config.json", username: "{file:./api_key.txt}", diff --git a/packages/opencode/test/config/tui.test.ts b/packages/opencode/test/config/tui.test.ts index bea6551180..ea432598d5 100644 --- a/packages/opencode/test/config/tui.test.ts +++ b/packages/opencode/test/config/tui.test.ts @@ -22,8 +22,8 @@ const globalConfigFiles = ["codev.json", "codev.jsonc", "tui.json", "tui.jsonc"] const cleanState = Effect.gen(function* () { const fs = yield* FSUtil.Service - delete process.env.OPENCODE_CONFIG - delete process.env.OPENCODE_TUI_CONFIG + delete process.env.CODEV_CONFIG + delete process.env.CODEV_TUI_CONFIG yield* Effect.forEach(globalConfigFiles, (file) => fs.remove(file, { force: true }).pipe(Effect.ignore), { discard: true, }) @@ -413,7 +413,7 @@ it.instance("top-level keys in tui.json take precedence over nested tui key", () ), ) -it.instance("project config takes precedence over OPENCODE_TUI_CONFIG (matches OPENCODE_CONFIG)", () => +it.instance("project config takes precedence over CODEV_TUI_CONFIG (matches CODEV_CONFIG)", () => withCleanState( Effect.gen(function* () { const fs = yield* FSUtil.Service @@ -423,7 +423,7 @@ it.instance("project config takes precedence over OPENCODE_TUI_CONFIG (matches O yield* fs.writeJson(custom, { theme: "custom", diff_style: "stacked" }) yield* withEnv( - "OPENCODE_TUI_CONFIG", + "CODEV_TUI_CONFIG", custom, Effect.gen(function* () { const config = yield* getTuiConfig(test.directory) @@ -638,7 +638,7 @@ it.instance("keeps explicit configured keybind input undo on Windows", () => ), ) -it.instance("OPENCODE_TUI_CONFIG provides settings when no project config exists", () => +it.instance("CODEV_TUI_CONFIG provides settings when no project config exists", () => withCleanState( Effect.gen(function* () { const fs = yield* FSUtil.Service @@ -647,7 +647,7 @@ it.instance("OPENCODE_TUI_CONFIG provides settings when no project config exists yield* fs.writeJson(custom, { theme: "from-env", diff_style: "stacked" }) yield* withEnv( - "OPENCODE_TUI_CONFIG", + "CODEV_TUI_CONFIG", custom, Effect.gen(function* () { const config = yield* getTuiConfig(test.directory) @@ -659,7 +659,7 @@ it.instance("OPENCODE_TUI_CONFIG provides settings when no project config exists ), ) -it.instance("does not derive tui path from OPENCODE_CONFIG", () => +it.instance("does not derive tui path from CODEV_CONFIG", () => withCleanState( Effect.gen(function* () { const fs = yield* FSUtil.Service @@ -670,7 +670,7 @@ it.instance("does not derive tui path from OPENCODE_CONFIG", () => yield* fs.writeJson(path.join(customDir, "tui.json"), { theme: "should-not-load" }) yield* withEnv( - "OPENCODE_CONFIG", + "CODEV_CONFIG", path.join(customDir, "codev.json"), Effect.gen(function* () { const config = yield* getTuiConfig(test.directory) diff --git a/packages/opencode/test/control-plane/workspace.test.ts b/packages/opencode/test/control-plane/workspace.test.ts index 6cd1a06b98..9d77a557bb 100644 --- a/packages/opencode/test/control-plane/workspace.test.ts +++ b/packages/opencode/test/control-plane/workspace.test.ts @@ -33,8 +33,8 @@ import { AppNodeBuilder } from "@opencode-ai/core/effect/app-node-builder" import { LayerNode } from "@opencode-ai/core/effect/layer-node" const originalEnv = { - OPENCODE_AUTH_CONTENT: process.env.OPENCODE_AUTH_CONTENT, - OPENCODE_EXPERIMENTAL_WORKSPACES: process.env.OPENCODE_EXPERIMENTAL_WORKSPACES, + CODEV_AUTH_CONTENT: process.env.CODEV_AUTH_CONTENT, + CODEV_EXPERIMENTAL_WORKSPACES: process.env.CODEV_EXPERIMENTAL_WORKSPACES, OTEL_EXPORTER_OTLP_HEADERS: process.env.OTEL_EXPORTER_OTLP_HEADERS, OTEL_EXPORTER_OTLP_ENDPOINT: process.env.OTEL_EXPORTER_OTLP_ENDPOINT, OTEL_RESOURCE_ATTRIBUTES: process.env.OTEL_RESOURCE_ATTRIBUTES, @@ -106,7 +106,7 @@ function restoreEnv() { beforeEach(() => { restoreEnv() - process.env.OPENCODE_EXPERIMENTAL_WORKSPACES = "true" + process.env.CODEV_EXPERIMENTAL_WORKSPACES = "true" }) afterEach(async () => { @@ -423,7 +423,7 @@ describe("workspace CRUD", () => { Effect.gen(function* () { const instance = yield* requireInstance const workspace = yield* Workspace.Service - process.env.OPENCODE_AUTH_CONTENT = JSON.stringify({ test: { type: "api", key: "secret" } }) + process.env.CODEV_AUTH_CONTENT = JSON.stringify({ test: { type: "api", key: "secret" } }) process.env.OTEL_EXPORTER_OTLP_HEADERS = "authorization=otel" process.env.OTEL_EXPORTER_OTLP_ENDPOINT = "https://otel.test" process.env.OTEL_RESOURCE_ATTRIBUTES = "service.name=opencode-test" @@ -482,11 +482,11 @@ describe("workspace CRUD", () => { extra: { configured: true }, projectID: instance.project.id, }) - expect(JSON.parse(recorded.calls.create[0].env.OPENCODE_AUTH_CONTENT ?? "{}")).toEqual({ + expect(JSON.parse(recorded.calls.create[0].env.CODEV_AUTH_CONTENT ?? "{}")).toEqual({ test: { type: "api", key: "secret" }, }) - expect(recorded.calls.create[0].env.OPENCODE_WORKSPACE_ID).toBe(workspaceID) - expect(recorded.calls.create[0].env.OPENCODE_EXPERIMENTAL_WORKSPACES).toBe("true") + expect(recorded.calls.create[0].env.CODEV_WORKSPACE_ID).toBe(workspaceID) + expect(recorded.calls.create[0].env.CODEV_EXPERIMENTAL_WORKSPACES).toBe("true") expect(recorded.calls.create[0].env.OTEL_EXPORTER_OTLP_HEADERS).toBe("authorization=otel") expect(recorded.calls.create[0].env.OTEL_EXPORTER_OTLP_ENDPOINT).toBe("https://otel.test") expect(recorded.calls.create[0].env.OTEL_RESOURCE_ATTRIBUTES).toBe("service.name=opencode-test") diff --git a/packages/opencode/test/effect/runtime-flags.test.ts b/packages/opencode/test/effect/runtime-flags.test.ts index ca5ca1d7b0..f6458168dd 100644 --- a/packages/opencode/test/effect/runtime-flags.test.ts +++ b/packages/opencode/test/effect/runtime-flags.test.ts @@ -23,18 +23,18 @@ describe("RuntimeFlags", () => { const flags = yield* readFlags.pipe( Effect.provide( fromConfig({ - OPENCODE_PURE: "true", - OPENCODE_DISABLE_DEFAULT_PLUGINS: "true", - OPENCODE_AUTO_SHARE: "true", - OPENCODE_DISABLE_EMBEDDED_WEB_UI: "true", - OPENCODE_DISABLE_EXTERNAL_SKILLS: "true", - OPENCODE_DISABLE_LSP_DOWNLOAD: "true", - OPENCODE_EXPERIMENTAL: "true", - OPENCODE_ENABLE_EXA: "true", - OPENCODE_ENABLE_PARALLEL: "true", - OPENCODE_ENABLE_EXPERIMENTAL_MODELS: "true", - OPENCODE_ENABLE_QUESTION_TOOL: "true", - OPENCODE_CLIENT: "desktop", + CODEV_PURE: "true", + CODEV_DISABLE_DEFAULT_PLUGINS: "true", + CODEV_AUTO_SHARE: "true", + CODEV_DISABLE_EMBEDDED_WEB_UI: "true", + CODEV_DISABLE_EXTERNAL_SKILLS: "true", + CODEV_DISABLE_LSP_DOWNLOAD: "true", + CODEV_EXPERIMENTAL: "true", + CODEV_ENABLE_EXA: "true", + CODEV_ENABLE_PARALLEL: "true", + CODEV_ENABLE_EXPERIMENTAL_MODELS: "true", + CODEV_ENABLE_QUESTION_TOOL: "true", + CODEV_CLIENT: "desktop", }), ), ) @@ -65,12 +65,12 @@ describe("RuntimeFlags", () => { }), ) - it.effect("layer parses OPENCODE_EXPERIMENTAL_LSP_TY", () => + it.effect("layer parses CODEV_EXPERIMENTAL_LSP_TY", () => Effect.gen(function* () { const flags = yield* readFlags.pipe( Effect.provide( fromConfig({ - OPENCODE_EXPERIMENTAL_LSP_TY: "true", + CODEV_EXPERIMENTAL_LSP_TY: "true", }), ), ) @@ -81,8 +81,8 @@ describe("RuntimeFlags", () => { it.effect("enables native LLM via dedicated flag only", () => Effect.gen(function* () { - const explicit = yield* readFlags.pipe(Effect.provide(fromConfig({ OPENCODE_EXPERIMENTAL_NATIVE_LLM: "true" }))) - const umbrella = yield* readFlags.pipe(Effect.provide(fromConfig({ OPENCODE_EXPERIMENTAL: "true" }))) + const explicit = yield* readFlags.pipe(Effect.provide(fromConfig({ CODEV_EXPERIMENTAL_NATIVE_LLM: "true" }))) + const umbrella = yield* readFlags.pipe(Effect.provide(fromConfig({ CODEV_EXPERIMENTAL: "true" }))) expect(explicit.experimentalNativeLlm).toBe(true) expect(umbrella.experimentalNativeLlm).toBe(false) @@ -91,8 +91,8 @@ describe("RuntimeFlags", () => { it.effect("enables WebSockets via dedicated flag only", () => Effect.gen(function* () { - const explicit = yield* readFlags.pipe(Effect.provide(fromConfig({ OPENCODE_EXPERIMENTAL_WEBSOCKETS: "true" }))) - const umbrella = yield* readFlags.pipe(Effect.provide(fromConfig({ OPENCODE_EXPERIMENTAL: "true" }))) + const explicit = yield* readFlags.pipe(Effect.provide(fromConfig({ CODEV_EXPERIMENTAL_WEBSOCKETS: "true" }))) + const umbrella = yield* readFlags.pipe(Effect.provide(fromConfig({ CODEV_EXPERIMENTAL: "true" }))) expect(explicit.experimentalWebSockets).toBe(true) expect(umbrella.experimentalWebSockets).toBe(false) @@ -139,9 +139,9 @@ describe("RuntimeFlags", () => { }), ) - it.effect("disableExternalSkills reads OPENCODE_DISABLE_EXTERNAL_SKILLS", () => + it.effect("disableExternalSkills reads CODEV_DISABLE_EXTERNAL_SKILLS", () => Effect.gen(function* () { - const flags = yield* readFlags.pipe(Effect.provide(fromConfig({ OPENCODE_DISABLE_EXTERNAL_SKILLS: "true" }))) + const flags = yield* readFlags.pipe(Effect.provide(fromConfig({ CODEV_DISABLE_EXTERNAL_SKILLS: "true" }))) expect(flags.disableExternalSkills).toBe(true) }), @@ -155,9 +155,9 @@ describe("RuntimeFlags", () => { }), ) - it.effect("disableLspDownload reads OPENCODE_DISABLE_LSP_DOWNLOAD", () => + it.effect("disableLspDownload reads CODEV_DISABLE_LSP_DOWNLOAD", () => Effect.gen(function* () { - const flags = yield* readFlags.pipe(Effect.provide(fromConfig({ OPENCODE_DISABLE_LSP_DOWNLOAD: "true" }))) + const flags = yield* readFlags.pipe(Effect.provide(fromConfig({ CODEV_DISABLE_LSP_DOWNLOAD: "true" }))) expect(flags.disableLspDownload).toBe(true) }), @@ -171,45 +171,45 @@ describe("RuntimeFlags", () => { }), ) - it.effect("disableClaudeCodePrompt reads OPENCODE_DISABLE_CLAUDE_CODE_PROMPT", () => + it.effect("disableClaudeCodePrompt reads CODEV_DISABLE_CLAUDE_CODE_PROMPT", () => Effect.gen(function* () { - const flags = yield* readFlags.pipe(Effect.provide(fromConfig({ OPENCODE_DISABLE_CLAUDE_CODE_PROMPT: "true" }))) + const flags = yield* readFlags.pipe(Effect.provide(fromConfig({ CODEV_DISABLE_CLAUDE_CODE_PROMPT: "true" }))) expect(flags.disableClaudeCodePrompt).toBe(true) }), ) - it.effect("disableClaudeCodePrompt inherits OPENCODE_DISABLE_CLAUDE_CODE", () => + it.effect("disableClaudeCodePrompt inherits CODEV_DISABLE_CLAUDE_CODE", () => Effect.gen(function* () { - const flags = yield* readFlags.pipe(Effect.provide(fromConfig({ OPENCODE_DISABLE_CLAUDE_CODE: "true" }))) + const flags = yield* readFlags.pipe(Effect.provide(fromConfig({ CODEV_DISABLE_CLAUDE_CODE: "true" }))) expect(flags.disableClaudeCodePrompt).toBe(true) }), ) - it.effect("experimentalIconDiscovery reads OPENCODE_EXPERIMENTAL_ICON_DISCOVERY", () => + it.effect("experimentalIconDiscovery reads CODEV_EXPERIMENTAL_ICON_DISCOVERY", () => Effect.gen(function* () { - const flags = yield* readFlags.pipe(Effect.provide(fromConfig({ OPENCODE_EXPERIMENTAL_ICON_DISCOVERY: "true" }))) + const flags = yield* readFlags.pipe(Effect.provide(fromConfig({ CODEV_EXPERIMENTAL_ICON_DISCOVERY: "true" }))) expect(flags.experimentalIconDiscovery).toBe(true) }), ) - it.effect("experimentalIconDiscovery inherits OPENCODE_EXPERIMENTAL", () => + it.effect("experimentalIconDiscovery inherits CODEV_EXPERIMENTAL", () => Effect.gen(function* () { - const flags = yield* readFlags.pipe(Effect.provide(fromConfig({ OPENCODE_EXPERIMENTAL: "true" }))) + const flags = yield* readFlags.pipe(Effect.provide(fromConfig({ CODEV_EXPERIMENTAL: "true" }))) expect(flags.experimentalIconDiscovery).toBe(true) }), ) - it.effect("specific experimental flags override OPENCODE_EXPERIMENTAL", () => + it.effect("specific experimental flags override CODEV_EXPERIMENTAL", () => Effect.gen(function* () { const flags = yield* readFlags.pipe( Effect.provide( fromConfig({ - OPENCODE_EXPERIMENTAL: "true", - OPENCODE_EXPERIMENTAL_ICON_DISCOVERY: "false", + CODEV_EXPERIMENTAL: "true", + CODEV_EXPERIMENTAL_ICON_DISCOVERY: "false", }), ), ) @@ -226,12 +226,12 @@ describe("RuntimeFlags", () => { }), ) - it.effect("experimentalOxfmt is enabled by OPENCODE_EXPERIMENTAL_OXFMT", () => + it.effect("experimentalOxfmt is enabled by CODEV_EXPERIMENTAL_OXFMT", () => Effect.gen(function* () { const flags = yield* readFlags.pipe( Effect.provide( fromConfig({ - OPENCODE_EXPERIMENTAL_OXFMT: "true", + CODEV_EXPERIMENTAL_OXFMT: "true", }), ), ) @@ -240,12 +240,12 @@ describe("RuntimeFlags", () => { }), ) - it.effect("experimentalOxfmt inherits OPENCODE_EXPERIMENTAL", () => + it.effect("experimentalOxfmt inherits CODEV_EXPERIMENTAL", () => Effect.gen(function* () { const flags = yield* readFlags.pipe( Effect.provide( fromConfig({ - OPENCODE_EXPERIMENTAL: "true", + CODEV_EXPERIMENTAL: "true", }), ), ) @@ -258,19 +258,19 @@ describe("RuntimeFlags", () => { { name: "absent", config: {}, expected: undefined }, { name: "valid positive integer", - config: { OPENCODE_EXPERIMENTAL_BASH_DEFAULT_TIMEOUT_MS: "1234" }, + config: { CODEV_EXPERIMENTAL_BASH_DEFAULT_TIMEOUT_MS: "1234" }, expected: 1234, }, { name: "invalid string", - config: { OPENCODE_EXPERIMENTAL_BASH_DEFAULT_TIMEOUT_MS: "nope" }, + config: { CODEV_EXPERIMENTAL_BASH_DEFAULT_TIMEOUT_MS: "nope" }, expected: undefined, }, - { name: "zero", config: { OPENCODE_EXPERIMENTAL_BASH_DEFAULT_TIMEOUT_MS: "0" }, expected: undefined }, - { name: "negative", config: { OPENCODE_EXPERIMENTAL_BASH_DEFAULT_TIMEOUT_MS: "-1" }, expected: undefined }, + { name: "zero", config: { CODEV_EXPERIMENTAL_BASH_DEFAULT_TIMEOUT_MS: "0" }, expected: undefined }, + { name: "negative", config: { CODEV_EXPERIMENTAL_BASH_DEFAULT_TIMEOUT_MS: "-1" }, expected: undefined }, { name: "non-integer", - config: { OPENCODE_EXPERIMENTAL_BASH_DEFAULT_TIMEOUT_MS: "1.5" }, + config: { CODEV_EXPERIMENTAL_BASH_DEFAULT_TIMEOUT_MS: "1.5" }, expected: undefined, }, ]) { @@ -287,19 +287,19 @@ describe("RuntimeFlags", () => { { name: "absent", config: {}, expected: undefined }, { name: "valid positive integer", - config: { OPENCODE_EXPERIMENTAL_OUTPUT_TOKEN_MAX: "1234" }, + config: { CODEV_EXPERIMENTAL_OUTPUT_TOKEN_MAX: "1234" }, expected: 1234, }, { name: "invalid string", - config: { OPENCODE_EXPERIMENTAL_OUTPUT_TOKEN_MAX: "nope" }, + config: { CODEV_EXPERIMENTAL_OUTPUT_TOKEN_MAX: "nope" }, expected: undefined, }, - { name: "zero", config: { OPENCODE_EXPERIMENTAL_OUTPUT_TOKEN_MAX: "0" }, expected: undefined }, - { name: "negative", config: { OPENCODE_EXPERIMENTAL_OUTPUT_TOKEN_MAX: "-1" }, expected: undefined }, + { name: "zero", config: { CODEV_EXPERIMENTAL_OUTPUT_TOKEN_MAX: "0" }, expected: undefined }, + { name: "negative", config: { CODEV_EXPERIMENTAL_OUTPUT_TOKEN_MAX: "-1" }, expected: undefined }, { name: "non-integer", - config: { OPENCODE_EXPERIMENTAL_OUTPUT_TOKEN_MAX: "1.5" }, + config: { CODEV_EXPERIMENTAL_OUTPUT_TOKEN_MAX: "1.5" }, expected: undefined, }, ]) { @@ -319,14 +319,14 @@ describe("RuntimeFlags", () => { Effect.provide( ConfigProvider.layer( ConfigProvider.fromUnknown({ - OPENCODE_PURE: "true", - OPENCODE_DISABLE_DEFAULT_PLUGINS: "true", - OPENCODE_DISABLE_EXTERNAL_SKILLS: "true", - OPENCODE_DISABLE_LSP_DOWNLOAD: "true", - OPENCODE_EXPERIMENTAL: "true", - OPENCODE_ENABLE_EXA: "true", - OPENCODE_EXPERIMENTAL_BASH_DEFAULT_TIMEOUT_MS: "1234", - OPENCODE_CLIENT: "desktop", + CODEV_PURE: "true", + CODEV_DISABLE_DEFAULT_PLUGINS: "true", + CODEV_DISABLE_EXTERNAL_SKILLS: "true", + CODEV_DISABLE_LSP_DOWNLOAD: "true", + CODEV_EXPERIMENTAL: "true", + CODEV_ENABLE_EXA: "true", + CODEV_EXPERIMENTAL_BASH_DEFAULT_TIMEOUT_MS: "1234", + CODEV_CLIENT: "desktop", }), ), ), @@ -356,17 +356,17 @@ describe("RuntimeFlags", () => { }), ) - it.effect("disableClaudeCodeSkills reads OPENCODE_DISABLE_CLAUDE_CODE_SKILLS", () => + it.effect("disableClaudeCodeSkills reads CODEV_DISABLE_CLAUDE_CODE_SKILLS", () => Effect.gen(function* () { - const flags = yield* readFlags.pipe(Effect.provide(fromConfig({ OPENCODE_DISABLE_CLAUDE_CODE_SKILLS: "true" }))) + const flags = yield* readFlags.pipe(Effect.provide(fromConfig({ CODEV_DISABLE_CLAUDE_CODE_SKILLS: "true" }))) expect(flags.disableClaudeCodeSkills).toBe(true) }), ) - it.effect("disableClaudeCodeSkills inherits OPENCODE_DISABLE_CLAUDE_CODE", () => + it.effect("disableClaudeCodeSkills inherits CODEV_DISABLE_CLAUDE_CODE", () => Effect.gen(function* () { - const flags = yield* readFlags.pipe(Effect.provide(fromConfig({ OPENCODE_DISABLE_CLAUDE_CODE: "true" }))) + const flags = yield* readFlags.pipe(Effect.provide(fromConfig({ CODEV_DISABLE_CLAUDE_CODE: "true" }))) expect(flags.disableClaudeCodeSkills).toBe(true) }), diff --git a/packages/opencode/test/fixture/flag.ts b/packages/opencode/test/fixture/flag.ts index cf00d9e7b2..d13e3f0038 100644 --- a/packages/opencode/test/fixture/flag.ts +++ b/packages/opencode/test/fixture/flag.ts @@ -3,17 +3,17 @@ import { Flag } from "@opencode-ai/core/flag/flag" import { Effect, Scope } from "effect" /** - * Scoped override for `Flag.OPENCODE_WORKSPACE_ID`. Saves the previous value + * Scoped override for `Flag.CODEV_WORKSPACE_ID`. Saves the previous value * on entry and restores it via finalizer when the surrounding scope closes — * preserves the original try/finally semantics regardless of test outcome. */ export function withFixedWorkspaceID(id: WorkspaceV2.ID): Effect.Effect { return Effect.gen(function* () { - const previous = Flag.OPENCODE_WORKSPACE_ID - Flag.OPENCODE_WORKSPACE_ID = id + const previous = Flag.CODEV_WORKSPACE_ID + Flag.CODEV_WORKSPACE_ID = id yield* Effect.addFinalizer(() => Effect.sync(() => { - Flag.OPENCODE_WORKSPACE_ID = previous + Flag.CODEV_WORKSPACE_ID = previous }), ) }) diff --git a/packages/opencode/test/fixture/plugin-meta-worker.ts b/packages/opencode/test/fixture/plugin-meta-worker.ts index c02b448ae7..d61eb7c5a4 100644 --- a/packages/opencode/test/fixture/plugin-meta-worker.ts +++ b/packages/opencode/test/fixture/plugin-meta-worker.ts @@ -12,7 +12,7 @@ if (typeof msg.file !== "string" || typeof msg.spec !== "string" || typeof msg.t } if (typeof msg.id !== "string") throw new Error("Invalid worker payload") -process.env.OPENCODE_PLUGIN_META_FILE = msg.file +process.env.CODEV_PLUGIN_META_FILE = msg.file const { PluginMeta } = await import("../../src/plugin/meta") diff --git a/packages/opencode/test/fixture/tui-runtime.ts b/packages/opencode/test/fixture/tui-runtime.ts index 4ff9bbb943..366777e838 100644 --- a/packages/opencode/test/fixture/tui-runtime.ts +++ b/packages/opencode/test/fixture/tui-runtime.ts @@ -30,7 +30,7 @@ export function createTuiResolvedConfig(input: ResolvedInput = {}): HostResolved } export function mockTuiRuntime(dir: string, plugin: PluginSpec[], opts?: { plugin_enabled?: Record }) { - process.env.OPENCODE_PLUGIN_META_FILE = path.join(dir, "plugin-meta.json") + process.env.CODEV_PLUGIN_META_FILE = path.join(dir, "plugin-meta.json") const plugin_origins = plugin.map((spec) => ({ spec, scope: "local" as const, @@ -50,7 +50,7 @@ export function mockTuiRuntime(dir: string, plugin: PluginSpec[], opts?: { plugi restore: () => { cwd.mockRestore() wait.mockRestore() - delete process.env.OPENCODE_PLUGIN_META_FILE + delete process.env.CODEV_PLUGIN_META_FILE }, } } diff --git a/packages/opencode/test/ide/ide.test.ts b/packages/opencode/test/ide/ide.test.ts index e10700e80f..0ca58e4c24 100644 --- a/packages/opencode/test/ide/ide.test.ts +++ b/packages/opencode/test/ide/ide.test.ts @@ -62,20 +62,20 @@ describe("ide", () => { expect(Ide.ide()).toBe("unknown") }) - test("should recognize vscode-insiders OPENCODE_CALLER", () => { - process.env["OPENCODE_CALLER"] = "vscode-insiders" + test("should recognize vscode-insiders CODEV_CALLER", () => { + process.env["CODEV_CALLER"] = "vscode-insiders" expect(Ide.alreadyInstalled()).toBe(true) }) - test("should recognize vscode OPENCODE_CALLER", () => { - process.env["OPENCODE_CALLER"] = "vscode" + test("should recognize vscode CODEV_CALLER", () => { + process.env["CODEV_CALLER"] = "vscode" expect(Ide.alreadyInstalled()).toBe(true) }) - test("should return false for unknown OPENCODE_CALLER", () => { - process.env["OPENCODE_CALLER"] = "unknown" + test("should return false for unknown CODEV_CALLER", () => { + process.env["CODEV_CALLER"] = "unknown" expect(Ide.alreadyInstalled()).toBe(false) }) diff --git a/packages/opencode/test/lib/cli-process.ts b/packages/opencode/test/lib/cli-process.ts index 5f9fb7b03e..ef8a18ed4c 100644 --- a/packages/opencode/test/lib/cli-process.ts +++ b/packages/opencode/test/lib/cli-process.ts @@ -6,11 +6,11 @@ // the original /event race or #27371's invalid-model hang). // // Configuration flows through codev's built-in test affordances: -// - OPENCODE_CONFIG_CONTENT : provider config inline, no files to find -// - OPENCODE_TEST_HOME : pins os.homedir() → tmpdir -// - OPENCODE_DISABLE_PROJECT_CONFIG : skip walking up for codev.json -// - OPENCODE_PURE : skip external plugin discovery + install -// - OPENCODE_DISABLE_AUTOUPDATE / AUTOCOMPACT / MODELS_FETCH : no background work +// - CODEV_CONFIG_CONTENT : provider config inline, no files to find +// - CODEV_TEST_HOME : pins os.homedir() → tmpdir +// - CODEV_DISABLE_PROJECT_CONFIG : skip walking up for codev.json +// - CODEV_PURE : skip external plugin discovery + install +// - CODEV_DISABLE_AUTOUPDATE / AUTOCOMPACT / MODELS_FETCH : no background work // Plus HOME / XDG_* pointing at the tmpdir for belt-and-suspenders isolation. // // Today only `opencode.run` is fully wired. The shape supports adding more @@ -61,19 +61,19 @@ function forkStderrDrain(stream: ReadableStream, into: string[]) { function isolatedEnv(home: string, configJson: string): Record { return { - OPENCODE_TEST_HOME: home, + CODEV_TEST_HOME: home, HOME: home, XDG_CONFIG_HOME: path.join(home, ".config"), XDG_DATA_HOME: path.join(home, ".local/share"), XDG_STATE_HOME: path.join(home, ".local/state"), XDG_CACHE_HOME: path.join(home, ".cache"), - OPENCODE_CONFIG_CONTENT: configJson, - OPENCODE_DISABLE_PROJECT_CONFIG: "1", - OPENCODE_PURE: "1", - OPENCODE_DISABLE_AUTOUPDATE: "1", - OPENCODE_DISABLE_AUTOCOMPACT: "1", - OPENCODE_DISABLE_MODELS_FETCH: "1", - OPENCODE_AUTH_CONTENT: "{}", + CODEV_CONFIG_CONTENT: configJson, + CODEV_DISABLE_PROJECT_CONFIG: "1", + CODEV_PURE: "1", + CODEV_DISABLE_AUTOUPDATE: "1", + CODEV_DISABLE_AUTOCOMPACT: "1", + CODEV_DISABLE_MODELS_FETCH: "1", + CODEV_AUTH_CONTENT: "{}", } } @@ -266,7 +266,7 @@ export function withCliFixture( ...opts, env: { ...opts.env, - OPENCODE_CONFIG_CONTENT: JSON.stringify({ + CODEV_CONFIG_CONTENT: JSON.stringify({ ...testProviderConfig(llm.url), permission: opts.permission, }), diff --git a/packages/opencode/test/plugin/meta.test.ts b/packages/opencode/test/plugin/meta.test.ts index d48c22c97b..05378dc6d7 100644 --- a/packages/opencode/test/plugin/meta.test.ts +++ b/packages/opencode/test/plugin/meta.test.ts @@ -23,7 +23,7 @@ async function map(file: string): Promise> { } afterEach(() => { - delete process.env.OPENCODE_PLUGIN_META_FILE + delete process.env.CODEV_PLUGIN_META_FILE }) describe("plugin.meta", () => { @@ -36,8 +36,8 @@ describe("plugin.meta", () => { }, }) - process.env.OPENCODE_PLUGIN_META_FILE = path.join(tmp.path, "state", "plugin-meta.json") - const file = process.env.OPENCODE_PLUGIN_META_FILE! + process.env.CODEV_PLUGIN_META_FILE = path.join(tmp.path, "state", "plugin-meta.json") + const file = process.env.CODEV_PLUGIN_META_FILE! const spec = pathToFileURL(tmp.extra.file).href const one = await PluginMeta.touch(spec, spec, "demo.file") @@ -77,8 +77,8 @@ describe("plugin.meta", () => { }, }) - process.env.OPENCODE_PLUGIN_META_FILE = path.join(tmp.path, "state", "plugin-meta.json") - const file = process.env.OPENCODE_PLUGIN_META_FILE! + process.env.CODEV_PLUGIN_META_FILE = path.join(tmp.path, "state", "plugin-meta.json") + const file = process.env.CODEV_PLUGIN_META_FILE! const one = await PluginMeta.touch("acme-plugin@latest", tmp.extra.mod, "acme-plugin") expect(one.state).toBe("first") @@ -108,8 +108,8 @@ describe("plugin.meta", () => { }, }) - process.env.OPENCODE_PLUGIN_META_FILE = path.join(tmp.path, "state", "plugin-meta.json") - const file = process.env.OPENCODE_PLUGIN_META_FILE! + process.env.CODEV_PLUGIN_META_FILE = path.join(tmp.path, "state", "plugin-meta.json") + const file = process.env.CODEV_PLUGIN_META_FILE! const spec = pathToFileURL(tmp.extra.file).href const n = 12 diff --git a/packages/opencode/test/preload.ts b/packages/opencode/test/preload.ts index 16b4789b07..9285aefd2f 100644 --- a/packages/opencode/test/preload.ts +++ b/packages/opencode/test/preload.ts @@ -35,19 +35,19 @@ process.env["XDG_DATA_HOME"] = path.join(dir, "share") process.env["XDG_CACHE_HOME"] = path.join(dir, "cache") process.env["XDG_CONFIG_HOME"] = path.join(dir, "config") process.env["XDG_STATE_HOME"] = path.join(dir, "state") -process.env["OPENCODE_MODELS_PATH"] = path.join(import.meta.dir, "tool", "fixtures", "models-api.json") -process.env["OPENCODE_EXPERIMENTAL_EVENT_SYSTEM"] = "true" -process.env["OPENCODE_EXPERIMENTAL_WORKSPACES"] = "true" +process.env["CODEV_MODELS_PATH"] = path.join(import.meta.dir, "tool", "fixtures", "models-api.json") +process.env["CODEV_EXPERIMENTAL_EVENT_SYSTEM"] = "true" +process.env["CODEV_EXPERIMENTAL_WORKSPACES"] = "true" // Set test home directory to isolate tests from user's actual home directory // This prevents tests from picking up real user configs/skills from ~/.claude/skills const testHome = path.join(dir, "home") await fs.mkdir(testHome, { recursive: true }) -process.env["OPENCODE_TEST_HOME"] = testHome +process.env["CODEV_TEST_HOME"] = testHome // Set test managed config directory to isolate tests from system managed settings const testManagedConfigDir = path.join(dir, "managed") -process.env["OPENCODE_TEST_MANAGED_CONFIG_DIR"] = testManagedConfigDir +process.env["CODEV_TEST_MANAGED_CONFIG_DIR"] = testManagedConfigDir // Write the cache version file to prevent global/index.ts from clearing the cache const cacheDir = path.join(dir, "cache", "opencode") @@ -75,16 +75,16 @@ delete process.env["DEEPSEEK_API_KEY"] delete process.env["FIREWORKS_API_KEY"] delete process.env["CEREBRAS_API_KEY"] delete process.env["SAMBANOVA_API_KEY"] -delete process.env["OPENCODE_SERVER_PASSWORD"] -delete process.env["OPENCODE_SERVER_USERNAME"] -delete process.env["OPENCODE_EXPERIMENTAL"] -delete process.env["OPENCODE_ENABLE_EXPERIMENTAL_MODELS"] +delete process.env["CODEV_SERVER_PASSWORD"] +delete process.env["CODEV_SERVER_USERNAME"] +delete process.env["CODEV_EXPERIMENTAL"] +delete process.env["CODEV_ENABLE_EXPERIMENTAL_MODELS"] delete process.env["OTEL_EXPORTER_OTLP_ENDPOINT"] delete process.env["OTEL_EXPORTER_OTLP_HEADERS"] delete process.env["OTEL_RESOURCE_ATTRIBUTES"] // Use in-memory sqlite -process.env["OPENCODE_DB"] = ":memory:" +process.env["CODEV_DB"] = ":memory:" // Now safe to import from src/ const { initProjectors } = await import("../src/server/projectors") diff --git a/packages/opencode/test/provider/digitalocean.test.ts b/packages/opencode/test/provider/digitalocean.test.ts index 144335c73b..23b3bbcfcf 100644 --- a/packages/opencode/test/provider/digitalocean.test.ts +++ b/packages/opencode/test/provider/digitalocean.test.ts @@ -29,7 +29,7 @@ const withEnv = (values: Record, effect: Effect.Effect< const withAuth = (metadata: Record | undefined, effect: Effect.Effect) => withEnv( { - OPENCODE_AUTH_CONTENT: JSON.stringify({ + CODEV_AUTH_CONTENT: JSON.stringify({ digitalocean: { type: "api", key: "sk_do_test", diff --git a/packages/opencode/test/provider/header-timeout.test.ts b/packages/opencode/test/provider/header-timeout.test.ts index 1bd27b5cdd..9ef2ce853e 100644 --- a/packages/opencode/test/provider/header-timeout.test.ts +++ b/packages/opencode/test/provider/header-timeout.test.ts @@ -214,15 +214,15 @@ async function delayedBodyServer(delay: number): Promise<{ server: Server; url: function withAuthContent(self: Effect.Effect, value: Record = defaultAuthContent()) { return Effect.acquireUseRelease( Effect.sync(() => { - const previous = process.env.OPENCODE_AUTH_CONTENT - process.env.OPENCODE_AUTH_CONTENT = JSON.stringify(value) + const previous = process.env.CODEV_AUTH_CONTENT + process.env.CODEV_AUTH_CONTENT = JSON.stringify(value) return previous }), () => self, (previous) => Effect.sync(() => { - if (previous === undefined) delete process.env.OPENCODE_AUTH_CONTENT - else process.env.OPENCODE_AUTH_CONTENT = previous + if (previous === undefined) delete process.env.CODEV_AUTH_CONTENT + else process.env.CODEV_AUTH_CONTENT = previous }), ) } diff --git a/packages/opencode/test/provider/provider.test.ts b/packages/opencode/test/provider/provider.test.ts index 44d8b249a7..6159ecd4a2 100644 --- a/packages/opencode/test/provider/provider.test.ts +++ b/packages/opencode/test/provider/provider.test.ts @@ -1148,7 +1148,7 @@ it.instance("ModelNotFoundError for provider includes suggestions", () => it.instance("ModelNotFoundError suggests catalog models for unloaded providers", () => Effect.gen(function* () { - yield* remove("OPENCODE_API_KEY") + yield* remove("CODEV_API_KEY") const error = yield* Provider.use .getModel(ProviderV2.ID.opencode, ModelV2.ID.make("claude-haiku-fake-model")) .pipe(Effect.flip) diff --git a/packages/opencode/test/server/auth.test.ts b/packages/opencode/test/server/auth.test.ts index 1278e8c72e..ff92c1d1e1 100644 --- a/packages/opencode/test/server/auth.test.ts +++ b/packages/opencode/test/server/auth.test.ts @@ -4,27 +4,27 @@ import { Flag } from "@opencode-ai/core/flag/flag" import { ServerAuth } from "../../src/server/auth" const original = { - OPENCODE_SERVER_PASSWORD: Flag.OPENCODE_SERVER_PASSWORD, - OPENCODE_SERVER_USERNAME: Flag.OPENCODE_SERVER_USERNAME, + CODEV_SERVER_PASSWORD: Flag.CODEV_SERVER_PASSWORD, + CODEV_SERVER_USERNAME: Flag.CODEV_SERVER_USERNAME, } afterEach(() => { - Flag.OPENCODE_SERVER_PASSWORD = original.OPENCODE_SERVER_PASSWORD - Flag.OPENCODE_SERVER_USERNAME = original.OPENCODE_SERVER_USERNAME + Flag.CODEV_SERVER_PASSWORD = original.CODEV_SERVER_PASSWORD + Flag.CODEV_SERVER_USERNAME = original.CODEV_SERVER_USERNAME }) describe("ServerAuth", () => { test("does not emit auth headers without a password", () => { - Flag.OPENCODE_SERVER_PASSWORD = undefined - Flag.OPENCODE_SERVER_USERNAME = "alice" + Flag.CODEV_SERVER_PASSWORD = undefined + Flag.CODEV_SERVER_USERNAME = "alice" expect(ServerAuth.header()).toBeUndefined() expect(ServerAuth.headers()).toBeUndefined() }) test("defaults to the opencode username", () => { - Flag.OPENCODE_SERVER_PASSWORD = "secret" - Flag.OPENCODE_SERVER_USERNAME = undefined + Flag.CODEV_SERVER_PASSWORD = "secret" + Flag.CODEV_SERVER_USERNAME = undefined expect(ServerAuth.headers()).toEqual({ Authorization: `Basic ${Buffer.from("opencode:secret").toString("base64")}`, @@ -32,8 +32,8 @@ describe("ServerAuth", () => { }) test("uses the configured username", () => { - Flag.OPENCODE_SERVER_PASSWORD = "secret" - Flag.OPENCODE_SERVER_USERNAME = "alice" + Flag.CODEV_SERVER_PASSWORD = "secret" + Flag.CODEV_SERVER_USERNAME = "alice" expect(ServerAuth.headers()).toEqual({ Authorization: `Basic ${Buffer.from("alice:secret").toString("base64")}`, @@ -41,8 +41,8 @@ describe("ServerAuth", () => { }) test("prefers explicit credentials", () => { - Flag.OPENCODE_SERVER_PASSWORD = "secret" - Flag.OPENCODE_SERVER_USERNAME = "alice" + Flag.CODEV_SERVER_PASSWORD = "secret" + Flag.CODEV_SERVER_USERNAME = "alice" expect(ServerAuth.headers({ password: "cli-secret", username: "bob" })).toEqual({ Authorization: `Basic ${Buffer.from("bob:cli-secret").toString("base64")}`, diff --git a/packages/opencode/test/server/httpapi-cors.test.ts b/packages/opencode/test/server/httpapi-cors.test.ts index 4e9680c7ce..df700556a4 100644 --- a/packages/opencode/test/server/httpapi-cors.test.ts +++ b/packages/opencode/test/server/httpapi-cors.test.ts @@ -13,13 +13,13 @@ import { testEffect } from "../lib/effect" const testStateLayer = Layer.effectDiscard( Effect.gen(function* () { const original = { - OPENCODE_SERVER_PASSWORD: Flag.OPENCODE_SERVER_PASSWORD, + CODEV_SERVER_PASSWORD: Flag.CODEV_SERVER_PASSWORD, } - Flag.OPENCODE_SERVER_PASSWORD = "secret" + Flag.CODEV_SERVER_PASSWORD = "secret" yield* Effect.promise(() => resetDatabase()) yield* Effect.addFinalizer(() => Effect.promise(async () => { - Flag.OPENCODE_SERVER_PASSWORD = original.OPENCODE_SERVER_PASSWORD + Flag.CODEV_SERVER_PASSWORD = original.CODEV_SERVER_PASSWORD await resetDatabase() }), ) @@ -64,7 +64,7 @@ describe("HttpApi CORS", () => { Effect.gen(function* () { const handler = HttpRouter.toWebHandler( HttpApiApp.createRoutes().pipe( - Layer.provide(ConfigProvider.layer(ConfigProvider.fromUnknown({ OPENCODE_SERVER_PASSWORD: "secret" }))), + Layer.provide(ConfigProvider.layer(ConfigProvider.fromUnknown({ CODEV_SERVER_PASSWORD: "secret" }))), ), { disableLogger: true }, ).handler diff --git a/packages/opencode/test/server/httpapi-exercise/backend.ts b/packages/opencode/test/server/httpapi-exercise/backend.ts index a10b008972..29f6d4d39f 100644 --- a/packages/opencode/test/server/httpapi-exercise/backend.ts +++ b/packages/opencode/test/server/httpapi-exercise/backend.ts @@ -60,7 +60,7 @@ function app(modules: Runtime, options: CallOptions) { modules.HttpApiApp.routes.pipe( Layer.provide( ConfigProvider.layer( - ConfigProvider.fromUnknown({ OPENCODE_SERVER_PASSWORD: password, OPENCODE_SERVER_USERNAME: username }), + ConfigProvider.fromUnknown({ CODEV_SERVER_PASSWORD: password, CODEV_SERVER_USERNAME: username }), ), ), ), diff --git a/packages/opencode/test/server/httpapi-exercise/environment.ts b/packages/opencode/test/server/httpapi-exercise/environment.ts index 2dc09da6d4..26f40267be 100644 --- a/packages/opencode/test/server/httpapi-exercise/environment.ts +++ b/packages/opencode/test/server/httpapi-exercise/environment.ts @@ -3,15 +3,15 @@ import { Effect } from "effect" import fs from "fs" import path from "path" -const preserveExerciseGlobalRoot = !!process.env.OPENCODE_HTTPAPI_EXERCISE_GLOBAL +const preserveExerciseGlobalRoot = !!process.env.CODEV_HTTPAPI_EXERCISE_GLOBAL export const exerciseGlobalRoot = - process.env.OPENCODE_HTTPAPI_EXERCISE_GLOBAL ?? + process.env.CODEV_HTTPAPI_EXERCISE_GLOBAL ?? path.join(process.env.TMPDIR ?? "/tmp", `opencode-httpapi-global-${process.pid}`) process.env.XDG_DATA_HOME = path.join(exerciseGlobalRoot, "data") process.env.XDG_CONFIG_HOME = path.join(exerciseGlobalRoot, "config") process.env.XDG_STATE_HOME = path.join(exerciseGlobalRoot, "state") process.env.XDG_CACHE_HOME = path.join(exerciseGlobalRoot, "cache") -process.env.OPENCODE_DISABLE_SHARE = "true" +process.env.CODEV_DISABLE_SHARE = "true" export const exerciseConfigDirectory = path.join(exerciseGlobalRoot, "config", "codev") export const exerciseDataDirectory = path.join(exerciseGlobalRoot, "data", "codev") @@ -19,20 +19,20 @@ export const exerciseDataDirectory = path.join(exerciseGlobalRoot, "data", "code // scenarios. Opt back in via codev.json (global config.json support was // removed with the codev.json rename; updateGlobal patch-merges keys, so the // global.config.update scenario cannot clobber this); actual share network -// calls stay stubbed by OPENCODE_DISABLE_SHARE above. +// calls stay stubbed by CODEV_DISABLE_SHARE above. fs.mkdirSync(exerciseConfigDirectory, { recursive: true }) fs.writeFileSync(path.join(exerciseConfigDirectory, "codev.json"), JSON.stringify({ share: "manual" }, null, 2)) -const preserveExerciseDatabase = !!process.env.OPENCODE_HTTPAPI_EXERCISE_DB +const preserveExerciseDatabase = !!process.env.CODEV_HTTPAPI_EXERCISE_DB export const exerciseDatabasePath = - process.env.OPENCODE_HTTPAPI_EXERCISE_DB ?? + process.env.CODEV_HTTPAPI_EXERCISE_DB ?? path.join(process.env.TMPDIR ?? "/tmp", `opencode-httpapi-exercise-${process.pid}.db`) -process.env.OPENCODE_DB = exerciseDatabasePath -Flag.OPENCODE_DB = exerciseDatabasePath +process.env.CODEV_DB = exerciseDatabasePath +Flag.CODEV_DB = exerciseDatabasePath export const original = { - OPENCODE_SERVER_PASSWORD: Flag.OPENCODE_SERVER_PASSWORD, - OPENCODE_SERVER_USERNAME: Flag.OPENCODE_SERVER_USERNAME, + CODEV_SERVER_PASSWORD: Flag.CODEV_SERVER_PASSWORD, + CODEV_SERVER_USERNAME: Flag.CODEV_SERVER_USERNAME, } export const cleanupExercisePaths = Effect.promise(async () => { diff --git a/packages/opencode/test/server/httpapi-exercise/index.ts b/packages/opencode/test/server/httpapi-exercise/index.ts index 6b19549543..2c33e63033 100644 --- a/packages/opencode/test/server/httpapi-exercise/index.ts +++ b/packages/opencode/test/server/httpapi-exercise/index.ts @@ -6,7 +6,7 @@ * requests, uses the right instance context, mutates storage when expected, and * returns the expected response shape. * - * The script intentionally isolates `OPENCODE_DB` before importing modules that touch + * The script intentionally isolates `CODEV_DB` before importing modules that touch * storage. Scenarios may create/delete sessions and reset the database after each run, * so this must never point at a developer's real session database. * diff --git a/packages/opencode/test/server/httpapi-exercise/runner.ts b/packages/opencode/test/server/httpapi-exercise/runner.ts index b7ad6d6208..44eaa6abea 100644 --- a/packages/opencode/test/server/httpapi-exercise/runner.ts +++ b/packages/opencode/test/server/httpapi-exercise/runner.ts @@ -258,8 +258,8 @@ function fakeLlmConfig(url: string): Partial { const resetState = Effect.promise(async () => { const modules = await runtime() - Flag.OPENCODE_SERVER_PASSWORD = original.OPENCODE_SERVER_PASSWORD - Flag.OPENCODE_SERVER_USERNAME = original.OPENCODE_SERVER_USERNAME + Flag.CODEV_SERVER_PASSWORD = original.CODEV_SERVER_PASSWORD + Flag.CODEV_SERVER_USERNAME = original.CODEV_SERVER_USERNAME await disposeApps() await modules.disposeAllInstances() await modules.resetDatabase() diff --git a/packages/opencode/test/server/httpapi-instance-route-auth.test.ts b/packages/opencode/test/server/httpapi-instance-route-auth.test.ts index 9933a28bdc..1fe3d12ac1 100644 --- a/packages/opencode/test/server/httpapi-instance-route-auth.test.ts +++ b/packages/opencode/test/server/httpapi-instance-route-auth.test.ts @@ -15,8 +15,8 @@ function app(input: { password?: string; username?: string }) { Layer.provide( ConfigProvider.layer( ConfigProvider.fromUnknown({ - OPENCODE_SERVER_PASSWORD: input.password, - OPENCODE_SERVER_USERNAME: input.username, + CODEV_SERVER_PASSWORD: input.password, + CODEV_SERVER_USERNAME: input.username, }), ), ), diff --git a/packages/opencode/test/server/httpapi-instance.test.ts b/packages/opencode/test/server/httpapi-instance.test.ts index 5bbd6d7cc0..93eed3b44c 100644 --- a/packages/opencode/test/server/httpapi-instance.test.ts +++ b/packages/opencode/test/server/httpapi-instance.test.ts @@ -24,12 +24,12 @@ import { testEffect } from "../lib/effect" // repeat it. const testStateLayer = Layer.effectDiscard( Effect.gen(function* () { - const originalWorkspaces = Flag.OPENCODE_EXPERIMENTAL_WORKSPACES - Flag.OPENCODE_EXPERIMENTAL_WORKSPACES = true + const originalWorkspaces = Flag.CODEV_EXPERIMENTAL_WORKSPACES + Flag.CODEV_EXPERIMENTAL_WORKSPACES = true yield* Effect.promise(() => resetDatabase()) yield* Effect.addFinalizer(() => Effect.promise(async () => { - Flag.OPENCODE_EXPERIMENTAL_WORKSPACES = originalWorkspaces + Flag.CODEV_EXPERIMENTAL_WORKSPACES = originalWorkspaces await resetDatabase() }), ) @@ -75,11 +75,11 @@ describe("instance HttpApi", () => { it.live("emits a sync fence header for fixed-workspace mutations", () => Effect.gen(function* () { - const originalWorkspaceID = Flag.OPENCODE_WORKSPACE_ID - Flag.OPENCODE_WORKSPACE_ID = WorkspaceV2.ID.ascending() + const originalWorkspaceID = Flag.CODEV_WORKSPACE_ID + Flag.CODEV_WORKSPACE_ID = WorkspaceV2.ID.ascending() yield* Effect.addFinalizer(() => Effect.sync(() => { - Flag.OPENCODE_WORKSPACE_ID = originalWorkspaceID + Flag.CODEV_WORKSPACE_ID = originalWorkspaceID }), ) @@ -97,11 +97,11 @@ describe("instance HttpApi", () => { it.live("does not emit sync fence headers for fixed-workspace reads or no-op mutations", () => Effect.gen(function* () { - const originalWorkspaceID = Flag.OPENCODE_WORKSPACE_ID - Flag.OPENCODE_WORKSPACE_ID = WorkspaceV2.ID.ascending() + const originalWorkspaceID = Flag.CODEV_WORKSPACE_ID + Flag.CODEV_WORKSPACE_ID = WorkspaceV2.ID.ascending() yield* Effect.addFinalizer(() => Effect.sync(() => { - Flag.OPENCODE_WORKSPACE_ID = originalWorkspaceID + Flag.CODEV_WORKSPACE_ID = originalWorkspaceID }), ) diff --git a/packages/opencode/test/server/httpapi-listen.test.ts b/packages/opencode/test/server/httpapi-listen.test.ts index 46b76b7b03..8cb688071b 100644 --- a/packages/opencode/test/server/httpapi-listen.test.ts +++ b/packages/opencode/test/server/httpapi-listen.test.ts @@ -10,38 +10,38 @@ import { resetDatabase } from "../fixture/db" import { disposeAllInstances, tmpdir } from "../fixture/fixture" const original = { - OPENCODE_SERVER_PASSWORD: Flag.OPENCODE_SERVER_PASSWORD, - OPENCODE_SERVER_USERNAME: Flag.OPENCODE_SERVER_USERNAME, - envPassword: process.env.OPENCODE_SERVER_PASSWORD, - envUsername: process.env.OPENCODE_SERVER_USERNAME, + CODEV_SERVER_PASSWORD: Flag.CODEV_SERVER_PASSWORD, + CODEV_SERVER_USERNAME: Flag.CODEV_SERVER_USERNAME, + envPassword: process.env.CODEV_SERVER_PASSWORD, + envUsername: process.env.CODEV_SERVER_USERNAME, } const auth = { username: "opencode", password: "listen-secret" } const testPty = process.platform === "win32" ? test.skip : test afterEach(async () => { - Flag.OPENCODE_SERVER_PASSWORD = original.OPENCODE_SERVER_PASSWORD - Flag.OPENCODE_SERVER_USERNAME = original.OPENCODE_SERVER_USERNAME - if (original.envPassword === undefined) delete process.env.OPENCODE_SERVER_PASSWORD - else process.env.OPENCODE_SERVER_PASSWORD = original.envPassword - if (original.envUsername === undefined) delete process.env.OPENCODE_SERVER_USERNAME - else process.env.OPENCODE_SERVER_USERNAME = original.envUsername + Flag.CODEV_SERVER_PASSWORD = original.CODEV_SERVER_PASSWORD + Flag.CODEV_SERVER_USERNAME = original.CODEV_SERVER_USERNAME + if (original.envPassword === undefined) delete process.env.CODEV_SERVER_PASSWORD + else process.env.CODEV_SERVER_PASSWORD = original.envPassword + if (original.envUsername === undefined) delete process.env.CODEV_SERVER_USERNAME + else process.env.CODEV_SERVER_USERNAME = original.envUsername await disposeAllInstances() await resetDatabase() }) async function startListener() { - Flag.OPENCODE_SERVER_PASSWORD = auth.password - Flag.OPENCODE_SERVER_USERNAME = auth.username - process.env.OPENCODE_SERVER_PASSWORD = auth.password - process.env.OPENCODE_SERVER_USERNAME = auth.username + Flag.CODEV_SERVER_PASSWORD = auth.password + Flag.CODEV_SERVER_USERNAME = auth.username + process.env.CODEV_SERVER_PASSWORD = auth.password + process.env.CODEV_SERVER_USERNAME = auth.username return Server.listen({ hostname: "127.0.0.1", port: 0 }) } async function startNoAuthListener() { - Flag.OPENCODE_SERVER_PASSWORD = undefined - Flag.OPENCODE_SERVER_USERNAME = auth.username - delete process.env.OPENCODE_SERVER_PASSWORD - process.env.OPENCODE_SERVER_USERNAME = auth.username + Flag.CODEV_SERVER_PASSWORD = undefined + Flag.CODEV_SERVER_USERNAME = auth.username + delete process.env.CODEV_SERVER_PASSWORD + process.env.CODEV_SERVER_USERNAME = auth.username return Server.listen({ hostname: "127.0.0.1", port: 0 }) } @@ -329,8 +329,8 @@ describe("HttpApi Server.listen", () => { return { initialized, completed } }, }) - const previous = process.env.OPENCODE_DISABLE_DEFAULT_PLUGINS - process.env.OPENCODE_DISABLE_DEFAULT_PLUGINS = "1" + const previous = process.env.CODEV_DISABLE_DEFAULT_PLUGINS + process.env.CODEV_DISABLE_DEFAULT_PLUGINS = "1" let listener: Awaited> | undefined try { listener = await startListener() @@ -348,8 +348,8 @@ describe("HttpApi Server.listen", () => { expect(await Bun.file(tmp.extra.initialized).text()).toBe("initialized\n") } finally { if (listener) await stop(listener, "timed out cleaning up plugin client listener").catch(() => undefined) - if (previous === undefined) delete process.env.OPENCODE_DISABLE_DEFAULT_PLUGINS - else process.env.OPENCODE_DISABLE_DEFAULT_PLUGINS = previous + if (previous === undefined) delete process.env.CODEV_DISABLE_DEFAULT_PLUGINS + else process.env.CODEV_DISABLE_DEFAULT_PLUGINS = previous } }) diff --git a/packages/opencode/test/server/httpapi-mdns.test.ts b/packages/opencode/test/server/httpapi-mdns.test.ts index 6dc122384e..b835f11e99 100644 --- a/packages/opencode/test/server/httpapi-mdns.test.ts +++ b/packages/opencode/test/server/httpapi-mdns.test.ts @@ -26,22 +26,22 @@ void mock.module("bonjour-service", () => ({ const { Server } = await import("../../src/server/server") const original = { - OPENCODE_SERVER_PASSWORD: Flag.OPENCODE_SERVER_PASSWORD, - OPENCODE_SERVER_USERNAME: Flag.OPENCODE_SERVER_USERNAME, + CODEV_SERVER_PASSWORD: Flag.CODEV_SERVER_PASSWORD, + CODEV_SERVER_USERNAME: Flag.CODEV_SERVER_USERNAME, } afterEach(async () => { events.length = 0 - Flag.OPENCODE_SERVER_PASSWORD = original.OPENCODE_SERVER_PASSWORD - Flag.OPENCODE_SERVER_USERNAME = original.OPENCODE_SERVER_USERNAME + Flag.CODEV_SERVER_PASSWORD = original.CODEV_SERVER_PASSWORD + Flag.CODEV_SERVER_USERNAME = original.CODEV_SERVER_USERNAME await disposeAllInstances() await resetDatabase() }) describe("HttpApi Server.listen mDNS", () => { test("skips publish for loopback hostnames", async () => { - Flag.OPENCODE_SERVER_PASSWORD = "mdns-secret" - Flag.OPENCODE_SERVER_USERNAME = "opencode" + Flag.CODEV_SERVER_PASSWORD = "mdns-secret" + Flag.CODEV_SERVER_USERNAME = "opencode" const listener = await Server.listen({ hostname: "127.0.0.1", port: 0, mdns: true }) try { expect(events.filter((e) => e.kind === "publish")).toEqual([]) @@ -52,8 +52,8 @@ describe("HttpApi Server.listen mDNS", () => { }) test("publishes for non-loopback hostnames and unpublishes on stop", async () => { - Flag.OPENCODE_SERVER_PASSWORD = "mdns-secret" - Flag.OPENCODE_SERVER_USERNAME = "opencode" + Flag.CODEV_SERVER_PASSWORD = "mdns-secret" + Flag.CODEV_SERVER_USERNAME = "opencode" const listener = await Server.listen({ hostname: "0.0.0.0", port: 0, mdns: true }) try { const published = events.filter((e) => e.kind === "publish") @@ -68,8 +68,8 @@ describe("HttpApi Server.listen mDNS", () => { }) test("scope finalizer unpublishes even if stop() is not called for force-close", async () => { - Flag.OPENCODE_SERVER_PASSWORD = "mdns-secret" - Flag.OPENCODE_SERVER_USERNAME = "opencode" + Flag.CODEV_SERVER_PASSWORD = "mdns-secret" + Flag.CODEV_SERVER_USERNAME = "opencode" const listener = await Server.listen({ hostname: "0.0.0.0", port: 0, mdns: true }) expect(events.filter((e) => e.kind === "publish").length).toBe(1) // Plain (graceful) stop without close=true should still unpublish. diff --git a/packages/opencode/test/server/httpapi-provider.test.ts b/packages/opencode/test/server/httpapi-provider.test.ts index 2cbd9c5f9d..48cd92f9b3 100644 --- a/packages/opencode/test/server/httpapi-provider.test.ts +++ b/packages/opencode/test/server/httpapi-provider.test.ts @@ -356,7 +356,7 @@ describe("provider HttpApi", () => { Effect.gen(function* () { const directory = (yield* TestInstance).directory yield* setEnvScoped( - "OPENCODE_AUTH_CONTENT", + "CODEV_AUTH_CONTENT", JSON.stringify({ google: { type: "oauth", refresh: "dummy", access: "dummy", expires: 9999999999999 }, }), diff --git a/packages/opencode/test/server/httpapi-query-schema-drift.test.ts b/packages/opencode/test/server/httpapi-query-schema-drift.test.ts index f5411767ed..4f7cc9bdf0 100644 --- a/packages/opencode/test/server/httpapi-query-schema-drift.test.ts +++ b/packages/opencode/test/server/httpapi-query-schema-drift.test.ts @@ -30,7 +30,7 @@ import { resetDatabase } from "../fixture/db" import { disposeAllInstances, tmpdir } from "../fixture/fixture" import { it } from "../lib/effect" -const originalWorkspaces = Flag.OPENCODE_EXPERIMENTAL_WORKSPACES +const originalWorkspaces = Flag.CODEV_EXPERIMENTAL_WORKSPACES type Method = "get" | "post" | "put" | "delete" | "patch" type QuerySchema = { readonly fields: Record } @@ -144,7 +144,7 @@ function assertAdvertisedQueryParamsAreRuntimeFields(input: { } afterEach(async () => { - Flag.OPENCODE_EXPERIMENTAL_WORKSPACES = originalWorkspaces + Flag.CODEV_EXPERIMENTAL_WORKSPACES = originalWorkspaces await disposeAllInstances() await resetDatabase() }) diff --git a/packages/opencode/test/server/httpapi-sdk.test.ts b/packages/opencode/test/server/httpapi-sdk.test.ts index 1af1687646..004dcfff42 100644 --- a/packages/opencode/test/server/httpapi-sdk.test.ts +++ b/packages/opencode/test/server/httpapi-sdk.test.ts @@ -39,8 +39,8 @@ const appLayer = AppNodeBuilder.build( const it = testEffect(Layer.mergeAll(appLayer, httpApiLayer)) const original = { - OPENCODE_SERVER_PASSWORD: Flag.OPENCODE_SERVER_PASSWORD, - OPENCODE_SERVER_USERNAME: Flag.OPENCODE_SERVER_USERNAME, + CODEV_SERVER_PASSWORD: Flag.CODEV_SERVER_PASSWORD, + CODEV_SERVER_USERNAME: Flag.CODEV_SERVER_USERNAME, } type ServerPath = "default" | "raw" @@ -88,8 +88,8 @@ function serverFetch( return HttpServer.HttpServer.use((server) => Effect.sync(() => { void serverPath - Flag.OPENCODE_SERVER_PASSWORD = input?.password - Flag.OPENCODE_SERVER_USERNAME = input?.username + Flag.CODEV_SERVER_PASSWORD = input?.password + Flag.CODEV_SERVER_USERNAME = input?.username const baseUrl = HttpServer.formatAddress(server.address) return Object.assign( async (request: RequestInfo | URL, init?: RequestInit) => { @@ -328,8 +328,8 @@ function seedMessage(directory: string, sessionID: string) { } afterEach(async () => { - Flag.OPENCODE_SERVER_PASSWORD = original.OPENCODE_SERVER_PASSWORD - Flag.OPENCODE_SERVER_USERNAME = original.OPENCODE_SERVER_USERNAME + Flag.CODEV_SERVER_PASSWORD = original.CODEV_SERVER_PASSWORD + Flag.CODEV_SERVER_USERNAME = original.CODEV_SERVER_USERNAME await disposeAllInstances() await resetDatabase() }) diff --git a/packages/opencode/test/server/httpapi-session.test.ts b/packages/opencode/test/server/httpapi-session.test.ts index 9d7643cb33..9396172e35 100644 --- a/packages/opencode/test/server/httpapi-session.test.ts +++ b/packages/opencode/test/server/httpapi-session.test.ts @@ -38,7 +38,7 @@ import { TestLLMServer } from "../lib/llm-server" import { testProviderConfig } from "../lib/test-provider" import { pollWithTimeout, testEffect } from "../lib/effect" -const originalWorkspaces = Flag.OPENCODE_EXPERIMENTAL_WORKSPACES +const originalWorkspaces = Flag.CODEV_EXPERIMENTAL_WORKSPACES const noopBootstrapLayer = Layer.succeed( InstanceBootstrapService.Service, InstanceBootstrapService.Service.of({ run: Effect.void }), @@ -229,7 +229,7 @@ function requestJson(path: string, init?: RequestInit) { } afterEach(async () => { - Flag.OPENCODE_EXPERIMENTAL_WORKSPACES = originalWorkspaces + Flag.CODEV_EXPERIMENTAL_WORKSPACES = originalWorkspaces await disposeAllInstances() await resetDatabase() }) @@ -797,7 +797,7 @@ describe("session HttpApi", () => { () => Effect.gen(function* () { const test = yield* TestInstance - Flag.OPENCODE_EXPERIMENTAL_WORKSPACES = true + Flag.CODEV_EXPERIMENTAL_WORKSPACES = true const project = yield* Project.use.fromDirectory(test.directory) const workspace = yield* createLocalWorkspace({ projectID: project.project.id, diff --git a/packages/opencode/test/server/httpapi-sync.test.ts b/packages/opencode/test/server/httpapi-sync.test.ts index 0577e6bf02..ac8fcdf8fe 100644 --- a/packages/opencode/test/server/httpapi-sync.test.ts +++ b/packages/opencode/test/server/httpapi-sync.test.ts @@ -10,13 +10,13 @@ import { disposeAllInstances, TestInstance } from "../fixture/fixture" import { testEffect } from "../lib/effect" import { httpApiLayer, requestInDirectory } from "./httpapi-layer" -const originalWorkspaces = Flag.OPENCODE_EXPERIMENTAL_WORKSPACES +const originalWorkspaces = Flag.CODEV_EXPERIMENTAL_WORKSPACES const context = Context.empty() as Context.Context const it = testEffect(Layer.mergeAll(LayerNode.compile(Session.node), httpApiLayer)) afterEach(async () => { mock.restore() - Flag.OPENCODE_EXPERIMENTAL_WORKSPACES = originalWorkspaces + Flag.CODEV_EXPERIMENTAL_WORKSPACES = originalWorkspaces await disposeAllInstances() await resetDatabase() }) @@ -26,7 +26,7 @@ describe("sync HttpApi", () => { "serves sync routes", () => Effect.gen(function* () { - Flag.OPENCODE_EXPERIMENTAL_WORKSPACES = true + Flag.CODEV_EXPERIMENTAL_WORKSPACES = true const tmp = yield* TestInstance const headers = { "x-opencode-directory": tmp.directory, "content-type": "application/json" } const session = yield* Session.use.create({ title: "sync" }) diff --git a/packages/opencode/test/server/httpapi-ui.test.ts b/packages/opencode/test/server/httpapi-ui.test.ts index 2f10193f3d..5e68d688a0 100644 --- a/packages/opencode/test/server/httpapi-ui.test.ts +++ b/packages/opencode/test/server/httpapi-ui.test.ts @@ -23,18 +23,18 @@ import { testEffect } from "../lib/effect" const testStateLayer = Layer.effectDiscard( Effect.gen(function* () { const original = { - OPENCODE_SERVER_PASSWORD: Flag.OPENCODE_SERVER_PASSWORD, - OPENCODE_SERVER_USERNAME: Flag.OPENCODE_SERVER_USERNAME, - envPassword: process.env.OPENCODE_SERVER_PASSWORD, - envUsername: process.env.OPENCODE_SERVER_USERNAME, + CODEV_SERVER_PASSWORD: Flag.CODEV_SERVER_PASSWORD, + CODEV_SERVER_USERNAME: Flag.CODEV_SERVER_USERNAME, + envPassword: process.env.CODEV_SERVER_PASSWORD, + envUsername: process.env.CODEV_SERVER_USERNAME, } yield* Effect.addFinalizer(() => Effect.sync(() => { - Flag.OPENCODE_SERVER_PASSWORD = original.OPENCODE_SERVER_PASSWORD - Flag.OPENCODE_SERVER_USERNAME = original.OPENCODE_SERVER_USERNAME - restoreEnv("OPENCODE_SERVER_PASSWORD", original.envPassword) - restoreEnv("OPENCODE_SERVER_USERNAME", original.envUsername) + Flag.CODEV_SERVER_PASSWORD = original.CODEV_SERVER_PASSWORD + Flag.CODEV_SERVER_USERNAME = original.CODEV_SERVER_USERNAME + restoreEnv("CODEV_SERVER_PASSWORD", original.envPassword) + restoreEnv("CODEV_SERVER_USERNAME", original.envUsername) }), ) }), @@ -64,8 +64,8 @@ function app(input?: { password?: string; username?: string }) { Layer.provide( ConfigProvider.layer( ConfigProvider.fromUnknown({ - OPENCODE_SERVER_PASSWORD: input?.password, - OPENCODE_SERVER_USERNAME: input?.username, + CODEV_SERVER_PASSWORD: input?.password, + CODEV_SERVER_USERNAME: input?.username, }), ), ), diff --git a/packages/opencode/test/server/httpapi-workspace.test.ts b/packages/opencode/test/server/httpapi-workspace.test.ts index 4cb9f55c84..f3b9d5d608 100644 --- a/packages/opencode/test/server/httpapi-workspace.test.ts +++ b/packages/opencode/test/server/httpapi-workspace.test.ts @@ -24,7 +24,7 @@ import { InstancePaths } from "../../src/server/routes/instance/httpapi/groups/i import { testEffect } from "../lib/effect" import { httpApiLayer, requestInDirectory } from "./httpapi-layer" -const originalWorkspaces = Flag.OPENCODE_EXPERIMENTAL_WORKSPACES +const originalWorkspaces = Flag.CODEV_EXPERIMENTAL_WORKSPACES const appLayer = AppNodeBuilder.build( LayerNode.group([Project.node, Session.node, Workspace.node, InstanceStore.node, Database.node, Ripgrep.node]), [[InstanceStore.bootstrapNode, InstanceBootstrap.node]], @@ -169,7 +169,7 @@ function eventStreamResponse() { afterEach(async () => { mock.restore() - Flag.OPENCODE_EXPERIMENTAL_WORKSPACES = originalWorkspaces + Flag.CODEV_EXPERIMENTAL_WORKSPACES = originalWorkspaces await disposeAllInstances() await resetDatabase() }) @@ -202,7 +202,7 @@ describe("workspace HttpApi", () => { it.live("serves mutation endpoints", () => Effect.gen(function* () { - Flag.OPENCODE_EXPERIMENTAL_WORKSPACES = true + Flag.CODEV_EXPERIMENTAL_WORKSPACES = true const dir = yield* tmpdirScoped({ git: true }) const project = yield* Project.use.fromDirectory(dir) registerAdapter(project.project.id, "local-test", localAdapter(path.join(dir, ".workspace"))) @@ -236,7 +236,7 @@ describe("workspace HttpApi", () => { it.live("serves list sync endpoint", () => Effect.gen(function* () { - Flag.OPENCODE_EXPERIMENTAL_WORKSPACES = true + Flag.CODEV_EXPERIMENTAL_WORKSPACES = true const dir = yield* tmpdirScoped({ git: true }) const project = yield* Project.use.fromDirectory(dir) const type = `listed-${Math.random().toString(36).slice(2)}` @@ -280,7 +280,7 @@ describe("workspace HttpApi", () => { it.live("creates workspace with the TUI payload shape", () => Effect.gen(function* () { - Flag.OPENCODE_EXPERIMENTAL_WORKSPACES = true + Flag.CODEV_EXPERIMENTAL_WORKSPACES = true const dir = yield* tmpdirScoped({ git: true }) const project = yield* Project.use.fromDirectory(dir) registerAdapter(project.project.id, "local-test", localAdapter(path.join(dir, ".workspace"))) @@ -301,7 +301,7 @@ describe("workspace HttpApi", () => { it.live("creates a real git worktree workspace via the builtin adapter", () => Effect.gen(function* () { - Flag.OPENCODE_EXPERIMENTAL_WORKSPACES = true + Flag.CODEV_EXPERIMENTAL_WORKSPACES = true const dir = yield* tmpdirScoped({ git: true }) const created = yield* requestServer(WorkspacePaths.list, dir, { @@ -319,7 +319,7 @@ describe("workspace HttpApi", () => { it.live("routes local workspace requests through the workspace target directory", () => Effect.gen(function* () { - Flag.OPENCODE_EXPERIMENTAL_WORKSPACES = true + Flag.CODEV_EXPERIMENTAL_WORKSPACES = true const dir = yield* tmpdirScoped({ git: true }) const workspaceDir = path.join(dir, ".workspace-local") const project = yield* Project.use.fromDirectory(dir) @@ -344,7 +344,7 @@ describe("workspace HttpApi", () => { it.live("proxies remote workspace HTTP requests with sanitized forwarding", () => Effect.gen(function* () { - Flag.OPENCODE_EXPERIMENTAL_WORKSPACES = true + Flag.CODEV_EXPERIMENTAL_WORKSPACES = true const dir = yield* tmpdirScoped({ git: true }) const proxied: ProxiedRequest[] = [] const remote = listenRemoteHttp((request) => { @@ -439,7 +439,7 @@ describe("workspace HttpApi", () => { it.live("proxies remote workspace requests selected from session ownership", () => Effect.gen(function* () { - Flag.OPENCODE_EXPERIMENTAL_WORKSPACES = true + Flag.CODEV_EXPERIMENTAL_WORKSPACES = true const dir = yield* tmpdirScoped({ git: true }) const proxied: ProxiedRequest[] = [] const remote = listenRemoteHttp((request) => { diff --git a/packages/opencode/test/server/session-messages.test.ts b/packages/opencode/test/server/session-messages.test.ts index c47913bde5..c3bb1f6829 100644 --- a/packages/opencode/test/server/session-messages.test.ts +++ b/packages/opencode/test/server/session-messages.test.ts @@ -28,15 +28,15 @@ const withoutWatcher = (effect: Effect.Effect) => { if (process.platform !== "win32") return effect return Effect.acquireUseRelease( Effect.sync(() => { - const previous = process.env.OPENCODE_EXPERIMENTAL_DISABLE_FILEWATCHER - process.env.OPENCODE_EXPERIMENTAL_DISABLE_FILEWATCHER = "true" + const previous = process.env.CODEV_EXPERIMENTAL_DISABLE_FILEWATCHER + process.env.CODEV_EXPERIMENTAL_DISABLE_FILEWATCHER = "true" return previous }), () => effect, (previous) => Effect.sync(() => { - if (previous === undefined) delete process.env.OPENCODE_EXPERIMENTAL_DISABLE_FILEWATCHER - else process.env.OPENCODE_EXPERIMENTAL_DISABLE_FILEWATCHER = previous + if (previous === undefined) delete process.env.CODEV_EXPERIMENTAL_DISABLE_FILEWATCHER + else process.env.CODEV_EXPERIMENTAL_DISABLE_FILEWATCHER = previous }), ) } diff --git a/packages/opencode/test/server/worktree-endpoint-repro.test.ts b/packages/opencode/test/server/worktree-endpoint-repro.test.ts index 62a6185886..7f3296ff0a 100644 --- a/packages/opencode/test/server/worktree-endpoint-repro.test.ts +++ b/packages/opencode/test/server/worktree-endpoint-repro.test.ts @@ -13,14 +13,14 @@ import { testEffect } from "../lib/effect" const stateLayer = Layer.effectDiscard( Effect.gen(function* () { const original = { - OPENCODE_EXPERIMENTAL_WORKSPACES: Flag.OPENCODE_EXPERIMENTAL_WORKSPACES, + CODEV_EXPERIMENTAL_WORKSPACES: Flag.CODEV_EXPERIMENTAL_WORKSPACES, } - Flag.OPENCODE_EXPERIMENTAL_WORKSPACES = true + Flag.CODEV_EXPERIMENTAL_WORKSPACES = true yield* Effect.addFinalizer(() => Effect.promise(async () => { - Flag.OPENCODE_EXPERIMENTAL_WORKSPACES = original.OPENCODE_EXPERIMENTAL_WORKSPACES + Flag.CODEV_EXPERIMENTAL_WORKSPACES = original.CODEV_EXPERIMENTAL_WORKSPACES await resetDatabase() }), ) diff --git a/packages/opencode/test/session/llm-native-recorded.test.ts b/packages/opencode/test/session/llm-native-recorded.test.ts index 3a54abdfec..18146d2082 100644 --- a/packages/opencode/test/session/llm-native-recorded.test.ts +++ b/packages/opencode/test/session/llm-native-recorded.test.ts @@ -79,7 +79,7 @@ const recordOpenAIOAuth = (() => { })() function decodeRecordOpenAIOAuth() { - const value = process.env.OPENCODE_RECORD_OPENAI_AUTH + const value = process.env.CODEV_RECORD_OPENAI_AUTH if (!value) return undefined try { const auth = Option.getOrUndefined(decodeAuth(JSON.parse(value))) @@ -120,7 +120,7 @@ const RECORDED_SCENARIOS = [ cassette: "session/native-openai-tool-loop", protocol: "openai-responses", tags: ["opencode", "native", "tool-loop"], - canRecord: () => Boolean(envValue("OPENCODE_RECORD_OPENAI_API_KEY", "OPENAI_API_KEY")), + canRecord: () => Boolean(envValue("CODEV_RECORD_OPENAI_API_KEY", "OPENAI_API_KEY")), config: (model) => providerConfig({ providerID: ProviderV2.ID.openai, @@ -130,7 +130,7 @@ const RECORDED_SCENARIOS = [ api: "https://api.openai.com/v1", model, options: { - apiKey: envValue("OPENCODE_RECORD_OPENAI_API_KEY", "OPENAI_API_KEY") ?? "fixture-openai-key", + apiKey: envValue("CODEV_RECORD_OPENAI_API_KEY", "OPENAI_API_KEY") ?? "fixture-openai-key", baseURL: "https://api.openai.com/v1", }, }), @@ -166,18 +166,18 @@ const RECORDED_SCENARIOS = [ cassette: "session/native-zen-tool-loop", protocol: "openai-responses", tags: ["opencode", "zen", "native", "tool-loop"], - canRecord: () => Boolean(process.env.OPENCODE_RECORD_CONSOLE_TOKEN && process.env.OPENCODE_RECORD_ZEN_ORG_ID), + canRecord: () => Boolean(process.env.CODEV_RECORD_CONSOLE_TOKEN && process.env.CODEV_RECORD_ZEN_ORG_ID), config: (model) => providerConfig({ providerID: ProviderV2.ID.opencode, name: "OpenCode Zen", - env: ["OPENCODE_CONSOLE_TOKEN"], + env: ["CODEV_CONSOLE_TOKEN"], npm: "@ai-sdk/openai-compatible", - api: zenURL(process.env.OPENCODE_RECORD_ZEN_CONNECTION ?? "fixture"), + api: zenURL(process.env.CODEV_RECORD_ZEN_CONNECTION ?? "fixture"), model, options: { - apiKey: process.env.OPENCODE_RECORD_CONSOLE_TOKEN ?? "fixture-console-token", - headers: { "x-org-id": process.env.OPENCODE_RECORD_ZEN_ORG_ID ?? "fixture-org" }, + apiKey: process.env.CODEV_RECORD_CONSOLE_TOKEN ?? "fixture-console-token", + headers: { "x-org-id": process.env.CODEV_RECORD_ZEN_ORG_ID ?? "fixture-org" }, }, }), }, @@ -189,7 +189,7 @@ const RECORDED_SCENARIOS = [ cassette: "session/native-anthropic-tool-loop", protocol: "anthropic-messages", tags: ["opencode", "native", "tool-loop"], - canRecord: () => Boolean(envValue("OPENCODE_RECORD_ANTHROPIC_API_KEY", "ANTHROPIC_API_KEY")), + canRecord: () => Boolean(envValue("CODEV_RECORD_ANTHROPIC_API_KEY", "ANTHROPIC_API_KEY")), config: (model) => providerConfig({ providerID: ProviderV2.ID.anthropic, @@ -199,7 +199,7 @@ const RECORDED_SCENARIOS = [ api: "https://api.anthropic.com/v1", model, options: { - apiKey: envValue("OPENCODE_RECORD_ANTHROPIC_API_KEY", "ANTHROPIC_API_KEY") ?? "fixture-anthropic-key", + apiKey: envValue("CODEV_RECORD_ANTHROPIC_API_KEY", "ANTHROPIC_API_KEY") ?? "fixture-anthropic-key", baseURL: "https://api.anthropic.com/v1", }, }), @@ -208,7 +208,7 @@ const RECORDED_SCENARIOS = [ const shouldRecord = process.env.RECORD === "true" const selectedScenarios = new Set( - (envValue("OPENCODE_RECORDED_SCENARIO", "RECORDED_PROVIDER") ?? "") + (envValue("CODEV_RECORDED_SCENARIO", "RECORDED_PROVIDER") ?? "") .split(",") .map((item) => item.trim().toLowerCase()) .filter(Boolean), @@ -228,7 +228,7 @@ const canRun = (scenario: RecordedScenario) => const recordError = (scenario: RecordedScenario) => scenario.id === "openai-oauth" - ? "Set OPENCODE_RECORD_OPENAI_AUTH to an OAuth auth JSON object in the recording environment." + ? "Set CODEV_RECORD_OPENAI_AUTH to an OAuth auth JSON object in the recording environment." : `Missing recording credentials for ${scenario.name}.` const redactRecordedBody = (body: string) => diff --git a/packages/opencode/test/skill/skill.test.ts b/packages/opencode/test/skill/skill.test.ts index a2700a9a21..772180eb30 100644 --- a/packages/opencode/test/skill/skill.test.ts +++ b/packages/opencode/test/skill/skill.test.ts @@ -52,14 +52,14 @@ This skill is loaded from the global home directory. const withHome = (home: string, self: Effect.Effect) => Effect.acquireUseRelease( Effect.sync(() => { - const prev = process.env.OPENCODE_TEST_HOME - process.env.OPENCODE_TEST_HOME = home + const prev = process.env.CODEV_TEST_HOME + process.env.CODEV_TEST_HOME = home return prev }), () => self, (prev) => Effect.sync(() => { - process.env.OPENCODE_TEST_HOME = prev + process.env.CODEV_TEST_HOME = prev }), ) diff --git a/packages/opencode/test/tool/fixtures/models-api.json b/packages/opencode/test/tool/fixtures/models-api.json index 6302a951dd..03723e659d 100644 --- a/packages/opencode/test/tool/fixtures/models-api.json +++ b/packages/opencode/test/tool/fixtures/models-api.json @@ -28002,7 +28002,7 @@ }, "opencode-go": { "id": "opencode-go", - "env": ["OPENCODE_API_KEY"], + "env": ["CODEV_API_KEY"], "npm": "@ai-sdk/openai-compatible", "api": "https://opencode.ai/zen/go/v1", "name": "OpenCode Go", @@ -57812,7 +57812,7 @@ }, "opencode": { "id": "opencode", - "env": ["OPENCODE_API_KEY"], + "env": ["CODEV_API_KEY"], "npm": "@ai-sdk/openai-compatible", "api": "https://opencode.ai/zen/v1", "name": "OpenCode Zen", diff --git a/packages/opencode/test/tool/glob.test.ts b/packages/opencode/test/tool/glob.test.ts index 018b1a0b9a..139cc63571 100644 --- a/packages/opencode/test/tool/glob.test.ts +++ b/packages/opencode/test/tool/glob.test.ts @@ -56,15 +56,15 @@ const asks = () => { const githubBase = (url: string, self: Effect.Effect) => Effect.acquireUseRelease( Effect.sync(() => { - const previous = process.env.OPENCODE_REPO_CLONE_GITHUB_BASE_URL - process.env.OPENCODE_REPO_CLONE_GITHUB_BASE_URL = url + const previous = process.env.CODEV_REPO_CLONE_GITHUB_BASE_URL + process.env.CODEV_REPO_CLONE_GITHUB_BASE_URL = url return previous }), () => self, (previous) => Effect.sync(() => { - if (previous) process.env.OPENCODE_REPO_CLONE_GITHUB_BASE_URL = previous - else delete process.env.OPENCODE_REPO_CLONE_GITHUB_BASE_URL + if (previous) process.env.CODEV_REPO_CLONE_GITHUB_BASE_URL = previous + else delete process.env.CODEV_REPO_CLONE_GITHUB_BASE_URL }), ) diff --git a/packages/opencode/test/tool/grep.test.ts b/packages/opencode/test/tool/grep.test.ts index 81b74aa8ba..32eea3d9d7 100644 --- a/packages/opencode/test/tool/grep.test.ts +++ b/packages/opencode/test/tool/grep.test.ts @@ -47,15 +47,15 @@ const full = (p: string) => (process.platform === "win32" ? Filesystem.normalize const githubBase = (url: string, self: Effect.Effect) => Effect.acquireUseRelease( Effect.sync(() => { - const previous = process.env.OPENCODE_REPO_CLONE_GITHUB_BASE_URL - process.env.OPENCODE_REPO_CLONE_GITHUB_BASE_URL = url + const previous = process.env.CODEV_REPO_CLONE_GITHUB_BASE_URL + process.env.CODEV_REPO_CLONE_GITHUB_BASE_URL = url return previous }), () => self, (previous) => Effect.sync(() => { - if (previous) process.env.OPENCODE_REPO_CLONE_GITHUB_BASE_URL = previous - else delete process.env.OPENCODE_REPO_CLONE_GITHUB_BASE_URL + if (previous) process.env.CODEV_REPO_CLONE_GITHUB_BASE_URL = previous + else delete process.env.CODEV_REPO_CLONE_GITHUB_BASE_URL }), ) diff --git a/packages/opencode/test/tool/read.test.ts b/packages/opencode/test/tool/read.test.ts index 51698db5a2..bb7d4df18f 100644 --- a/packages/opencode/test/tool/read.test.ts +++ b/packages/opencode/test/tool/read.test.ts @@ -99,15 +99,15 @@ const glob = (p: string) => const githubBase = (url: string, self: Effect.Effect) => Effect.acquireUseRelease( Effect.sync(() => { - const previous = process.env.OPENCODE_REPO_CLONE_GITHUB_BASE_URL - process.env.OPENCODE_REPO_CLONE_GITHUB_BASE_URL = url + const previous = process.env.CODEV_REPO_CLONE_GITHUB_BASE_URL + process.env.CODEV_REPO_CLONE_GITHUB_BASE_URL = url return previous }), () => self, (previous) => Effect.sync(() => { - if (previous) process.env.OPENCODE_REPO_CLONE_GITHUB_BASE_URL = previous - else delete process.env.OPENCODE_REPO_CLONE_GITHUB_BASE_URL + if (previous) process.env.CODEV_REPO_CLONE_GITHUB_BASE_URL = previous + else delete process.env.CODEV_REPO_CLONE_GITHUB_BASE_URL }), ) const git = Effect.fn("ReadToolTest.git")(function* (cwd: string, args: string[]) { diff --git a/packages/opencode/test/tool/shell.test.ts b/packages/opencode/test/tool/shell.test.ts index a970f85d46..6dab3f49b7 100644 --- a/packages/opencode/test/tool/shell.test.ts +++ b/packages/opencode/test/tool/shell.test.ts @@ -542,7 +542,7 @@ describe("tool.shell permissions", () => { item, Effect.acquireUseRelease( Effect.sync(() => { - const key = "OPENCODE_TEST_MISSING" + const key = "CODEV_TEST_MISSING" const prev = process.env[key] delete process.env[key] return { key, prev } diff --git a/packages/opencode/test/tool/skill.test.ts b/packages/opencode/test/tool/skill.test.ts index 97244c0ba8..18bab45cff 100644 --- a/packages/opencode/test/tool/skill.test.ts +++ b/packages/opencode/test/tool/skill.test.ts @@ -50,11 +50,11 @@ Use this skill. ) yield* Effect.promise(() => Bun.write(path.join(skill, "scripts", "demo.txt"), "demo")) - const home = process.env.OPENCODE_TEST_HOME - process.env.OPENCODE_TEST_HOME = dir + const home = process.env.CODEV_TEST_HOME + process.env.CODEV_TEST_HOME = dir yield* Effect.addFinalizer(() => Effect.sync(() => { - process.env.OPENCODE_TEST_HOME = home + process.env.CODEV_TEST_HOME = home }), ) @@ -96,11 +96,11 @@ Use this skill. it.instance("execute preserves not found message", () => Effect.gen(function* () { const dir = (yield* TestInstance).directory - const home = process.env.OPENCODE_TEST_HOME - process.env.OPENCODE_TEST_HOME = dir + const home = process.env.CODEV_TEST_HOME + process.env.CODEV_TEST_HOME = dir yield* Effect.addFinalizer(() => Effect.sync(() => { - process.env.OPENCODE_TEST_HOME = home + process.env.CODEV_TEST_HOME = home }), ) diff --git a/packages/opencode/test/tool/websearch.test.ts b/packages/opencode/test/tool/websearch.test.ts index 349606dec7..2430392526 100644 --- a/packages/opencode/test/tool/websearch.test.ts +++ b/packages/opencode/test/tool/websearch.test.ts @@ -15,17 +15,17 @@ describe("websearch provider", () => { }) test("supports an operational override", () => { - const original = process.env.OPENCODE_WEBSEARCH_PROVIDER + const original = process.env.CODEV_WEBSEARCH_PROVIDER try { - process.env.OPENCODE_WEBSEARCH_PROVIDER = "parallel" + process.env.CODEV_WEBSEARCH_PROVIDER = "parallel" expect(selectWebSearchProvider(SESSION_ID)).toBe("parallel") - process.env.OPENCODE_WEBSEARCH_PROVIDER = "exa" + process.env.CODEV_WEBSEARCH_PROVIDER = "exa" expect(selectWebSearchProvider(SESSION_ID)).toBe("exa") } finally { - if (original === undefined) delete process.env.OPENCODE_WEBSEARCH_PROVIDER - else process.env.OPENCODE_WEBSEARCH_PROVIDER = original + if (original === undefined) delete process.env.CODEV_WEBSEARCH_PROVIDER + else process.env.CODEV_WEBSEARCH_PROVIDER = original } }) diff --git a/packages/opencode/test/util/process.test.ts b/packages/opencode/test/util/process.test.ts index 934833d1d0..d73b31beb2 100644 --- a/packages/opencode/test/util/process.test.ts +++ b/packages/opencode/test/util/process.test.ts @@ -69,9 +69,9 @@ describe("util.process", () => { }) test("merges environment overrides", async () => { - const out = await Process.run(node('process.stdout.write(process.env.OPENCODE_TEST ?? "")'), { + const out = await Process.run(node('process.stdout.write(process.env.CODEV_TEST ?? "")'), { env: { - OPENCODE_TEST: "set", + CODEV_TEST: "set", }, }) expect(out.stdout.toString()).toBe("set") @@ -80,15 +80,15 @@ describe("util.process", () => { test("uses shell in run on Windows", async () => { if (process.platform !== "win32") return - const out = await Process.run(["set", "OPENCODE_TEST_SHELL"], { + const out = await Process.run(["set", "CODEV_TEST_SHELL"], { shell: true, env: { - OPENCODE_TEST_SHELL: "ok", + CODEV_TEST_SHELL: "ok", }, }) expect(out.code).toBe(0) - expect(out.stdout.toString()).toContain("OPENCODE_TEST_SHELL=ok") + expect(out.stdout.toString()).toContain("CODEV_TEST_SHELL=ok") }) test("runs cmd scripts with spaces on Windows without shell", async () => { diff --git a/packages/script/src/index.ts b/packages/script/src/index.ts index b0af52a8d6..353d5ca772 100644 --- a/packages/script/src/index.ts +++ b/packages/script/src/index.ts @@ -18,21 +18,21 @@ if (!semver.satisfies(process.versions.bun, expectedBunVersionRange)) { } const env = { - OPENCODE_CHANNEL: process.env["OPENCODE_CHANNEL"], - OPENCODE_BUMP: process.env["OPENCODE_BUMP"], - OPENCODE_VERSION: process.env["OPENCODE_VERSION"], - OPENCODE_RELEASE: process.env["OPENCODE_RELEASE"], + CODEV_CHANNEL: process.env["CODEV_CHANNEL"], + CODEV_BUMP: process.env["CODEV_BUMP"], + CODEV_VERSION: process.env["CODEV_VERSION"], + CODEV_RELEASE: process.env["CODEV_RELEASE"], } const CHANNEL = await (async () => { - if (env.OPENCODE_CHANNEL) return env.OPENCODE_CHANNEL - if (env.OPENCODE_BUMP) return "latest" - if (env.OPENCODE_VERSION && !env.OPENCODE_VERSION.startsWith("0.0.0-")) return "latest" + if (env.CODEV_CHANNEL) return env.CODEV_CHANNEL + if (env.CODEV_BUMP) return "latest" + if (env.CODEV_VERSION && !env.CODEV_VERSION.startsWith("0.0.0-")) return "latest" return await $`git branch --show-current`.text().then((x) => x.trim()) })() const IS_PREVIEW = CHANNEL !== "latest" const VERSION = await (async () => { - if (env.OPENCODE_VERSION) return env.OPENCODE_VERSION + if (env.CODEV_VERSION) return env.CODEV_VERSION if (IS_PREVIEW) return `0.0.0-${CHANNEL}-${new Date().toISOString().slice(0, 16).replace(/[-:T]/g, "")}` const version = await fetch("https://registry.npmjs.org/opencode-ai/latest") .then((res) => { @@ -41,7 +41,7 @@ const VERSION = await (async () => { }) .then((data: any) => data.version) const [major, minor, patch] = version.split(".").map((x: string) => Number(x) || 0) - const t = env.OPENCODE_BUMP?.toLowerCase() + const t = env.CODEV_BUMP?.toLowerCase() if (t === "major") return `${major + 1}.0.0` if (t === "minor") return `${major}.${minor + 1}.0` return `${major}.${minor}.${patch + 1}` @@ -74,7 +74,7 @@ export const Script = { return IS_PREVIEW }, get release(): boolean { - return !!env.OPENCODE_RELEASE + return !!env.CODEV_RELEASE }, get team() { return team diff --git a/packages/sdk-next/test/embedded.test.ts b/packages/sdk-next/test/embedded.test.ts index 5c1b8b238a..9c11fe54ea 100644 --- a/packages/sdk-next/test/embedded.test.ts +++ b/packages/sdk-next/test/embedded.test.ts @@ -8,8 +8,8 @@ import type { OpenCodeEvent } from "../src" test("embedded client uses the real router and handlers", async () => { const directory = await mkdtemp(join(tmpdir(), "opencode-embedded-")) - const database = Flag.OPENCODE_DB - Flag.OPENCODE_DB = join(directory, "opencode.sqlite") + const database = Flag.CODEV_DB + Flag.CODEV_DB = join(directory, "opencode.sqlite") const { AbsolutePath, Agent, Location, Model, OpenCode, Prompt, Provider, Session, Tool } = await import("../src") const sessionID = Session.ID.make(`ses_embedded_${crypto.randomUUID()}`) const model = Model.Ref.make({ id: Model.ID.make("embedded"), providerID: Provider.ID.make("test") }) @@ -99,15 +99,15 @@ test("embedded client uses the real router and handlers", async () => { }) await Effect.runPromise(Effect.scoped(program)) } finally { - Flag.OPENCODE_DB = database + Flag.CODEV_DB = database await rm(directory, { recursive: true, force: true }) } }) test("Location-owned runner events reach the ready global client", async () => { const directory = await mkdtemp(join(tmpdir(), "opencode-embedded-events-")) - const database = Flag.OPENCODE_DB - Flag.OPENCODE_DB = join(directory, "opencode.sqlite") + const database = Flag.CODEV_DB + Flag.CODEV_DB = join(directory, "opencode.sqlite") const { AbsolutePath, Location, OpenCode, Prompt, Session } = await import("../src") const sessionID = Session.ID.make(`ses_embedded_${crypto.randomUUID()}`) @@ -138,15 +138,15 @@ test("Location-owned runner events reach the ready global client", async () => { }) await Effect.runPromise(Effect.scoped(program)) } finally { - Flag.OPENCODE_DB = database + Flag.CODEV_DB = database await rm(directory, { recursive: true, force: true }) } }, 10_000) test("independent embedded hosts do not share live notifications", async () => { const directory = await mkdtemp(join(tmpdir(), "opencode-embedded-hosts-")) - const database = Flag.OPENCODE_DB - Flag.OPENCODE_DB = join(directory, "opencode.sqlite") + const database = Flag.CODEV_DB + Flag.CODEV_DB = join(directory, "opencode.sqlite") const { AbsolutePath, Agent, Location, OpenCode, Session } = await import("../src") const sessionID = Session.ID.make(`ses_embedded_${crypto.randomUUID()}`) @@ -181,15 +181,15 @@ test("independent embedded hosts do not share live notifications", async () => { }) await Effect.runPromise(Effect.scoped(program)) } finally { - Flag.OPENCODE_DB = database + Flag.CODEV_DB = database await rm(directory, { recursive: true, force: true }) } }, 10_000) test("embedded client is available as a Layer service", async () => { const directory = await mkdtemp(join(tmpdir(), "opencode-embedded-layer-")) - const database = Flag.OPENCODE_DB - Flag.OPENCODE_DB = join(directory, "opencode.sqlite") + const database = Flag.CODEV_DB + Flag.CODEV_DB = join(directory, "opencode.sqlite") const { AbsolutePath, Location, OpenCode, Session } = await import("../src") const sessionID = Session.ID.make(`ses_embedded_${crypto.randomUUID()}`) @@ -206,7 +206,7 @@ test("embedded client is available as a Layer service", async () => { expect(created.id).toBe(sessionID) } finally { - Flag.OPENCODE_DB = database + Flag.CODEV_DB = database await rm(directory, { recursive: true, force: true }) } }) diff --git a/packages/sdk/js/src/server.ts b/packages/sdk/js/src/server.ts index 2d1ab29fc9..6d209c559e 100644 --- a/packages/sdk/js/src/server.ts +++ b/packages/sdk/js/src/server.ts @@ -35,7 +35,7 @@ export async function createOpencodeServer(options?: ServerOptions) { const proc = launch(`opencode`, args, { env: { ...process.env, - OPENCODE_CONFIG_CONTENT: JSON.stringify(options.config ?? {}), + CODEV_CONFIG_CONTENT: JSON.stringify(options.config ?? {}), }, }) let clear = () => {} @@ -119,7 +119,7 @@ export function createOpencodeTui(options?: TuiOptions) { stdio: "inherit", env: { ...process.env, - OPENCODE_CONFIG_CONTENT: JSON.stringify(options?.config ?? {}), + CODEV_CONFIG_CONTENT: JSON.stringify(options?.config ?? {}), }, }) diff --git a/packages/sdk/js/src/v2/server.ts b/packages/sdk/js/src/v2/server.ts index 48f1a253da..be2a0ad5d8 100644 --- a/packages/sdk/js/src/v2/server.ts +++ b/packages/sdk/js/src/v2/server.ts @@ -35,7 +35,7 @@ export async function createOpencodeServer(options?: ServerOptions) { const proc = launch(`opencode`, args, { env: { ...process.env, - OPENCODE_CONFIG_CONTENT: JSON.stringify(options.config ?? {}), + CODEV_CONFIG_CONTENT: JSON.stringify(options.config ?? {}), }, }) let clear = () => {} @@ -119,7 +119,7 @@ export function createOpencodeTui(options?: TuiOptions) { stdio: "inherit", env: { ...process.env, - OPENCODE_CONFIG_CONTENT: JSON.stringify(options?.config ?? {}), + CODEV_CONFIG_CONTENT: JSON.stringify(options?.config ?? {}), }, }) diff --git a/packages/server/src/auth.ts b/packages/server/src/auth.ts index c71536518d..5c81922397 100644 --- a/packages/server/src/auth.ts +++ b/packages/server/src/auth.ts @@ -28,8 +28,8 @@ export class Config extends Context.Service()("@opencode/ServerAut Effect.gen(function* () { return Config.of( yield* EffectConfig.all({ - password: EffectConfig.string("OPENCODE_SERVER_PASSWORD").pipe(EffectConfig.option), - username: EffectConfig.string("OPENCODE_SERVER_USERNAME").pipe(EffectConfig.withDefault("opencode")), + password: EffectConfig.string("CODEV_SERVER_PASSWORD").pipe(EffectConfig.option), + username: EffectConfig.string("CODEV_SERVER_USERNAME").pipe(EffectConfig.withDefault("opencode")), }), ) }), @@ -50,10 +50,10 @@ export function authorized(credentials: DecodedCredentials, config: Info) { } export function header(credentials?: Credentials) { - const password = credentials?.password ?? process.env.OPENCODE_SERVER_PASSWORD + const password = credentials?.password ?? process.env.CODEV_SERVER_PASSWORD if (!password) return undefined - return `Basic ${Buffer.from(`${credentials?.username ?? process.env.OPENCODE_SERVER_USERNAME ?? "opencode"}:${password}`).toString("base64")}` + return `Basic ${Buffer.from(`${credentials?.username ?? process.env.CODEV_SERVER_USERNAME ?? "opencode"}:${password}`).toString("base64")}` } export function headers(credentials?: Credentials) { diff --git a/packages/tui/src/app.tsx b/packages/tui/src/app.tsx index b483656ef2..bbe0efccdc 100644 --- a/packages/tui/src/app.tsx +++ b/packages/tui/src/app.tsx @@ -73,7 +73,7 @@ import { createPluginRuntime, PluginRuntimeProvider, usePluginRuntime, type TuiP import { CommandPaletteDialog } from "./component/command-palette" import { COMMAND_PALETTE_COMMAND, - OPENCODE_BASE_MODE, + CODEV_BASE_MODE, OpencodeKeymapProvider, registerOpencodeKeymap, useBindings, @@ -200,7 +200,7 @@ export const run = Effect.fn("Tui.run")(function* (input: TuiInput) { useKittyKeyboard: {}, autoFocus: false, openConsoleOnError: false, - useMouse: !Flag.OPENCODE_DISABLE_MOUSE && input.config.mouse, + useMouse: !Flag.CODEV_DISABLE_MOUSE && input.config.mouse, consoleOptions: { keyBindings: [{ name: "y", ctrl: true, action: "copy-selection" }], }, @@ -275,8 +275,8 @@ export const run = Effect.fn("Tui.run")(function* (input: TuiInput) { > @@ -424,7 +424,7 @@ function App(props: { onSnapshot?: () => Promise; pluginHost: TuiPlugi const offSelectionKeys = keymap.intercept( "key", ({ event }) => { - if (!Flag.OPENCODE_EXPERIMENTAL_DISABLE_COPY_ON_SELECT) return + if (!Flag.CODEV_EXPERIMENTAL_DISABLE_COPY_ON_SELECT) return Selection.handleSelectionKey(renderer, toast, event, clipboard) }, { priority: 1 }, @@ -452,7 +452,7 @@ function App(props: { onSnapshot?: () => Promise; pluginHost: TuiPlugi // Update terminal window title based on current route and session createEffect(() => { - if (!terminalTitleEnabled() || Flag.OPENCODE_DISABLE_TERMINAL_TITLE) return + if (!terminalTitleEnabled() || Flag.CODEV_DISABLE_TERMINAL_TITLE) return if (route.data.type === "home") { renderer.setTerminalTitle("CoDev Code") @@ -623,7 +623,7 @@ function App(props: { onSnapshot?: () => Promise; pluginHost: TuiPlugi name: "workspace.list", title: "Manage workspaces", category: "Workspace", - hidden: !Flag.OPENCODE_EXPERIMENTAL_WORKSPACES, + hidden: !Flag.CODEV_EXPERIMENTAL_WORKSPACES, slashName: "workspaces", run: () => { dialog.replace(() => ) @@ -986,7 +986,7 @@ function App(props: { onSnapshot?: () => Promise; pluginHost: TuiPlugi })) useBindings(() => ({ - mode: OPENCODE_BASE_MODE, + mode: CODEV_BASE_MODE, bindings: tuiConfig.keybinds.gather("app", appBindingCommands), })) @@ -995,7 +995,7 @@ function App(props: { onSnapshot?: () => Promise; pluginHost: TuiPlugi })) useBindings(() => ({ - mode: OPENCODE_BASE_MODE, + mode: CODEV_BASE_MODE, enabled: () => { const current = promptRef.current if (!current?.focused) return true @@ -1113,7 +1113,7 @@ function App(props: { onSnapshot?: () => Promise; pluginHost: TuiPlugi flexDirection="column" backgroundColor={theme.background} onMouseDown={(evt) => { - if (!Flag.OPENCODE_EXPERIMENTAL_DISABLE_COPY_ON_SELECT) return + if (!Flag.CODEV_EXPERIMENTAL_DISABLE_COPY_ON_SELECT) return if (evt.button !== MouseButton.RIGHT) return if (!Selection.copy(renderer, toast, clipboard)) return @@ -1121,12 +1121,12 @@ function App(props: { onSnapshot?: () => Promise; pluginHost: TuiPlugi evt.stopPropagation() }} onMouseUp={ - !Flag.OPENCODE_EXPERIMENTAL_DISABLE_COPY_ON_SELECT + !Flag.CODEV_EXPERIMENTAL_DISABLE_COPY_ON_SELECT ? () => Selection.copy(renderer, toast, clipboard) : undefined } > - + diff --git a/packages/tui/src/component/prompt/index.tsx b/packages/tui/src/component/prompt/index.tsx index f9635e24b9..bb1d98d831 100644 --- a/packages/tui/src/component/prompt/index.tsx +++ b/packages/tui/src/component/prompt/index.tsx @@ -52,7 +52,7 @@ import { createFadeIn } from "../../util/signal" import { DialogSkill } from "../dialog-skill" import { DialogWorkspaceUnavailable } from "../dialog-workspace-unavailable" import { useArgs } from "../../context/args" -import { OPENCODE_BASE_MODE, useBindings, useCommandShortcut, useLeaderActive, useOpencodeKeymap } from "../../keymap" +import { CODEV_BASE_MODE, useBindings, useCommandShortcut, useLeaderActive, useOpencodeKeymap } from "../../keymap" import { useTuiConfig } from "../../config" import { usePromptWorkspace } from "./workspace" import { usePromptMove } from "./move" @@ -542,7 +542,7 @@ export function Prompt(props: PromptProps) { desc: "Change the workspace for the session", name: "workspace.set", category: "Session", - enabled: Flag.OPENCODE_EXPERIMENTAL_WORKSPACES, + enabled: Flag.CODEV_EXPERIMENTAL_WORKSPACES, slashName: "warp", run: () => { workspace.open() @@ -569,7 +569,7 @@ export function Prompt(props: PromptProps) { })) useBindings(() => ({ - mode: OPENCODE_BASE_MODE, + mode: CODEV_BASE_MODE, bindings: tuiConfig.keybinds.gather("prompt.palette", [ "prompt.submit", "prompt.editor", diff --git a/packages/tui/src/context/editor.ts b/packages/tui/src/context/editor.ts index cf2fbbf9e6..4ad1be45b2 100644 --- a/packages/tui/src/context/editor.ts +++ b/packages/tui/src/context/editor.ts @@ -114,7 +114,7 @@ export const { use: useEditorContext, provider: EditorContextProvider } = create init: (props: { integration?: EditorIntegration; WebSocketImpl?: typeof WebSocket }) => { const paths = useTuiPaths() const editor = props.integration ?? editorIntegration - const value = process.env.CLAUDE_CODE_SSE_PORT || process.env.OPENCODE_EDITOR_SSE_PORT + const value = process.env.CLAUDE_CODE_SSE_PORT || process.env.CODEV_EDITOR_SSE_PORT const parsedPort = value ? Number.parseInt(value, 10) : undefined const port = parsedPort && Number.isInteger(parsedPort) && parsedPort > 0 && parsedPort <= 65535 ? parsedPort : undefined diff --git a/packages/tui/src/context/sdk.tsx b/packages/tui/src/context/sdk.tsx index 93180c6e21..e0bee8e98b 100644 --- a/packages/tui/src/context/sdk.tsx +++ b/packages/tui/src/context/sdk.tsx @@ -93,7 +93,7 @@ export const { use: useSDK, provider: SDKProvider } = createSimpleContext({ sseMaxRetryAttempts: 0, }) - if (Flag.OPENCODE_EXPERIMENTAL_WORKSPACES) { + if (Flag.CODEV_EXPERIMENTAL_WORKSPACES) { // Start syncing workspaces, it's important to do this after // we've started listening to events await sdk.sync.start().catch(() => {}) @@ -121,7 +121,7 @@ export const { use: useSDK, provider: SDKProvider } = createSimpleContext({ const unsub = await props.events.subscribe(handleEvent) onCleanup(unsub) - if (Flag.OPENCODE_EXPERIMENTAL_WORKSPACES) { + if (Flag.CODEV_EXPERIMENTAL_WORKSPACES) { // Start syncing workspaces, it's important to do this after // we've started listening to events await sdk.sync.start().catch(() => {}) diff --git a/packages/tui/src/editor-zed.ts b/packages/tui/src/editor-zed.ts index 8ef53ab443..d7365eac77 100644 --- a/packages/tui/src/editor-zed.ts +++ b/packages/tui/src/editor-zed.ts @@ -186,7 +186,7 @@ function isZedActiveEditorRow(row: ZedEditorRow): row is ZedActiveEditorRow { export function resolveZedDbPath() { const candidates = [ - process.env.OPENCODE_ZED_DB, + process.env.CODEV_ZED_DB, path.join(os.homedir(), "Library", "Application Support", "Zed", "db", "0-stable", "db.sqlite"), path.join(os.homedir(), ".local", "share", "zed", "db", "0-stable", "db.sqlite"), ].filter((item): item is string => Boolean(item)) diff --git a/packages/tui/src/keymap.tsx b/packages/tui/src/keymap.tsx index 8d0aefc8f5..f572de1c24 100644 --- a/packages/tui/src/keymap.tsx +++ b/packages/tui/src/keymap.tsx @@ -18,10 +18,10 @@ import { useTuiConfig } from "./config" import { TuiKeybind } from "./config/keybind" export const LEADER_TOKEN = "leader" -export const OPENCODE_BASE_MODE = "base" +export const CODEV_BASE_MODE = "base" export const COMMAND_PALETTE_COMMAND = "command.palette.show" -const OPENCODE_MODE_KEY = "opencode.mode" +const CODEV_MODE_KEY = "opencode.mode" export const OpencodeKeymapProvider = KeymapProvider export const useOpencodeKeymap = useKeymap @@ -51,11 +51,11 @@ function isVisiblePaletteCommand(command: Command) { } export function createOpencodeModeStack(keymap: OpenTuiKeymap) { - keymap.setData(OPENCODE_MODE_KEY, OPENCODE_BASE_MODE) + keymap.setData(CODEV_MODE_KEY, CODEV_BASE_MODE) const offFields = keymap.registerLayerFields({ mode(value, ctx) { - ctx.require(OPENCODE_MODE_KEY, value) + ctx.require(CODEV_MODE_KEY, value) }, }) @@ -63,12 +63,12 @@ export function createOpencodeModeStack(keymap: OpenTuiKeymap) { let disposed = false const update = () => { - keymap.setData(OPENCODE_MODE_KEY, stack.at(-1)?.mode ?? OPENCODE_BASE_MODE) + keymap.setData(CODEV_MODE_KEY, stack.at(-1)?.mode ?? CODEV_BASE_MODE) } const stackApi = { current() { - return stack.at(-1)?.mode ?? OPENCODE_BASE_MODE + return stack.at(-1)?.mode ?? CODEV_BASE_MODE }, push(mode: string) { if (disposed) return () => {} @@ -90,7 +90,7 @@ export function createOpencodeModeStack(keymap: OpenTuiKeymap) { disposed = true stack.length = 0 offFields() - keymap.setData(OPENCODE_MODE_KEY, undefined) + keymap.setData(CODEV_MODE_KEY, undefined) modeStacks.delete(keymap) }, } diff --git a/packages/tui/src/routes/session/index.tsx b/packages/tui/src/routes/session/index.tsx index 6d77b0ea58..f2f2a67fd3 100644 --- a/packages/tui/src/routes/session/index.tsx +++ b/packages/tui/src/routes/session/index.tsx @@ -79,7 +79,7 @@ import { collapseToolOutput } from "../../util/collapse-tool-output" import { usePluginRuntime } from "../../plugin/runtime" import { DialogRetryAction } from "../../component/dialog-retry-action" import { getRevertDiffFiles } from "../../util/revert-diff" -import { OPENCODE_BASE_MODE, useBindings, useCommandShortcut, useOpencodeKeymap } from "../../keymap" +import { CODEV_BASE_MODE, useBindings, useCommandShortcut, useOpencodeKeymap } from "../../keymap" import { usePathFormatter } from "../../context/path-format" import { LocationProvider } from "../../context/location" @@ -1105,12 +1105,12 @@ export function Session() { })) useBindings(() => ({ - mode: OPENCODE_BASE_MODE, + mode: CODEV_BASE_MODE, bindings: tuiConfig.keybinds.gather("session", sessionBindingCommands), })) useBindings(() => ({ - mode: OPENCODE_BASE_MODE, + mode: CODEV_BASE_MODE, enabled: foregroundTasks().length > 0, priority: 1, bindings: tuiConfig.keybinds.get("session.background"), diff --git a/packages/tui/src/routes/session/permission.tsx b/packages/tui/src/routes/session/permission.tsx index fc36cfb000..08e0bc7ea1 100644 --- a/packages/tui/src/routes/session/permission.tsx +++ b/packages/tui/src/routes/session/permission.tsx @@ -14,7 +14,7 @@ import { Locale } from "../../util/locale" import { webSearchProviderLabel } from "../../util/tool-display" import { getScrollAcceleration } from "../../util/scroll" import { useTuiConfig } from "../../config" -import { OPENCODE_BASE_MODE, useBindings, useCommandShortcut } from "../../keymap" +import { CODEV_BASE_MODE, useBindings, useCommandShortcut } from "../../keymap" import { usePathFormatter } from "../../context/path-format" type PermissionStage = "permission" | "always" | "reject" @@ -447,7 +447,7 @@ function RejectPrompt(props: { onConfirm: (message: string) => void; onCancel: ( const dimensions = useTerminalDimensions() const narrow = createMemo(() => dimensions().width < 80) useBindings(() => ({ - mode: OPENCODE_BASE_MODE, + mode: CODEV_BASE_MODE, commands: [ { name: "app.exit", @@ -542,7 +542,7 @@ function Prompt>(props: { const fullscreenHint = useCommandShortcut("permission.prompt.fullscreen") useBindings(() => ({ - mode: OPENCODE_BASE_MODE, + mode: CODEV_BASE_MODE, commands: [ { name: "app.exit", diff --git a/packages/tui/src/ui/dialog.tsx b/packages/tui/src/ui/dialog.tsx index 6aa82f54f8..cd6906e2ba 100644 --- a/packages/tui/src/ui/dialog.tsx +++ b/packages/tui/src/ui/dialog.tsx @@ -228,14 +228,14 @@ export function DialogProvider(props: ParentProps) { position="absolute" zIndex={3000} onMouseDown={(evt: { button: number; preventDefault(): void; stopPropagation(): void }) => { - if (!Flag.OPENCODE_EXPERIMENTAL_DISABLE_COPY_ON_SELECT) return + if (!Flag.CODEV_EXPERIMENTAL_DISABLE_COPY_ON_SELECT) return if (evt.button !== MouseButton.RIGHT) return if (!copySelection()) return evt.preventDefault() evt.stopPropagation() }} - onMouseUp={!Flag.OPENCODE_EXPERIMENTAL_DISABLE_COPY_ON_SELECT ? copySelection : undefined} + onMouseUp={!Flag.CODEV_EXPERIMENTAL_DISABLE_COPY_ON_SELECT ? copySelection : undefined} > { ]), }) const offBase = keymap.registerLayer({ - mode: OPENCODE_BASE_MODE, + mode: CODEV_BASE_MODE, commands: [{ name: "model.list", run() {} }], bindings: config.keybinds.gather("test.base", ["model.list"]), }) diff --git a/packages/ui/vite.config.ts b/packages/ui/vite.config.ts index 1e38adede2..9ac8f046bc 100644 --- a/packages/ui/vite.config.ts +++ b/packages/ui/vite.config.ts @@ -45,7 +45,7 @@ function providerIconsPlugin() { } async function fetchProviderIcons() { - const url = process.env.OPENCODE_MODELS_URL || "https://models.dev" + const url = process.env.CODEV_MODELS_URL || "https://models.dev" const providers = await fetch(`${url}/api.json`) .then((res) => res.json()) .then((json) => Object.keys(json)) diff --git a/packages/web/src/content/docs/acp.mdx b/packages/web/src/content/docs/acp.mdx index 43d89eae18..f55fcd6ffe 100644 --- a/packages/web/src/content/docs/acp.mdx +++ b/packages/web/src/content/docs/acp.mdx @@ -110,7 +110,7 @@ If you need to pass environment variables: command = "opencode", args = { "acp" }, env = { - OPENCODE_API_KEY = os.getenv("OPENCODE_API_KEY") + CODEV_API_KEY = os.getenv("CODEV_API_KEY") } } } @@ -138,7 +138,7 @@ require("codecompanion").setup({ This config sets up CodeCompanion to use OpenCode as the ACP agent for chat. -If you need to pass environment variables (like `OPENCODE_API_KEY`), refer to [Configuring Adapters: Environment Variables](https://codecompanion.olimorris.dev/getting-started#setting-an-api-key) in the CodeCompanion.nvim documentation for full details. +If you need to pass environment variables (like `CODEV_API_KEY`), refer to [Configuring Adapters: Environment Variables](https://codecompanion.olimorris.dev/getting-started#setting-an-api-key) in the CodeCompanion.nvim documentation for full details. ## Support diff --git a/packages/web/src/content/docs/cli.mdx b/packages/web/src/content/docs/cli.mdx index 387b57767e..3bba300c95 100644 --- a/packages/web/src/content/docs/cli.mdx +++ b/packages/web/src/content/docs/cli.mdx @@ -122,8 +122,8 @@ opencode attach http://10.20.30.40:4096 | {"--continue"} | `-c` | Continue the last session | | {"--session"} | `-s` | Session ID to continue | | {"--fork"} | | Fork the session when continuing (use with `--continue` or `--session`) | -| {"--password"} | `-p` | Basic auth password (defaults to `OPENCODE_SERVER_PASSWORD`) | -| {"--username"} | `-u` | Basic auth username (defaults to `OPENCODE_SERVER_USERNAME` or `opencode`) | +| {"--password"} | `-p` | Basic auth password (defaults to `CODEV_SERVER_PASSWORD`) | +| {"--username"} | `-u` | Basic auth username (defaults to `CODEV_SERVER_USERNAME` or `opencode`) | --- @@ -375,8 +375,8 @@ opencode run --attach http://localhost:4096 "Explain async/await in JavaScript" | {"--format"} | | Format: default (formatted) or json (raw JSON events) | | {"--title"} | | Title for the session (uses truncated prompt if no value provided) | | {"--attach"} | | Attach to a running opencode server (e.g., http://localhost:4096) | -| {"--password"} | `-p` | Basic auth password (defaults to `OPENCODE_SERVER_PASSWORD`) | -| {"--username"} | `-u` | Basic auth username (defaults to `OPENCODE_SERVER_USERNAME` or `opencode`) | +| {"--password"} | `-p` | Basic auth password (defaults to `CODEV_SERVER_PASSWORD`) | +| {"--username"} | `-u` | Basic auth username (defaults to `CODEV_SERVER_USERNAME` or `opencode`) | | {"--dir"} | | Directory to run in, or path on the remote server when attaching | | {"--port"} | | Port for the local server (defaults to random port) | | {"--variant"} | | Model variant (provider-specific reasoning effort) | @@ -393,7 +393,7 @@ Start a headless OpenCode server for API access. Check out the [server docs](/do opencode serve ``` -This starts an HTTP server that provides API access to opencode functionality without the TUI interface. Set `OPENCODE_SERVER_PASSWORD` to enable HTTP basic auth (username defaults to `opencode`). +This starts an HTTP server that provides API access to opencode functionality without the TUI interface. Set `CODEV_SERVER_PASSWORD` to enable HTTP basic auth (username defaults to `opencode`). #### Flags @@ -506,7 +506,7 @@ Start a headless OpenCode server with a web interface. opencode web ``` -This starts an HTTP server and opens a web browser to access OpenCode through a web interface. Set `OPENCODE_SERVER_PASSWORD` to enable HTTP basic auth (username defaults to `opencode`). +This starts an HTTP server and opens a web browser to access OpenCode through a web interface. Set `CODEV_SERVER_PASSWORD` to enable HTTP basic auth (username defaults to `opencode`). #### Flags @@ -679,31 +679,31 @@ OpenCode can be configured using environment variables. | Variable | Type | Description | | ------------------------------------- | ------- | ------------------------------------------------- | -| `OPENCODE_AUTO_SHARE` | boolean | Automatically share sessions | -| `OPENCODE_GIT_BASH_PATH` | string | Path to Git Bash executable on Windows | -| `OPENCODE_CONFIG` | string | Path to config file | -| `OPENCODE_TUI_CONFIG` | string | Path to TUI config file | -| `OPENCODE_CONFIG_DIR` | string | Path to config directory | -| `OPENCODE_CONFIG_CONTENT` | string | Inline json config content | -| `OPENCODE_DISABLE_AUTOUPDATE` | boolean | Disable automatic update checks | -| `OPENCODE_DISABLE_PRUNE` | boolean | Disable pruning of old data | -| `OPENCODE_DISABLE_TERMINAL_TITLE` | boolean | Disable automatic terminal title updates | -| `OPENCODE_PERMISSION` | string | Inlined json permissions config | -| `OPENCODE_DISABLE_DEFAULT_PLUGINS` | boolean | Disable default plugins | -| `OPENCODE_DISABLE_LSP_DOWNLOAD` | boolean | Disable automatic LSP server downloads | -| `OPENCODE_ENABLE_EXPERIMENTAL_MODELS` | boolean | Enable experimental models | -| `OPENCODE_DISABLE_AUTOCOMPACT` | boolean | Disable automatic context compaction | -| `OPENCODE_DISABLE_CLAUDE_CODE` | boolean | Disable reading from `.claude` (prompt + skills) | -| `OPENCODE_DISABLE_CLAUDE_CODE_PROMPT` | boolean | Disable reading `~/.claude/CLAUDE.md` | -| `OPENCODE_DISABLE_CLAUDE_CODE_SKILLS` | boolean | Disable loading `.claude/skills` | -| `OPENCODE_DISABLE_MODELS_FETCH` | boolean | Disable fetching models from remote sources | -| `OPENCODE_DISABLE_MOUSE` | boolean | Disable mouse capture in the TUI | -| `OPENCODE_FAKE_VCS` | string | Fake VCS provider for testing purposes | -| `OPENCODE_CLIENT` | string | Client identifier (defaults to `cli`) | -| `OPENCODE_ENABLE_EXA` | boolean | Enable Exa web search tools | -| `OPENCODE_SERVER_PASSWORD` | string | Enable basic auth for `serve`/`web` | -| `OPENCODE_SERVER_USERNAME` | string | Override basic auth username (default `opencode`) | -| `OPENCODE_MODELS_URL` | string | Custom URL for fetching models configuration | +| `CODEV_AUTO_SHARE` | boolean | Automatically share sessions | +| `CODEV_GIT_BASH_PATH` | string | Path to Git Bash executable on Windows | +| `CODEV_CONFIG` | string | Path to config file | +| `CODEV_TUI_CONFIG` | string | Path to TUI config file | +| `CODEV_CONFIG_DIR` | string | Path to config directory | +| `CODEV_CONFIG_CONTENT` | string | Inline json config content | +| `CODEV_DISABLE_AUTOUPDATE` | boolean | Disable automatic update checks | +| `CODEV_DISABLE_PRUNE` | boolean | Disable pruning of old data | +| `CODEV_DISABLE_TERMINAL_TITLE` | boolean | Disable automatic terminal title updates | +| `CODEV_PERMISSION` | string | Inlined json permissions config | +| `CODEV_DISABLE_DEFAULT_PLUGINS` | boolean | Disable default plugins | +| `CODEV_DISABLE_LSP_DOWNLOAD` | boolean | Disable automatic LSP server downloads | +| `CODEV_ENABLE_EXPERIMENTAL_MODELS` | boolean | Enable experimental models | +| `CODEV_DISABLE_AUTOCOMPACT` | boolean | Disable automatic context compaction | +| `CODEV_DISABLE_CLAUDE_CODE` | boolean | Disable reading from `.claude` (prompt + skills) | +| `CODEV_DISABLE_CLAUDE_CODE_PROMPT` | boolean | Disable reading `~/.claude/CLAUDE.md` | +| `CODEV_DISABLE_CLAUDE_CODE_SKILLS` | boolean | Disable loading `.claude/skills` | +| `CODEV_DISABLE_MODELS_FETCH` | boolean | Disable fetching models from remote sources | +| `CODEV_DISABLE_MOUSE` | boolean | Disable mouse capture in the TUI | +| `CODEV_FAKE_VCS` | string | Fake VCS provider for testing purposes | +| `CODEV_CLIENT` | string | Client identifier (defaults to `cli`) | +| `CODEV_ENABLE_EXA` | boolean | Enable Exa web search tools | +| `CODEV_SERVER_PASSWORD` | string | Enable basic auth for `serve`/`web` | +| `CODEV_SERVER_USERNAME` | string | Override basic auth username (default `opencode`) | +| `CODEV_MODELS_URL` | string | Custom URL for fetching models configuration | --- @@ -713,21 +713,21 @@ These environment variables enable experimental features that may change or be r | Variable | Type | Description | | ----------------------------------------------- | ------- | --------------------------------------- | -| `OPENCODE_EXPERIMENTAL` | boolean | Enable the experimental umbrella flag | -| `OPENCODE_EXPERIMENTAL_ICON_DISCOVERY` | boolean | Enable icon discovery | -| `OPENCODE_EXPERIMENTAL_DISABLE_COPY_ON_SELECT` | boolean | Disable copy on select in TUI | -| `OPENCODE_EXPERIMENTAL_BASH_DEFAULT_TIMEOUT_MS` | number | Default timeout for bash commands in ms | -| `OPENCODE_EXPERIMENTAL_OUTPUT_TOKEN_MAX` | number | Max output tokens for LLM responses | -| `OPENCODE_EXPERIMENTAL_FILEWATCHER` | boolean | Enable file watcher for entire dir | -| `OPENCODE_EXPERIMENTAL_OXFMT` | boolean | Enable oxfmt formatter | -| `OPENCODE_EXPERIMENTAL_LSP_TOOL` | boolean | Enable experimental LSP tool | -| `OPENCODE_EXPERIMENTAL_DISABLE_FILEWATCHER` | boolean | Disable file watcher | -| `OPENCODE_EXPERIMENTAL_EXA` | boolean | Enable experimental Exa features | -| `OPENCODE_EXPERIMENTAL_LSP_TY` | boolean | Enable TY LSP for python files | -| `OPENCODE_EXPERIMENTAL_PLAN_MODE` | boolean | Enable plan mode | -| `OPENCODE_EXPERIMENTAL_BACKGROUND_SUBAGENTS` | boolean | Enable background subagent tasks | -| `OPENCODE_EXPERIMENTAL_EVENT_SYSTEM` | boolean | Enable experimental event system | -| `OPENCODE_EXPERIMENTAL_NATIVE_LLM` | boolean | Enable native LLM request path | -| `OPENCODE_EXPERIMENTAL_PARALLEL` | boolean | Enable parallel web search execution | -| `OPENCODE_EXPERIMENTAL_SCOUT` | boolean | Enable Scout subagent | -| `OPENCODE_EXPERIMENTAL_WORKSPACES` | boolean | Enable workspace support | +| `CODEV_EXPERIMENTAL` | boolean | Enable the experimental umbrella flag | +| `CODEV_EXPERIMENTAL_ICON_DISCOVERY` | boolean | Enable icon discovery | +| `CODEV_EXPERIMENTAL_DISABLE_COPY_ON_SELECT` | boolean | Disable copy on select in TUI | +| `CODEV_EXPERIMENTAL_BASH_DEFAULT_TIMEOUT_MS` | number | Default timeout for bash commands in ms | +| `CODEV_EXPERIMENTAL_OUTPUT_TOKEN_MAX` | number | Max output tokens for LLM responses | +| `CODEV_EXPERIMENTAL_FILEWATCHER` | boolean | Enable file watcher for entire dir | +| `CODEV_EXPERIMENTAL_OXFMT` | boolean | Enable oxfmt formatter | +| `CODEV_EXPERIMENTAL_LSP_TOOL` | boolean | Enable experimental LSP tool | +| `CODEV_EXPERIMENTAL_DISABLE_FILEWATCHER` | boolean | Disable file watcher | +| `CODEV_EXPERIMENTAL_EXA` | boolean | Enable experimental Exa features | +| `CODEV_EXPERIMENTAL_LSP_TY` | boolean | Enable TY LSP for python files | +| `CODEV_EXPERIMENTAL_PLAN_MODE` | boolean | Enable plan mode | +| `CODEV_EXPERIMENTAL_BACKGROUND_SUBAGENTS` | boolean | Enable background subagent tasks | +| `CODEV_EXPERIMENTAL_EVENT_SYSTEM` | boolean | Enable experimental event system | +| `CODEV_EXPERIMENTAL_NATIVE_LLM` | boolean | Enable native LLM request path | +| `CODEV_EXPERIMENTAL_PARALLEL` | boolean | Enable parallel web search execution | +| `CODEV_EXPERIMENTAL_SCOUT` | boolean | Enable Scout subagent | +| `CODEV_EXPERIMENTAL_WORKSPACES` | boolean | Enable workspace support | diff --git a/packages/web/src/content/docs/config.mdx b/packages/web/src/content/docs/config.mdx index 7840f82ffc..d02caa52e4 100644 --- a/packages/web/src/content/docs/config.mdx +++ b/packages/web/src/content/docs/config.mdx @@ -45,10 +45,10 @@ Config sources are loaded in this order (later sources override earlier ones): 1. **Remote config** (from `.well-known/opencode`) - organizational defaults 2. **Global config** (`~/.config/codev/codev.json`) - user preferences -3. **Custom config** (`OPENCODE_CONFIG` env var) - custom overrides +3. **Custom config** (`CODEV_CONFIG` env var) - custom overrides 4. **Project config** (`codev.json` in project) - project-specific settings 5. **`.codev` directories** - agents, commands, plugins -6. **Inline config** (`OPENCODE_CONFIG_CONTENT` env var) - runtime overrides +6. **Inline config** (`CODEV_CONFIG_CONTENT` env var) - runtime overrides 7. **Managed config files** (`/Library/Application Support/codev/` on macOS) - admin-controlled 8. **macOS managed preferences** (`.mobileconfig` via MDM) - highest priority, not user-overridable @@ -124,10 +124,10 @@ This is also safe to be checked into Git and uses the same schema as the global ### Custom path -Specify a custom config file path using the `OPENCODE_CONFIG` environment variable. +Specify a custom config file path using the `CODEV_CONFIG` environment variable. ```bash -export OPENCODE_CONFIG=/path/to/my/custom-config.json +export CODEV_CONFIG=/path/to/my/custom-config.json opencode run "Hello world" ``` @@ -137,13 +137,13 @@ Custom config is loaded between global and project configs in the precedence ord ### Custom directory -Specify a custom config directory using the `OPENCODE_CONFIG_DIR` +Specify a custom config directory using the `CODEV_CONFIG_DIR` environment variable. This directory will be searched for agents, commands, modes, and plugins just like the standard `.codev` directory, and should follow the same structure. ```bash -export OPENCODE_CONFIG_DIR=/path/to/my/config-directory +export CODEV_CONFIG_DIR=/path/to/my/config-directory opencode run "Hello world" ``` @@ -283,7 +283,7 @@ Use a dedicated `tui.json` (or `tui.jsonc`) file for TUI-specific settings. } ``` -Use `OPENCODE_TUI_CONFIG` to point to a custom TUI config file. +Use `CODEV_TUI_CONFIG` to point to a custom TUI config file. Set `attention.enabled` to turn on TUI desktop notifications and sounds. See [TUI attention](/docs/tui#attention). @@ -880,7 +880,7 @@ Use `{env:VARIABLE_NAME}` to substitute environment variables: ```json title="codev.json" { "$schema": "https://opencode.ai/config.json", - "model": "{env:OPENCODE_MODEL}", + "model": "{env:CODEV_MODEL}", "provider": { "anthropic": { "models": {}, diff --git a/packages/web/src/content/docs/es/acp.mdx b/packages/web/src/content/docs/es/acp.mdx index 6cc14669a9..f80a3e125b 100644 --- a/packages/web/src/content/docs/es/acp.mdx +++ b/packages/web/src/content/docs/es/acp.mdx @@ -110,7 +110,7 @@ Si necesita pasar variables de entorno: command = "opencode", args = { "acp" }, env = { - OPENCODE_API_KEY = os.getenv("OPENCODE_API_KEY") + CODEV_API_KEY = os.getenv("CODEV_API_KEY") } } } @@ -138,7 +138,7 @@ require("codecompanion").setup({ Esta configuración configura CodeCompanion para usar OpenCode como agente ACP para el chat. -Si necesita pasar variables de entorno (como `OPENCODE_API_KEY`), consulte [Configuración de adaptadores: variables de entorno](https://codecompanion.olimorris.dev/getting-started#setting-an-api-key) en la documentación de CodeCompanion.nvim para obtener detalles completos. +Si necesita pasar variables de entorno (como `CODEV_API_KEY`), consulte [Configuración de adaptadores: variables de entorno](https://codecompanion.olimorris.dev/getting-started#setting-an-api-key) en la documentación de CodeCompanion.nvim para obtener detalles completos. ## Soporte diff --git a/packages/web/src/content/docs/es/cli.mdx b/packages/web/src/content/docs/es/cli.mdx index b925385cff..dbea51d76d 100644 --- a/packages/web/src/content/docs/es/cli.mdx +++ b/packages/web/src/content/docs/es/cli.mdx @@ -84,8 +84,8 @@ opencode attach http://10.20.30.40:4096 | {"--continue"} | `-c` | Continuar la última sesión | | {"--session"} | `-s` | ID de sesión para continuar | | {"--fork"} | | Bifurcar la sesión al continuar (usar con `--continue` o `--session`) | -| {"--password"} | `-p` | Contraseña de autenticación básica (predeterminada: `OPENCODE_SERVER_PASSWORD`) | -| {"--username"} | `-u` | Usuario de autenticación básica (predeterminado: `OPENCODE_SERVER_USERNAME` u `opencode`) | +| {"--password"} | `-p` | Contraseña de autenticación básica (predeterminada: `CODEV_SERVER_PASSWORD`) | +| {"--username"} | `-u` | Usuario de autenticación básica (predeterminado: `CODEV_SERVER_USERNAME` u `opencode`) | --- @@ -352,8 +352,8 @@ opencode run --attach http://localhost:4096 "Explain async/await in JavaScript" | {"--format"} | | Formato: predeterminado (formateado) o json (eventos JSON sin formato) | | {"--title"} | | Título de la sesión (utiliza un mensaje truncado si no se proporciona ningún valor) | | {"--attach"} | | Adjuntar a un servidor opencode en ejecución (por ejemplo, http://localhost:4096) | -| {"--password"} | `-p` | Contraseña de autenticación básica (predeterminada: `OPENCODE_SERVER_PASSWORD`) | -| {"--username"} | `-u` | Usuario de autenticación básica (predeterminado: `OPENCODE_SERVER_USERNAME` u `opencode`) | +| {"--password"} | `-p` | Contraseña de autenticación básica (predeterminada: `CODEV_SERVER_PASSWORD`) | +| {"--username"} | `-u` | Usuario de autenticación básica (predeterminado: `CODEV_SERVER_USERNAME` u `opencode`) | | {"--dir"} | | Directorio de ejecución, o ruta en el servidor remoto al adjuntar | | {"--variant"} | | Variante del modelo (esfuerzo de razonamiento específico del proveedor) | | {"--thinking"} | | Mostrar bloques de pensamiento | @@ -369,7 +369,7 @@ Inicie un servidor OpenCode sin cabeza para acceso API. Consulte los [documentos opencode serve ``` -Esto inicia un servidor HTTP que proporciona acceso API a la funcionalidad opencode sin la interfaz TUI. Configure `OPENCODE_SERVER_PASSWORD` para habilitar la autenticación básica HTTP (el nombre de usuario predeterminado es `opencode`). +Esto inicia un servidor HTTP que proporciona acceso API a la funcionalidad opencode sin la interfaz TUI. Configure `CODEV_SERVER_PASSWORD` para habilitar la autenticación básica HTTP (el nombre de usuario predeterminado es `opencode`). #### Opciones @@ -465,7 +465,7 @@ Inicie un servidor OpenCode sin cabeza con una interfaz web. opencode web ``` -Esto inicia un servidor HTTP y abre un navegador web para acceder a OpenCode a través de una interfaz web. Configure `OPENCODE_SERVER_PASSWORD` para habilitar la autenticación básica HTTP (el nombre de usuario predeterminado es `opencode`). +Esto inicia un servidor HTTP y abre un navegador web para acceder a OpenCode a través de una interfaz web. Configure `CODEV_SERVER_PASSWORD` para habilitar la autenticación básica HTTP (el nombre de usuario predeterminado es `opencode`). #### Opciones @@ -564,29 +564,29 @@ OpenCode se puede configurar mediante variables de entorno. | Variable | Type | Description | | ------------------------------------- | -------- | ------------------------------------------------------------------------------- | -| `OPENCODE_AUTO_SHARE` | booleano | Compartir sesiones automáticamente | -| `OPENCODE_GIT_BASH_PATH` | cadena | Ruta al ejecutable de Git Bash en Windows | -| `OPENCODE_CONFIG` | cadena | Ruta al archivo de configuración | -| `OPENCODE_CONFIG_DIR` | cadena | Ruta al directorio de configuración | -| `OPENCODE_CONFIG_CONTENT` | cadena | Contenido de configuración json en línea | -| `OPENCODE_DISABLE_AUTOUPDATE` | booleano | Deshabilitar las comprobaciones automáticas de actualizaciones | -| `OPENCODE_DISABLE_PRUNE` | booleano | Deshabilitar la poda de datos antiguos | -| `OPENCODE_DISABLE_TERMINAL_TITLE` | booleano | Deshabilitar las actualizaciones automáticas de títulos de terminal | -| `OPENCODE_PERMISSION` | cadena | Configuración de permisos json incorporados | -| `OPENCODE_DISABLE_DEFAULT_PLUGINS` | booleano | Deshabilitar complementos predeterminados | -| `OPENCODE_DISABLE_LSP_DOWNLOAD` | booleano | Deshabilitar las descargas automáticas del servidor LSP | -| `OPENCODE_ENABLE_EXPERIMENTAL_MODELS` | booleano | Habilitar modelos experimentales | -| `OPENCODE_DISABLE_AUTOCOMPACT` | booleano | Deshabilitar la compactación automática de contexto | -| `OPENCODE_DISABLE_CLAUDE_CODE` | booleano | Deshabilitar la lectura desde `.claude` (mensaje + habilidades) | -| `OPENCODE_DISABLE_CLAUDE_CODE_PROMPT` | booleano | Desactivar lectura `~/.claude/CLAUDE.md` | -| `OPENCODE_DISABLE_CLAUDE_CODE_SKILLS` | booleano | Deshabilitar la carga `.claude/skills` | -| `OPENCODE_DISABLE_MODELS_FETCH` | booleano | Deshabilitar la recuperación de modelos desde fuentes remotas | -| `OPENCODE_FAKE_VCS` | cadena | Proveedor de VCS falso para fines de prueba | -| `OPENCODE_CLIENT` | cadena | Identificador de cliente (por defecto `cli`) | -| `OPENCODE_ENABLE_EXA` | booleano | Habilitar las herramientas de búsqueda web de Exa | -| `OPENCODE_SERVER_PASSWORD` | cadena | Habilite la autenticación básica para `serve`/`web` | -| `OPENCODE_SERVER_USERNAME` | cadena | Anular el nombre de usuario de autenticación básica (predeterminado `opencode`) | -| `OPENCODE_MODELS_URL` | cadena | URL personalizada para buscar la configuración de modelos | +| `CODEV_AUTO_SHARE` | booleano | Compartir sesiones automáticamente | +| `CODEV_GIT_BASH_PATH` | cadena | Ruta al ejecutable de Git Bash en Windows | +| `CODEV_CONFIG` | cadena | Ruta al archivo de configuración | +| `CODEV_CONFIG_DIR` | cadena | Ruta al directorio de configuración | +| `CODEV_CONFIG_CONTENT` | cadena | Contenido de configuración json en línea | +| `CODEV_DISABLE_AUTOUPDATE` | booleano | Deshabilitar las comprobaciones automáticas de actualizaciones | +| `CODEV_DISABLE_PRUNE` | booleano | Deshabilitar la poda de datos antiguos | +| `CODEV_DISABLE_TERMINAL_TITLE` | booleano | Deshabilitar las actualizaciones automáticas de títulos de terminal | +| `CODEV_PERMISSION` | cadena | Configuración de permisos json incorporados | +| `CODEV_DISABLE_DEFAULT_PLUGINS` | booleano | Deshabilitar complementos predeterminados | +| `CODEV_DISABLE_LSP_DOWNLOAD` | booleano | Deshabilitar las descargas automáticas del servidor LSP | +| `CODEV_ENABLE_EXPERIMENTAL_MODELS` | booleano | Habilitar modelos experimentales | +| `CODEV_DISABLE_AUTOCOMPACT` | booleano | Deshabilitar la compactación automática de contexto | +| `CODEV_DISABLE_CLAUDE_CODE` | booleano | Deshabilitar la lectura desde `.claude` (mensaje + habilidades) | +| `CODEV_DISABLE_CLAUDE_CODE_PROMPT` | booleano | Desactivar lectura `~/.claude/CLAUDE.md` | +| `CODEV_DISABLE_CLAUDE_CODE_SKILLS` | booleano | Deshabilitar la carga `.claude/skills` | +| `CODEV_DISABLE_MODELS_FETCH` | booleano | Deshabilitar la recuperación de modelos desde fuentes remotas | +| `CODEV_FAKE_VCS` | cadena | Proveedor de VCS falso para fines de prueba | +| `CODEV_CLIENT` | cadena | Identificador de cliente (por defecto `cli`) | +| `CODEV_ENABLE_EXA` | booleano | Habilitar las herramientas de búsqueda web de Exa | +| `CODEV_SERVER_PASSWORD` | cadena | Habilite la autenticación básica para `serve`/`web` | +| `CODEV_SERVER_USERNAME` | cadena | Anular el nombre de usuario de autenticación básica (predeterminado `opencode`) | +| `CODEV_MODELS_URL` | cadena | URL personalizada para buscar la configuración de modelos | --- @@ -596,21 +596,21 @@ Estas variables de entorno habilitan funciones experimentales que pueden cambiar | Variable | Type | Description | | ----------------------------------------------- | -------- | ---------------------------------------------------------- | -| `OPENCODE_EXPERIMENTAL` | booleano | Habilitar funciones experimentales de la bandera global | -| `OPENCODE_EXPERIMENTAL_ICON_DISCOVERY` | booleano | Habilitar descubrimiento de íconos | -| `OPENCODE_EXPERIMENTAL_DISABLE_COPY_ON_SELECT` | booleano | Deshabilitar copia al seleccionar en TUI | -| `OPENCODE_EXPERIMENTAL_BASH_DEFAULT_TIMEOUT_MS` | número | Tiempo de espera predeterminado para comandos bash en ms | -| `OPENCODE_EXPERIMENTAL_OUTPUT_TOKEN_MAX` | número | Tokens de salida máximos para respuestas LLM | -| `OPENCODE_EXPERIMENTAL_FILEWATCHER` | booleano | Habilite el observador de archivos para todo el directorio | -| `OPENCODE_EXPERIMENTAL_OXFMT` | booleano | Habilitar el formateador oxfmt | -| `OPENCODE_EXPERIMENTAL_LSP_TOOL` | booleano | Habilitar herramienta experimental LSP | -| `OPENCODE_EXPERIMENTAL_DISABLE_FILEWATCHER` | booleano | Deshabilitar el observador de archivos | -| `OPENCODE_EXPERIMENTAL_EXA` | booleano | Habilitar funciones experimentales de Exa | -| `OPENCODE_EXPERIMENTAL_LSP_TY` | booleano | Habilitar Habilitar TY LSP para archivos python | -| `OPENCODE_EXPERIMENTAL_PLAN_MODE` | booleano | Habilitar modo de plan | -| `OPENCODE_EXPERIMENTAL_BACKGROUND_SUBAGENTS` | booleano | Habilitar tareas de subagentes en segundo plano | -| `OPENCODE_EXPERIMENTAL_EVENT_SYSTEM` | booleano | Habilitar sistema de eventos experimental | -| `OPENCODE_EXPERIMENTAL_NATIVE_LLM` | booleano | Habilitar ruta nativa de solicitud LLM | -| `OPENCODE_EXPERIMENTAL_PARALLEL` | booleano | Habilitar ejecución paralela de búsqueda web | -| `OPENCODE_EXPERIMENTAL_SCOUT` | booleano | Habilitar subagente Scout | -| `OPENCODE_EXPERIMENTAL_WORKSPACES` | booleano | Habilitar soporte de espacios de trabajo | +| `CODEV_EXPERIMENTAL` | booleano | Habilitar funciones experimentales de la bandera global | +| `CODEV_EXPERIMENTAL_ICON_DISCOVERY` | booleano | Habilitar descubrimiento de íconos | +| `CODEV_EXPERIMENTAL_DISABLE_COPY_ON_SELECT` | booleano | Deshabilitar copia al seleccionar en TUI | +| `CODEV_EXPERIMENTAL_BASH_DEFAULT_TIMEOUT_MS` | número | Tiempo de espera predeterminado para comandos bash en ms | +| `CODEV_EXPERIMENTAL_OUTPUT_TOKEN_MAX` | número | Tokens de salida máximos para respuestas LLM | +| `CODEV_EXPERIMENTAL_FILEWATCHER` | booleano | Habilite el observador de archivos para todo el directorio | +| `CODEV_EXPERIMENTAL_OXFMT` | booleano | Habilitar el formateador oxfmt | +| `CODEV_EXPERIMENTAL_LSP_TOOL` | booleano | Habilitar herramienta experimental LSP | +| `CODEV_EXPERIMENTAL_DISABLE_FILEWATCHER` | booleano | Deshabilitar el observador de archivos | +| `CODEV_EXPERIMENTAL_EXA` | booleano | Habilitar funciones experimentales de Exa | +| `CODEV_EXPERIMENTAL_LSP_TY` | booleano | Habilitar Habilitar TY LSP para archivos python | +| `CODEV_EXPERIMENTAL_PLAN_MODE` | booleano | Habilitar modo de plan | +| `CODEV_EXPERIMENTAL_BACKGROUND_SUBAGENTS` | booleano | Habilitar tareas de subagentes en segundo plano | +| `CODEV_EXPERIMENTAL_EVENT_SYSTEM` | booleano | Habilitar sistema de eventos experimental | +| `CODEV_EXPERIMENTAL_NATIVE_LLM` | booleano | Habilitar ruta nativa de solicitud LLM | +| `CODEV_EXPERIMENTAL_PARALLEL` | booleano | Habilitar ejecución paralela de búsqueda web | +| `CODEV_EXPERIMENTAL_SCOUT` | booleano | Habilitar subagente Scout | +| `CODEV_EXPERIMENTAL_WORKSPACES` | booleano | Habilitar soporte de espacios de trabajo | diff --git a/packages/web/src/content/docs/es/config.mdx b/packages/web/src/content/docs/es/config.mdx index 187acc010b..169fa14be2 100644 --- a/packages/web/src/content/docs/es/config.mdx +++ b/packages/web/src/content/docs/es/config.mdx @@ -44,10 +44,10 @@ Las fuentes de configuración se cargan en este orden (las fuentes posteriores a 1. **Configuración remota** (de `.well-known/opencode`): valores predeterminados de la organización 2. **Configuración global** (`~/.config/codev/codev.json`) - preferencias del usuario -3. **Configuración personalizada** (`OPENCODE_CONFIG` env var): anulaciones personalizadas +3. **Configuración personalizada** (`CODEV_CONFIG` env var): anulaciones personalizadas 4. **Configuración del proyecto** (`codev.json` en el proyecto): configuración específica del proyecto 5. Directorios **`.codev`** - agentes, comandos, complementos -6. **Configuración en línea** (`OPENCODE_CONFIG_CONTENT` env var): anulaciones del tiempo de ejecución +6. **Configuración en línea** (`CODEV_CONFIG_CONTENT` env var): anulaciones del tiempo de ejecución Esto significa que las configuraciones del proyecto pueden anular los valores predeterminados globales y las configuraciones globales pueden anular los valores predeterminados de la organización remota. @@ -117,10 +117,10 @@ Esto también es seguro para registrarlo en Git y utiliza el mismo esquema que e ### Ruta personalizada -Especifique una ruta de archivo de configuración personalizada utilizando la variable de entorno `OPENCODE_CONFIG`. +Especifique una ruta de archivo de configuración personalizada utilizando la variable de entorno `CODEV_CONFIG`. ```bash -export OPENCODE_CONFIG=/path/to/my/custom-config.json +export CODEV_CONFIG=/path/to/my/custom-config.json opencode run "Hello world" ``` @@ -130,13 +130,13 @@ La configuración personalizada se carga entre las configuraciones globales y de ### Directorio personalizado -Especifique un directorio de configuración personalizado usando `OPENCODE_CONFIG_DIR` +Especifique un directorio de configuración personalizado usando `CODEV_CONFIG_DIR` variable de entorno. En este directorio se buscarán agentes, comandos, modos y complementos como el directorio estándar `.codev`, y debería Sigue la misma estructura. ```bash -export OPENCODE_CONFIG_DIR=/path/to/my/config-directory +export CODEV_CONFIG_DIR=/path/to/my/config-directory opencode run "Hello world" ``` @@ -639,7 +639,7 @@ Utilice `{env:VARIABLE_NAME}` para sustituir variables de entorno: ```json title="codev.json" { "$schema": "https://opencode.ai/config.json", - "model": "{env:OPENCODE_MODEL}", + "model": "{env:CODEV_MODEL}", "provider": { "anthropic": { "models": {}, diff --git a/packages/web/src/content/docs/es/gitlab.mdx b/packages/web/src/content/docs/es/gitlab.mdx index a8e4baa909..cb9a72bf70 100644 --- a/packages/web/src/content/docs/es/gitlab.mdx +++ b/packages/web/src/content/docs/es/gitlab.mdx @@ -35,7 +35,7 @@ Aquí estamos utilizando un componente CI/CD creado por la comunidad para OpenCo - component: $CI_SERVER_FQDN/nagyv/gitlab-opencode/opencode@2 inputs: config_dir: ${CI_PROJECT_DIR}/opencode-config - auth_json: $OPENCODE_AUTH_JSON # The variable name for your OpenCode authentication JSON + auth_json: $CODEV_AUTH_JSON # The variable name for your OpenCode authentication JSON command: optional-custom-command message: "Your prompt here" ``` diff --git a/packages/web/src/content/docs/es/lsp.mdx b/packages/web/src/content/docs/es/lsp.mdx index fd408cfef5..914adcd9a0 100644 --- a/packages/web/src/content/docs/es/lsp.mdx +++ b/packages/web/src/content/docs/es/lsp.mdx @@ -50,7 +50,7 @@ OpenCode viene con varios servidores LSP integrados para idiomas populares: LSP está deshabilitado por defecto. Cuando está habilitado, los servidores se inician cuando se detecta una de las extensiones de archivo anteriores y se cumplen los requisitos. :::note -Puede deshabilitar las descargas automáticas del servidor LSP configurando la variable de entorno `OPENCODE_DISABLE_LSP_DOWNLOAD` en `true`. +Puede deshabilitar las descargas automáticas del servidor LSP configurando la variable de entorno `CODEV_DISABLE_LSP_DOWNLOAD` en `true`. ::: --- diff --git a/packages/web/src/content/docs/es/rules.mdx b/packages/web/src/content/docs/es/rules.mdx index d409c165be..b04e9c5b2e 100644 --- a/packages/web/src/content/docs/es/rules.mdx +++ b/packages/web/src/content/docs/es/rules.mdx @@ -77,9 +77,9 @@ Para los usuarios que migran desde Claude Code, OpenCode admite las convenciones Para deshabilitar la compatibilidad de Claude Code, configure una de estas variables de entorno: ```bash -export OPENCODE_DISABLE_CLAUDE_CODE=1 # Disable all .claude support -export OPENCODE_DISABLE_CLAUDE_CODE_PROMPT=1 # Disable only ~/.claude/CLAUDE.md -export OPENCODE_DISABLE_CLAUDE_CODE_SKILLS=1 # Disable only .claude/skills +export CODEV_DISABLE_CLAUDE_CODE=1 # Disable all .claude support +export CODEV_DISABLE_CLAUDE_CODE_PROMPT=1 # Disable only ~/.claude/CLAUDE.md +export CODEV_DISABLE_CLAUDE_CODE_SKILLS=1 # Disable only .claude/skills ``` --- diff --git a/packages/web/src/content/docs/es/server.mdx b/packages/web/src/content/docs/es/server.mdx index c3ce97421e..bfeb6c841a 100644 --- a/packages/web/src/content/docs/es/server.mdx +++ b/packages/web/src/content/docs/es/server.mdx @@ -36,10 +36,10 @@ opencode serve --cors http://localhost:5173 --cors https://app.example.com ### Autenticación -Configure `OPENCODE_SERVER_PASSWORD` para proteger el servidor con autenticación básica HTTP. El nombre de usuario predeterminado es `opencode`, o configure `OPENCODE_SERVER_USERNAME` para anularlo. Esto se aplica tanto a `opencode serve` como a `opencode web`. +Configure `CODEV_SERVER_PASSWORD` para proteger el servidor con autenticación básica HTTP. El nombre de usuario predeterminado es `opencode`, o configure `CODEV_SERVER_USERNAME` para anularlo. Esto se aplica tanto a `opencode serve` como a `opencode web`. ```bash -OPENCODE_SERVER_PASSWORD=your-password opencode serve +CODEV_SERVER_PASSWORD=your-password opencode serve ``` --- diff --git a/packages/web/src/content/docs/es/tools.mdx b/packages/web/src/content/docs/es/tools.mdx index 0b66b7a9d6..0dfb4b7533 100644 --- a/packages/web/src/content/docs/es/tools.mdx +++ b/packages/web/src/content/docs/es/tools.mdx @@ -156,7 +156,7 @@ Busque archivos usando patrones globales como `**/*.js` o `src/**/*.ts`. Devuelv Interactúe con sus servidores LSP configurados para obtener funciones de inteligencia de código como definiciones, referencias, información de desplazamiento y jerarquía de llamadas. :::note -Esta herramienta solo está disponible cuando `OPENCODE_EXPERIMENTAL_LSP_TOOL=true` (o `OPENCODE_EXPERIMENTAL=true`). +Esta herramienta solo está disponible cuando `CODEV_EXPERIMENTAL_LSP_TOOL=true` (o `CODEV_EXPERIMENTAL=true`). ::: ```json title="codev.json" {4} @@ -253,12 +253,12 @@ Permite que LLM busque y lea páginas web. Útil para buscar documentación o in Busque información en la web. :::note -Esta herramienta solo está disponible cuando se utiliza el proveedor OpenCode o cuando la variable de entorno `OPENCODE_ENABLE_EXA` está configurada en cualquier valor verdadero (por ejemplo, `true` o `1`). +Esta herramienta solo está disponible cuando se utiliza el proveedor OpenCode o cuando la variable de entorno `CODEV_ENABLE_EXA` está configurada en cualquier valor verdadero (por ejemplo, `true` o `1`). Para habilitar al iniciar OpenCode: ```bash -OPENCODE_ENABLE_EXA=1 opencode +CODEV_ENABLE_EXA=1 opencode ``` ::: diff --git a/packages/web/src/content/docs/es/troubleshooting.mdx b/packages/web/src/content/docs/es/troubleshooting.mdx index 1c5581d4db..9027ab6c16 100644 --- a/packages/web/src/content/docs/es/troubleshooting.mdx +++ b/packages/web/src/content/docs/es/troubleshooting.mdx @@ -115,9 +115,9 @@ Si su `codev.json(c)` contiene una sección `server`, elimínela temporalmente y #### Verificar variables de entorno -Si tiene `OPENCODE_PORT` configurado en su entorno, la aplicación de escritorio intentará usar ese puerto para el servidor local. +Si tiene `CODEV_PORT` configurado en su entorno, la aplicación de escritorio intentará usar ese puerto para el servidor local. -- Desarme `OPENCODE_PORT` (o elija un puerto libre) y reinicie. +- Desarme `CODEV_PORT` (o elija un puerto libre) y reinicie. --- diff --git a/packages/web/src/content/docs/es/tui.mdx b/packages/web/src/content/docs/es/tui.mdx index d6e71e68ea..d8ce282237 100644 --- a/packages/web/src/content/docs/es/tui.mdx +++ b/packages/web/src/content/docs/es/tui.mdx @@ -400,7 +400,7 @@ Esto es independiente de `codev.json`, que configura el comportamiento del servi - `mouse`: habilita o deshabilita la captura del mouse en el TUI (predeterminado: `true`). Cuando está deshabilitada, se conserva el comportamiento nativo del terminal para seleccionar y desplazarse con el mouse. - `attention`: configura las notificaciones de escritorio y los sonidos del TUI. Deshabilitado de forma predeterminada. -Utilice `OPENCODE_TUI_CONFIG` para cargar una ruta de configuración de TUI personalizada. +Utilice `CODEV_TUI_CONFIG` para cargar una ruta de configuración de TUI personalizada. ### Attention diff --git a/packages/web/src/content/docs/es/web.mdx b/packages/web/src/content/docs/es/web.mdx index e51e7050bd..80d57a5ab7 100644 --- a/packages/web/src/content/docs/es/web.mdx +++ b/packages/web/src/content/docs/es/web.mdx @@ -18,7 +18,7 @@ opencode web Esto inicia un servidor local en `127.0.0.1` con un puerto disponible aleatorio y abre automáticamente OpenCode en su navegador predeterminado. :::caution -Si no se establece `OPENCODE_SERVER_PASSWORD`, el servidor no será seguro. Esto está bien para uso local, pero debe configurarse para acceso a la red. +Si no se establece `CODEV_SERVER_PASSWORD`, el servidor no será seguro. Esto está bien para uso local, pero debe configurarse para acceso a la red. ::: :::tip[Windows Usuarios] @@ -80,13 +80,13 @@ opencode web --cors https://example.com ### Autenticación -Para proteger el acceso, establezca una contraseña utilizando la variable de entorno `OPENCODE_SERVER_PASSWORD`: +Para proteger el acceso, establezca una contraseña utilizando la variable de entorno `CODEV_SERVER_PASSWORD`: ```bash -OPENCODE_SERVER_PASSWORD=secret opencode web +CODEV_SERVER_PASSWORD=secret opencode web ``` -El nombre de usuario predeterminado es `opencode` pero se puede cambiar con `OPENCODE_SERVER_USERNAME`. +El nombre de usuario predeterminado es `opencode` pero se puede cambiar con `CODEV_SERVER_USERNAME`. --- diff --git a/packages/web/src/content/docs/es/windows-wsl.mdx b/packages/web/src/content/docs/es/windows-wsl.mdx index eea984348c..36d7bb8e3b 100644 --- a/packages/web/src/content/docs/es/windows-wsl.mdx +++ b/packages/web/src/content/docs/es/windows-wsl.mdx @@ -59,10 +59,10 @@ Si `localhost` no funciona en tu configuración, conéctate usando la dirección ::: :::caution -Cuando uses `--hostname 0.0.0.0`, define `OPENCODE_SERVER_PASSWORD` para proteger el servidor. +Cuando uses `--hostname 0.0.0.0`, define `CODEV_SERVER_PASSWORD` para proteger el servidor. ```bash -OPENCODE_SERVER_PASSWORD=your-password opencode serve --hostname 0.0.0.0 +CODEV_SERVER_PASSWORD=your-password opencode serve --hostname 0.0.0.0 ``` ::: diff --git a/packages/web/src/content/docs/gitlab.mdx b/packages/web/src/content/docs/gitlab.mdx index 5ba0b90c90..593c2191c0 100644 --- a/packages/web/src/content/docs/gitlab.mdx +++ b/packages/web/src/content/docs/gitlab.mdx @@ -35,7 +35,7 @@ Here we are using a community-created CI/CD component for OpenCode — [nagyv/gi - component: $CI_SERVER_FQDN/nagyv/gitlab-opencode/opencode@2 inputs: config_dir: ${CI_PROJECT_DIR}/opencode-config - auth_json: $OPENCODE_AUTH_JSON # The variable name for your OpenCode authentication JSON + auth_json: $CODEV_AUTH_JSON # The variable name for your OpenCode authentication JSON command: optional-custom-command message: "Your prompt here" ``` diff --git a/packages/web/src/content/docs/lsp.mdx b/packages/web/src/content/docs/lsp.mdx index 8e6ec252c6..18130f67b9 100644 --- a/packages/web/src/content/docs/lsp.mdx +++ b/packages/web/src/content/docs/lsp.mdx @@ -51,7 +51,7 @@ OpenCode comes with several built-in LSP servers for popular languages: LSP is disabled by default. When enabled, servers start when one of the above file extensions is detected and the requirements are met. :::note -You can disable automatic LSP server downloads by setting the `OPENCODE_DISABLE_LSP_DOWNLOAD` environment variable to `true`. +You can disable automatic LSP server downloads by setting the `CODEV_DISABLE_LSP_DOWNLOAD` environment variable to `true`. ::: --- diff --git a/packages/web/src/content/docs/rules.mdx b/packages/web/src/content/docs/rules.mdx index 12c9166f13..6f3e278db7 100644 --- a/packages/web/src/content/docs/rules.mdx +++ b/packages/web/src/content/docs/rules.mdx @@ -85,9 +85,9 @@ For users migrating from Claude Code, OpenCode supports Claude Code's file conve To disable Claude Code compatibility, set one of these environment variables: ```bash -export OPENCODE_DISABLE_CLAUDE_CODE=1 # Disable all .claude support -export OPENCODE_DISABLE_CLAUDE_CODE_PROMPT=1 # Disable only ~/.claude/CLAUDE.md -export OPENCODE_DISABLE_CLAUDE_CODE_SKILLS=1 # Disable only .claude/skills +export CODEV_DISABLE_CLAUDE_CODE=1 # Disable all .claude support +export CODEV_DISABLE_CLAUDE_CODE_PROMPT=1 # Disable only ~/.claude/CLAUDE.md +export CODEV_DISABLE_CLAUDE_CODE_SKILLS=1 # Disable only .claude/skills ``` --- diff --git a/packages/web/src/content/docs/server.mdx b/packages/web/src/content/docs/server.mdx index 4510bd4981..4e30a6c40a 100644 --- a/packages/web/src/content/docs/server.mdx +++ b/packages/web/src/content/docs/server.mdx @@ -36,10 +36,10 @@ opencode serve --cors http://localhost:5173 --cors https://app.example.com ### Authentication -Set `OPENCODE_SERVER_PASSWORD` to protect the server with HTTP basic auth. The username defaults to `opencode`, or set `OPENCODE_SERVER_USERNAME` to override it. This applies to both `opencode serve` and `opencode web`. +Set `CODEV_SERVER_PASSWORD` to protect the server with HTTP basic auth. The username defaults to `opencode`, or set `CODEV_SERVER_USERNAME` to override it. This applies to both `opencode serve` and `opencode web`. ```bash -OPENCODE_SERVER_PASSWORD=your-password opencode serve +CODEV_SERVER_PASSWORD=your-password opencode serve ``` --- diff --git a/packages/web/src/content/docs/tools.mdx b/packages/web/src/content/docs/tools.mdx index 13c356fc0d..4f6736f2da 100644 --- a/packages/web/src/content/docs/tools.mdx +++ b/packages/web/src/content/docs/tools.mdx @@ -156,7 +156,7 @@ Search for files using glob patterns like `**/*.js` or `src/**/*.ts`. Returns ma Interact with your configured LSP servers to get code intelligence features like definitions, references, hover info, and call hierarchy. :::note -This tool is only available when `OPENCODE_EXPERIMENTAL_LSP_TOOL=true` (or `OPENCODE_EXPERIMENTAL=true`). +This tool is only available when `CODEV_EXPERIMENTAL_LSP_TOOL=true` (or `CODEV_EXPERIMENTAL=true`). ::: ```json title="codev.json" {4} @@ -257,12 +257,12 @@ Allows the LLM to fetch and read web pages. Useful for looking up documentation Search the web for information. :::note -This tool is only available when using the OpenCode provider or when the `OPENCODE_ENABLE_EXA` environment variable is set to any truthy value (e.g., `true` or `1`). +This tool is only available when using the OpenCode provider or when the `CODEV_ENABLE_EXA` environment variable is set to any truthy value (e.g., `true` or `1`). To enable when launching OpenCode: ```bash -OPENCODE_ENABLE_EXA=1 opencode +CODEV_ENABLE_EXA=1 opencode ``` ::: diff --git a/packages/web/src/content/docs/troubleshooting.mdx b/packages/web/src/content/docs/troubleshooting.mdx index bc1fa49746..4952bf5e64 100644 --- a/packages/web/src/content/docs/troubleshooting.mdx +++ b/packages/web/src/content/docs/troubleshooting.mdx @@ -129,9 +129,9 @@ If your `codev.json(c)` contains a `server` section, temporarily remove it and r #### Check environment variables -If you have `OPENCODE_PORT` set in your environment, the desktop app will try to use that port for the local server. +If you have `CODEV_PORT` set in your environment, the desktop app will try to use that port for the local server. -- Unset `OPENCODE_PORT` (or pick a free port) and restart. +- Unset `CODEV_PORT` (or pick a free port) and restart. --- diff --git a/packages/web/src/content/docs/tui.mdx b/packages/web/src/content/docs/tui.mdx index 2491900ffe..803b99a1f1 100644 --- a/packages/web/src/content/docs/tui.mdx +++ b/packages/web/src/content/docs/tui.mdx @@ -398,7 +398,7 @@ This is separate from `codev.json`, which configures server/runtime behavior. - `mouse` - Enable or disable mouse capture in the TUI (default: `true`). When disabled, the terminal's native mouse selection/scrolling behavior is preserved. - `attention` - Configures TUI desktop notifications and sounds. Disabled by default. -Use `OPENCODE_TUI_CONFIG` to load a custom TUI config path. +Use `CODEV_TUI_CONFIG` to load a custom TUI config path. ### Attention diff --git a/packages/web/src/content/docs/web.mdx b/packages/web/src/content/docs/web.mdx index 5ad2285aed..3bd3ebb64a 100644 --- a/packages/web/src/content/docs/web.mdx +++ b/packages/web/src/content/docs/web.mdx @@ -18,7 +18,7 @@ opencode web This starts a local server on `127.0.0.1` with a random available port and automatically opens OpenCode in your default browser. :::caution -If `OPENCODE_SERVER_PASSWORD` is not set, the server will be unsecured. This is fine for local use but should be set for network access. +If `CODEV_SERVER_PASSWORD` is not set, the server will be unsecured. This is fine for local use but should be set for network access. ::: :::tip[Windows Users] @@ -80,13 +80,13 @@ opencode web --cors https://example.com ### Authentication -To protect access, set a password using the `OPENCODE_SERVER_PASSWORD` environment variable: +To protect access, set a password using the `CODEV_SERVER_PASSWORD` environment variable: ```bash -OPENCODE_SERVER_PASSWORD=secret opencode web +CODEV_SERVER_PASSWORD=secret opencode web ``` -The username defaults to `opencode` but can be changed with `OPENCODE_SERVER_USERNAME`. +The username defaults to `opencode` but can be changed with `CODEV_SERVER_USERNAME`. --- diff --git a/packages/web/src/content/docs/windows-wsl.mdx b/packages/web/src/content/docs/windows-wsl.mdx index ca3b6a4e32..4a5792bee6 100644 --- a/packages/web/src/content/docs/windows-wsl.mdx +++ b/packages/web/src/content/docs/windows-wsl.mdx @@ -59,11 +59,11 @@ If `localhost` does not work in your setup, connect using the WSL IP address ins ::: :::caution -When using `--hostname 0.0.0.0`, set `OPENCODE_SERVER_PASSWORD` to secure the server. +When using `--hostname 0.0.0.0`, set `CODEV_SERVER_PASSWORD` to secure the server. ::: ```bash -OPENCODE_SERVER_PASSWORD=your-password opencode serve --hostname 0.0.0.0 +CODEV_SERVER_PASSWORD=your-password opencode serve --hostname 0.0.0.0 ``` --- diff --git a/perf/test-suite.md b/perf/test-suite.md index 1d88d79090..42b21a3ee1 100644 --- a/perf/test-suite.md +++ b/perf/test-suite.md @@ -57,7 +57,7 @@ Repeated setup work, long sleeps/timeouts, serial integration tests, filesystem/ | Plugin install concurrency test spends time spawning more workers than needed to exercise lock contention | Reduced worker counts from 12/10/8 to 6/6/5; kept `holdMs: 30` | 7.800s | 6.204s | keep | Median from 3 targeted runs; still covers concurrent cross-process writes to server, server+tui, and existing json config. | | `httpapi-listen` PTY route tests pay for git repositories they do not assert on | Removed `git: true` from temp dirs while keeping config setup | 10.554s | 7.818s | keep | Median from 3 targeted runs; HTTP routes, tickets, websocket upgrade, restart, and no-auth paths still pass. | | `workspace.waitForSync` timeout test waits the full production timeout | Added optional timeout parameter defaulting to production timeout; timeout test uses 25ms | 12.949s | 8.305s | keep | Median from 3 targeted runs; production callers keep the 5000ms default. | -| `config.test` waits after dependencies even though `.gitignore` is written synchronously | Removed obsolete 1000ms sleep from writable `OPENCODE_CONFIG_DIR` test | 10.270s | 9.433s | keep | Median from 5 targeted runs because one run was noisy; simpler test and no fixed sleep. | +| `config.test` waits after dependencies even though `.gitignore` is written synchronously | Removed obsolete 1000ms sleep from writable `CODEV_CONFIG_DIR` test | 10.270s | 9.433s | keep | Median from 5 targeted runs because one run was noisy; simpler test and no fixed sleep. | | SDK parity helpers create git repos for tests that only need files/config/session state | Changed `withProject` default to no git; explicit git init test still opts into no-git fixture | 8.011s | 5.180s | keep | Median from 5 targeted runs because first run was cold/noisy. | | Provider plugin filter test waits on plugin dependency readiness setup | Marked local plugin dependencies ready using the existing fixture helper | 7.543s | 6.366s | keep | Median from 3 targeted runs; matches neighboring plugin provider test setup. | | HTTP provider tests generate local plugins without dependency-ready fixture state | Marked generated `.opencode` plugin fixtures dependency-ready | 7.905s | 2.980s | keep | Median from 3 targeted runs; avoids unrelated plugin dependency setup in route tests. | @@ -142,4 +142,4 @@ Full-suite sanity checks: | Socket reset retry test can shorten its idle-timeout path | Reduced Bun server idle timeout and tried forced server close | 16.46s | failed | discard | Shorter idle timeout changed the error shape; forced close hung. Keep the real socket reset. | | `tool/webfetch` can avoid per-test instance setup | Switched local HTTP tests from `it.instance` to `it.live` | 1.219s | failed | discard | Tool execution reads instance-local agent state, so the temp instance is required. | | LSP client interop tests can shorten coarse request-handling sleeps | Reduced fixed post-notification waits from 100ms to 10ms | 4.270s | 4.740s | discard | First run improved to 3.870s but verification was slower than baseline; not a clear win. | -| Config content env cases can use Effect-aware instance fixtures | Migrated two `OPENCODE_CONFIG_CONTENT` token substitution cases to `it.instance` | 1.95s | 2.06s | discard | Passing but not neutral-or-better in focused reruns; keep existing explicit env cleanup. | +| Config content env cases can use Effect-aware instance fixtures | Migrated two `CODEV_CONFIG_CONTENT` token substitution cases to `it.instance` | 1.95s | 2.06s | discard | Passing but not neutral-or-better in focused reruns; keep existing explicit env cleanup. | diff --git a/script/translate-app.ts b/script/translate-app.ts index e7e669dced..86a397a990 100644 --- a/script/translate-app.ts +++ b/script/translate-app.ts @@ -363,8 +363,8 @@ async function translate( ) const agent = `translate-app-${plan.locale}-${process.pid}` const env = isolatedEnvironment() - env.OPENCODE_DISABLE_PROJECT_CONFIG = "1" - env.OPENCODE_CONFIG_CONTENT = JSON.stringify( + env.CODEV_DISABLE_PROJECT_CONFIG = "1" + env.CODEV_CONFIG_CONTENT = JSON.stringify( translationConfig( agent, model, @@ -466,7 +466,7 @@ async function resolveModelVariant(model: string, variant: string) { const provider = model.split("/")[0] if (!provider || !model.includes("/")) throw new Error(`Model must use provider/model syntax: ${model}`) const env = isolatedEnvironment() - env.OPENCODE_DISABLE_PROJECT_CONFIG = "1" + env.CODEV_DISABLE_PROJECT_CONFIG = "1" const proc = Bun.spawn(["opencode", "--pure", "models", provider, "--verbose"], { cwd: root, env, @@ -483,11 +483,11 @@ async function resolveModelVariant(model: string, variant: string) { function isolatedEnvironment() { const env = { ...process.env } - delete env.OPENCODE_CONFIG - delete env.OPENCODE_CONFIG_DIR - delete env.OPENCODE_CONFIG_CONTENT - delete env.OPENCODE_PERMISSION - delete env.OPENCODE_AUTO_SHARE + delete env.CODEV_CONFIG + delete env.CODEV_CONFIG_DIR + delete env.CODEV_CONFIG_CONTENT + delete env.CODEV_PERMISSION + delete env.CODEV_AUTO_SHARE return env } diff --git a/sdks/vscode/src/extension.ts b/sdks/vscode/src/extension.ts index 693e7267e5..d320d62fe4 100644 --- a/sdks/vscode/src/extension.ts +++ b/sdks/vscode/src/extension.ts @@ -34,7 +34,7 @@ export function activate(context: vscode.ExtensionContext) { if (terminal.name === TERMINAL_NAME) { // @ts-ignore - const port = terminal.creationOptions.env?.["_EXTENSION_OPENCODE_PORT"] + const port = terminal.creationOptions.env?.["_EXTENSION_CODEV_PORT"] port ? await appendPrompt(parseInt(port), fileRef) : terminal.sendText(fileRef, false) terminal.show() } @@ -56,8 +56,8 @@ export function activate(context: vscode.ExtensionContext) { preserveFocus: false, }, env: { - _EXTENSION_OPENCODE_PORT: port.toString(), - OPENCODE_CALLER: "vscode", + _EXTENSION_CODEV_PORT: port.toString(), + CODEV_CALLER: "vscode", }, }) diff --git a/specs/v2/schema-changelog.md b/specs/v2/schema-changelog.md index 379c675d3d..a1a8760867 100644 --- a/specs/v2/schema-changelog.md +++ b/specs/v2/schema-changelog.md @@ -793,7 +793,7 @@ Change: - Retry Context Epoch preparation until stable after optimistic revision mismatches. - Clear the active Context Epoch when a Session moves so the destination initializes a complete baseline before promoting more input. - Fence Context Epoch initialization against the authoritative Session Location so a concurrent old-Location runner cannot recreate stale privileged context after a move. -- Canonicalize ambient instruction traversal boundaries, honor `OPENCODE_DISABLE_PROJECT_CONFIG`, and make non-empty aggregate updates explicitly supersede previously loaded instructions. +- Canonicalize ambient instruction traversal boundaries, honor `CODEV_DISABLE_PROJECT_CONFIG`, and make non-empty aggregate updates explicitly supersede previously loaded instructions. Compatibility: diff --git a/specs/v2/session.md b/specs/v2/session.md index f3c4211c6c..875b12db59 100644 --- a/specs/v2/session.md +++ b/specs/v2/session.md @@ -96,7 +96,7 @@ Session Epoch ├─ clear after Location move ─────▶ ``` -Ambient project discovery canonicalizes and contains traversal within the project root and honors `OPENCODE_DISABLE_PROJECT_CONFIG`. An unavailable observation preserves the previously admitted value. A confirmed partial instruction removal emits the complete remaining aggregate with explicit supersession text; removing the final instruction emits a revocation message. +Ambient project discovery canonicalizes and contains traversal within the project root and honors `CODEV_DISABLE_PROJECT_CONFIG`. An unavailable observation preserves the previously admitted value. A confirmed partial instruction removal emits the complete remaining aggregate with explicit supersession text; removing the final instruction emits a revocation message. Current Context Epoch follow-ups: diff --git a/turbo.json b/turbo.json index 5e93640b1f..06e6e3f522 100644 --- a/turbo.json +++ b/turbo.json @@ -1,7 +1,7 @@ { "$schema": "https://v2-8-13.turborepo.dev/schema.json", - "globalEnv": ["CI", "OPENCODE_DISABLE_SHARE"], - "globalPassThroughEnv": ["CI", "OPENCODE_DISABLE_SHARE"], + "globalEnv": ["CI", "CODEV_DISABLE_SHARE"], + "globalPassThroughEnv": ["CI", "CODEV_DISABLE_SHARE"], "tasks": { "typecheck": {}, "build": { From 9e4bab89e13ae4ca42659350f47ebaab6d56ade8 Mon Sep 17 00:00:00 2001 From: minhn4 Date: Sat, 11 Jul 2026 14:17:45 +0700 Subject: [PATCH 2/4] test(opencode): raise Runner test coordination timeouts for Windows CI MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The Runner suite's Effect.timeout guards (250ms latch/deferred/fiber awaits, 1s waitForState) are pure hang-detectors, but GitHub-hosted Windows runners starve the event loop past 250ms, failing "cancel does not mask shell defects" (and, on main, a rotating cast of similar timing-sensitive tests). Raise them to 10s — well under the package's 30s bun test budget, so genuine hangs still fail fast with a clear TimeoutError. Recorded in the DIVERGENCES.md slow-runner headroom row. Co-Authored-By: Claude Fable 5 --- DIVERGENCES.md | 2 +- packages/opencode/test/effect/runner.test.ts | 18 +++++++++--------- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/DIVERGENCES.md b/DIVERGENCES.md index 7e357019a4..12905009f2 100644 --- a/DIVERGENCES.md +++ b/DIVERGENCES.md @@ -64,7 +64,7 @@ upstream maintainers — see README → Syncing with upstream for why and how. | `.github/workflows/` — 22 upstream workflows deleted (beta, close-issues, close-prs, compliance-close, containers, deploy, docs-locale-sync, docs-update, duplicate-issues, generate, nix-hashes, notify-discord, opencode, pr-management, pr-standards, publish, publish-github-action, publish-vscode, release-github-action, review, stats, triage) | Deleted | All inert or upstream-only here: gated on `anomalyco/opencode`, publish/deploy to upstream infra, need upstream secrets (`OPENCODE_APP_SECRET`, `OPENCODE_API_KEY`, marketplace/Discord/PostHog tokens), trigger only on a `dev` branch the fork lacks, or read the deleted `TEAM_MEMBERS`. | Keep deleted; delete new upstream workflows too unless they're generic self-contained CI. | | `.github/workflows/{typecheck,test,nix-eval,storybook}.yml` | Triggers `dev` → `main` (incl. test.yml's concurrency-group ref check); runners `blacksmith-*` → `ubuntu-latest`/`windows-latest`; test.yml unit-test step `timeout-minutes` 20 → 45; test.yml exerciser step gains `timeout-minutes: 30`; test.yml Windows unit job pre-installs ripgrep via choco | Fork's default branch is `main`; Blacksmith runners aren't installed here, so jobs queued forever. GitHub-hosted `windows-latest` needs well over 20 minutes for the spawn-heavy opencode suite. A wedged exerciser run otherwise holds the job for GitHub's 6-hour ceiling. The file-search index is built by a background ripgrep walk with swallowed errors; Windows's first-use rg.exe download left it permanently empty, failing httpapi-file's search test every run. | Keep our branches + runners + timeouts; take upstream's other changes. | | `packages/core/test/ripgrep.test.ts` | `120_000` timeout on both `it.live` tests | First use downloads + extracts the ripgrep binary; GitHub-hosted Windows runners blow bun's 5s default. | Keep our timeouts; take upstream's test changes. | -| `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` | Slow-runner headroom: unknown-model test `timeoutMs`/bound 15s → 30s (test timeout 60s); 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) | Loaded GitHub-hosted runners spawn processes, fetch ripgrep, and build the lazy file index slower than upstream's Blacksmith runners; 5–30s budgets flake or fail outright. Hang regressions are still caught (a hang exceeds the bound; polls return as soon as ready). | Keep our numbers; take upstream's test changes. | +| `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` | Slow-runner headroom: unknown-model test `timeoutMs`/bound 15s → 30s (test timeout 60s); 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) | 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. Hang regressions are still caught (a hang exceeds the bound; polls return as soon as ready). | Keep our numbers; 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/README.md` | `description` "opencode for VS Code" → "CoDev Code for VS Code"; README title → "CoDev Code VS Code Extension" | Manifest branding. `name`, `displayName`, command IDs/titles and README body (which names actual UI elements) stay upstream — the fork doesn't publish this extension; revisit before shipping it. | Keep our description + title; take upstream's other fields/body. | diff --git a/packages/opencode/test/effect/runner.test.ts b/packages/opencode/test/effect/runner.test.ts index 27fe9e0254..438ab76142 100644 --- a/packages/opencode/test/effect/runner.test.ts +++ b/packages/opencode/test/effect/runner.test.ts @@ -6,7 +6,7 @@ import { it } from "../lib/effect" const waitForState = (runner: Runner.Runner, tag: Runner.State["_tag"]) => Effect.gen(function* () { while (runner.state._tag !== tag) yield* Effect.yieldNow - }).pipe(Effect.timeout("1 second")) + }).pipe(Effect.timeout("10 seconds")) describe("Runner", () => { // --- ensureRunning semantics --- @@ -223,19 +223,19 @@ describe("Runner", () => { yield* waitForState(runner, "Running") const stop = yield* runner.cancel.pipe(Effect.forkChild) - yield* Deferred.await(hit).pipe(Effect.timeout("250 millis")) + yield* Deferred.await(hit).pipe(Effect.timeout("10 seconds")) const b = yield* runner.ensureRunning(Deferred.await(done).pipe(Effect.as("second"))).pipe(Effect.forkChild) yield* Effect.yieldNow expect(runner.busy).toBe(true) yield* Deferred.succeed(hold, undefined) - const stopExit = yield* Fiber.await(stop).pipe(Effect.timeout("250 millis")) + const stopExit = yield* Fiber.await(stop).pipe(Effect.timeout("10 seconds")) expect(Exit.isSuccess(stopExit)).toBe(true) expect(runner.busy).toBe(true) yield* Deferred.succeed(done, undefined) - expect(yield* Fiber.join(b).pipe(Effect.timeout("250 millis"))).toBe("second") + expect(yield* Fiber.join(b).pipe(Effect.timeout("10 seconds"))).toBe("second") expect(runner.busy).toBe(false) const exit = yield* Fiber.join(a) @@ -277,16 +277,16 @@ describe("Runner", () => { }), ) .pipe(Effect.forkChild) - yield* Deferred.await(started).pipe(Effect.timeout("250 millis")) + yield* Deferred.await(started).pipe(Effect.timeout("10 seconds")) yield* Effect.gen(function* () { while (runner.state._tag !== "Running") yield* Effect.yieldNow - }).pipe(Effect.timeout("250 millis")) + }).pipe(Effect.timeout("10 seconds")) const exit = yield* runner.startShell(Effect.succeed("nope")).pipe(Effect.exit) expect(Exit.isFailure(exit)).toBe(true) yield* runner.cancel - yield* Fiber.await(fiber).pipe(Effect.timeout("250 millis")) + yield* Fiber.await(fiber).pipe(Effect.timeout("10 seconds")) }), ) @@ -320,7 +320,7 @@ describe("Runner", () => { yield* waitForState(runner, "Shell") const stop = yield* runner.cancel.pipe(Effect.forkChild) - const stopExit = yield* Fiber.await(stop).pipe(Effect.timeout("250 millis")) + const stopExit = yield* Fiber.await(stop).pipe(Effect.timeout("10 seconds")) expect(Exit.isSuccess(stopExit)).toBe(true) expect(runner.busy).toBe(false) @@ -347,7 +347,7 @@ describe("Runner", () => { ready, ) .pipe(Effect.forkChild) - yield* ready.await.pipe(Effect.timeout("250 millis")) + yield* ready.await.pipe(Effect.timeout("10 seconds")) yield* runner.cancel expect(Exit.isFailure(yield* Fiber.await(sh))).toBe(true) From 818b1e97855e0cbf2ef959b3842ac672af9981ea Mon Sep 17 00:00:00 2001 From: minhn4 Date: Sat, 11 Jul 2026 14:48:29 +0700 Subject: [PATCH 3/4] test(opencode): raise prompt and instance-bootstrap budgets for Windows CI Two more pre-existing slow-runner flakes surfaced on GitHub-hosted Windows (both also fail on main independent of this branch): the prompt.test.ts loop/shell tests time out at their 10s budgets while sibling tests in the same file already use 30s, and the first instance-bootstrap test pays the instance cold-start and blew the package-wide 30s ceiling. Raise the five 10s prompt budgets to 30s and give the cold-start test 60s. Recorded in the DIVERGENCES.md slow-runner headroom row. Co-Authored-By: Claude Fable 5 --- DIVERGENCES.md | 2 +- .../test/project/instance-bootstrap.test.ts | 23 +++++++++++-------- packages/opencode/test/session/prompt.test.ts | 10 ++++---- 3 files changed, 20 insertions(+), 15 deletions(-) diff --git a/DIVERGENCES.md b/DIVERGENCES.md index 12905009f2..9fe24904ae 100644 --- a/DIVERGENCES.md +++ b/DIVERGENCES.md @@ -64,7 +64,7 @@ upstream maintainers — see README → Syncing with upstream for why and how. | `.github/workflows/` — 22 upstream workflows deleted (beta, close-issues, close-prs, compliance-close, containers, deploy, docs-locale-sync, docs-update, duplicate-issues, generate, nix-hashes, notify-discord, opencode, pr-management, pr-standards, publish, publish-github-action, publish-vscode, release-github-action, review, stats, triage) | Deleted | All inert or upstream-only here: gated on `anomalyco/opencode`, publish/deploy to upstream infra, need upstream secrets (`OPENCODE_APP_SECRET`, `OPENCODE_API_KEY`, marketplace/Discord/PostHog tokens), trigger only on a `dev` branch the fork lacks, or read the deleted `TEAM_MEMBERS`. | Keep deleted; delete new upstream workflows too unless they're generic self-contained CI. | | `.github/workflows/{typecheck,test,nix-eval,storybook}.yml` | Triggers `dev` → `main` (incl. test.yml's concurrency-group ref check); runners `blacksmith-*` → `ubuntu-latest`/`windows-latest`; test.yml unit-test step `timeout-minutes` 20 → 45; test.yml exerciser step gains `timeout-minutes: 30`; test.yml Windows unit job pre-installs ripgrep via choco | Fork's default branch is `main`; Blacksmith runners aren't installed here, so jobs queued forever. GitHub-hosted `windows-latest` needs well over 20 minutes for the spawn-heavy opencode suite. A wedged exerciser run otherwise holds the job for GitHub's 6-hour ceiling. The file-search index is built by a background ripgrep walk with swallowed errors; Windows's first-use rg.exe download left it permanently empty, failing httpapi-file's search test every run. | Keep our branches + runners + timeouts; take upstream's other changes. | | `packages/core/test/ripgrep.test.ts` | `120_000` timeout on both `it.live` tests | First use downloads + extracts the ripgrep binary; GitHub-hosted Windows runners blow bun's 5s default. | Keep our timeouts; take upstream's test changes. | -| `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` | Slow-runner headroom: unknown-model test `timeoutMs`/bound 15s → 30s (test timeout 60s); 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) | 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. Hang regressions are still caught (a hang exceeds the bound; polls return as soon as ready). | Keep our numbers; take upstream's test changes. | +| `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); 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 per-test budgets 10s → 30s (matches the file's other tests); 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. Hang regressions are still caught (a hang exceeds the bound; polls return as soon as ready). | Keep our numbers; 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/README.md` | `description` "opencode for VS Code" → "CoDev Code for VS Code"; README title → "CoDev Code VS Code Extension" | Manifest branding. `name`, `displayName`, command IDs/titles and README body (which names actual UI elements) stay upstream — the fork doesn't publish this extension; revisit before shipping it. | Keep our description + title; take upstream's other fields/body. | diff --git a/packages/opencode/test/project/instance-bootstrap.test.ts b/packages/opencode/test/project/instance-bootstrap.test.ts index abc02e2204..83c32e87cf 100644 --- a/packages/opencode/test/project/instance-bootstrap.test.ts +++ b/packages/opencode/test/project/instance-bootstrap.test.ts @@ -67,15 +67,20 @@ function waitDisposed(directory: string) { }) } -it.live("InstanceStore.provide runs InstanceBootstrap before effect", () => - Effect.gen(function* () { - const tmp = yield* bootstrapFixture - const store = yield* InstanceStore.Service - - yield* store.provide({ directory: tmp.directory }, Effect.succeed("ok")) - - expect(existsSync(tmp.marker)).toBe(true) - }), +it.live( + "InstanceStore.provide runs InstanceBootstrap before effect", + () => + Effect.gen(function* () { + const tmp = yield* bootstrapFixture + const store = yield* InstanceStore.Service + + yield* store.provide({ directory: tmp.directory }, Effect.succeed("ok")) + + expect(existsSync(tmp.marker)).toBe(true) + }), + // First test in the file pays the instance cold-start (git init, db, config); + // GitHub-hosted Windows runners blow the package-wide 30s budget on it. + 60_000, ) it.live("CLI bootstrap runs InstanceBootstrap before callback", () => diff --git a/packages/opencode/test/session/prompt.test.ts b/packages/opencode/test/session/prompt.test.ts index ba282be099..92c00e13e1 100644 --- a/packages/opencode/test/session/prompt.test.ts +++ b/packages/opencode/test/session/prompt.test.ts @@ -1051,7 +1051,7 @@ it.instance( yield* prompt.cancel(chat.id) yield* Fiber.await(fiber) }), - 10_000, + 30_000, ) it.instance( @@ -1296,7 +1296,7 @@ it.instance( expect((yield* status.get(chat.id)).type).toBe("idle") expect((yield* status.get(childID)).type).toBe("idle") }), - 10_000, + 30_000, ) it.instance( @@ -1324,7 +1324,7 @@ it.instance( } }), { git: true }, - 10_000, + 30_000, ) // Queue semantics @@ -1701,7 +1701,7 @@ it.instance( expect(yield* llm.calls).toBe(1) }), { git: true }, - 10_000, + 30_000, ) it.instance( @@ -1740,7 +1740,7 @@ it.instance( expect(yield* llm.calls).toBe(1) }), { git: true }, - 10_000, + 30_000, ) unix( From e643f1a73c9e17f429458981469f966e4e91cc67 Mon Sep 17 00:00:00 2001 From: minhn4 Date: Sun, 12 Jul 2026 15:28:08 +0700 Subject: [PATCH 4/4] test(opencode): skip Unix-shell loop tests on Windows instead of raising budgets MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The two prompt.test.ts tests that run `sleep 0.2` ("loop waits while shell runs…" and "shell completion resumes queued loop callers") used `it.instance` directly, so they ran on Windows where `sleep` doesn't exist — the shell fiber never completes and the test hangs to the full budget (why the earlier 10s→30s bump didn't help; it timed out at 30s too). Move them to the file's existing `unix` helper so they skip on Windows like their `unixNoLLMServer` siblings, and revert the ineffective budget bumps. instance-bootstrap's 60s cold-start bump (which did work) stays. DIVERGENCES.md updated to match. Co-Authored-By: Claude Fable 5 --- DIVERGENCES.md | 2 +- packages/opencode/test/session/prompt.test.ts | 14 +++++++------- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/DIVERGENCES.md b/DIVERGENCES.md index 9fe24904ae..2a3b540586 100644 --- a/DIVERGENCES.md +++ b/DIVERGENCES.md @@ -64,7 +64,7 @@ upstream maintainers — see README → Syncing with upstream for why and how. | `.github/workflows/` — 22 upstream workflows deleted (beta, close-issues, close-prs, compliance-close, containers, deploy, docs-locale-sync, docs-update, duplicate-issues, generate, nix-hashes, notify-discord, opencode, pr-management, pr-standards, publish, publish-github-action, publish-vscode, release-github-action, review, stats, triage) | Deleted | All inert or upstream-only here: gated on `anomalyco/opencode`, publish/deploy to upstream infra, need upstream secrets (`OPENCODE_APP_SECRET`, `OPENCODE_API_KEY`, marketplace/Discord/PostHog tokens), trigger only on a `dev` branch the fork lacks, or read the deleted `TEAM_MEMBERS`. | Keep deleted; delete new upstream workflows too unless they're generic self-contained CI. | | `.github/workflows/{typecheck,test,nix-eval,storybook}.yml` | Triggers `dev` → `main` (incl. test.yml's concurrency-group ref check); runners `blacksmith-*` → `ubuntu-latest`/`windows-latest`; test.yml unit-test step `timeout-minutes` 20 → 45; test.yml exerciser step gains `timeout-minutes: 30`; test.yml Windows unit job pre-installs ripgrep via choco | Fork's default branch is `main`; Blacksmith runners aren't installed here, so jobs queued forever. GitHub-hosted `windows-latest` needs well over 20 minutes for the spawn-heavy opencode suite. A wedged exerciser run otherwise holds the job for GitHub's 6-hour ceiling. The file-search index is built by a background ripgrep walk with swallowed errors; Windows's first-use rg.exe download left it permanently empty, failing httpapi-file's search test every run. | Keep our branches + runners + timeouts; take upstream's other changes. | | `packages/core/test/ripgrep.test.ts` | `120_000` timeout on both `it.live` tests | First use downloads + extracts the ripgrep binary; GitHub-hosted Windows runners blow bun's 5s default. | Keep our timeouts; take upstream's test changes. | -| `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); 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 per-test budgets 10s → 30s (matches the file's other tests); 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. Hang regressions are still caught (a hang exceeds the bound; polls return as soon as ready). | Keep our numbers; take upstream's test changes. | +| `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); 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/README.md` | `description` "opencode for VS Code" → "CoDev Code for VS Code"; README title → "CoDev Code VS Code Extension" | Manifest branding. `name`, `displayName`, command IDs/titles and README body (which names actual UI elements) stay upstream — the fork doesn't publish this extension; revisit before shipping it. | Keep our description + title; take upstream's other fields/body. | diff --git a/packages/opencode/test/session/prompt.test.ts b/packages/opencode/test/session/prompt.test.ts index 92c00e13e1..8e64368e88 100644 --- a/packages/opencode/test/session/prompt.test.ts +++ b/packages/opencode/test/session/prompt.test.ts @@ -1051,7 +1051,7 @@ it.instance( yield* prompt.cancel(chat.id) yield* Fiber.await(fiber) }), - 30_000, + 10_000, ) it.instance( @@ -1296,7 +1296,7 @@ it.instance( expect((yield* status.get(chat.id)).type).toBe("idle") expect((yield* status.get(childID)).type).toBe("idle") }), - 30_000, + 10_000, ) it.instance( @@ -1324,7 +1324,7 @@ it.instance( } }), { git: true }, - 30_000, + 10_000, ) // Queue semantics @@ -1667,7 +1667,7 @@ unixNoLLMServer( 30_000, ) -it.instance( +unix( "loop waits while shell runs and starts after shell exits", () => Effect.gen(function* () { @@ -1701,10 +1701,10 @@ it.instance( expect(yield* llm.calls).toBe(1) }), { git: true }, - 30_000, + 10_000, ) -it.instance( +unix( "shell completion resumes queued loop callers", () => Effect.gen(function* () { @@ -1740,7 +1740,7 @@ it.instance( expect(yield* llm.calls).toBe(1) }), { git: true }, - 30_000, + 10_000, ) unix(