Docs: add Workspaces guide#5
Conversation
) Co-authored-by: Shoubhit Dash <[email protected]>
|
This PR doesn't fully meet our contributing guidelines and PR template. What needs to be fixed:
Please edit this PR description to address the above within 2 hours, or it will be automatically closed. If you believe this was flagged incorrectly, please let a maintainer know. |
|
Hey! Your PR title Please update it to start with one of:
Where See CONTRIBUTING.md for details. |
|
No actionable comments were generated in the recent review. 🎉 ℹ️ Recent review info⚙️ Run configurationConfiguration used: defaults Review profile: CHILL Plan: Pro Run ID: 📒 Files selected for processing (1)
📝 WalkthroughWalkthroughThis PR adds an AppFileSystem service, refactors process/LSP spawning and shutdown, enhances OAuth prompts in the connect dialog, updates many i18n strings and Go/Zen docs to include MiniMax M2.7 and new pricing, upgrades Effect-related dependencies, and adds tests and documentation for workspaces. Changes
Estimated code review effort🎯 4 (Complex) | ⏱️ ~60 minutes Poem
✨ Finishing Touches📝 Generate docstrings
🧪 Generate unit tests (beta)
|
There was a problem hiding this comment.
Actionable comments posted: 16
🧹 Nitpick comments (13)
packages/opencode/src/session/message-v2.ts (1)
958-959: Redundantinstanceofcheck inside case block.Since line 958 already matches
case e instanceof Error:, the ternary on line 959 is unnecessary—eis guaranteed to be anErrorhere.✨ Suggested simplification
case e instanceof Error: - return new NamedError.Unknown({ message: e instanceof Error ? e.message : String(e) }, { cause: e }).toObject() + return new NamedError.Unknown({ message: e.message }, { cause: e }).toObject()🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@packages/opencode/src/session/message-v2.ts` around lines 958 - 959, The case block matching "case e instanceof Error:" contains a redundant ternary; inside that branch `e` is already an Error, so simplify the return in the branch that builds NamedError.Unknown by using e.message directly (i.e., replace the ternary `e instanceof Error ? e.message : String(e)` with `e.message`) while keeping the rest of the construction (`new NamedError.Unknown(..., { cause: e }).toObject()`); update the code in the switch branch where `e` and `NamedError.Unknown` are used.packages/web/src/content/docs/providers.mdx (1)
327-328: Prefer neutral wording over policy commentary.“support freedom of choice” is editorial. A neutral phrasing will age better and reduce perceived bias.
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@packages/web/src/content/docs/providers.mdx` around lines 327 - 328, Replace the editorial phrase "support freedom of choice" in the sentence "Other companies support freedom of choice with developer tooling - you can use the following subscriptions in OpenCode with zero setup:" with a neutral, factual alternative (e.g., "offer multiple developer tooling options" or "provide a choice of developer tooling"). Update the sentence to read plainly (for example: "Other companies offer multiple developer tooling options — you can use the following subscriptions in OpenCode with zero setup:") so the wording is neutral and non-editorial.packages/opencode/src/cli/cmd/models.ts (1)
54-60: Minor cleanup: computeProviderID.make(args.provider)once.This avoids duplicate conversion and keeps lookup/print paths tied to one canonical value.
✨ Small refactor
if (args.provider) { - const provider = providers[ProviderID.make(args.provider)] + const providerID = ProviderID.make(args.provider) + const provider = providers[providerID] if (!provider) { UI.error(`Provider not found: ${args.provider}`) return } - printModels(ProviderID.make(args.provider), args.verbose) + printModels(providerID, args.verbose) return }🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@packages/opencode/src/cli/cmd/models.ts` around lines 54 - 60, Compute ProviderID.make(args.provider) once and reuse it: create a local const (e.g., providerId = ProviderID.make(args.provider)), use providers[providerId] for the lookup instead of calling ProviderID.make twice, keep the UI.error call and return as-is if lookup fails, and pass providerId into printModels. Update references to use providerId so lookup and printing use the same canonical value.packages/opencode/src/provider/provider.ts (1)
841-841: PreferPartial<Record<ProviderID, Info>>over force-casting an empty object.Line 841 currently uses an unsafe cast during incremental population/removal. Modeling this map as partial better reflects actual lifecycle and preserves stronger type checks.
♻️ Suggested type-safety refactor
- const providers: Record<ProviderID, Info> = {} as Record<ProviderID, Info> + const providers: Partial<Record<ProviderID, Info>> = {}🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@packages/opencode/src/provider/provider.ts` at line 841, The providers map is currently created with an unsafe cast (const providers: Record<ProviderID, Info> = {} as Record<ProviderID, Info>) which hides that entries may be added/removed over time; change its declaration to use Partial<Record<ProviderID, Info>> so the type accurately represents possibly-missing entries (const providers: Partial<Record<ProviderID, Info>> = {}), and then update any code that reads from providers (e.g., lookups by ProviderID) to handle undefined results (add null/undefined checks or use non-null assertions only where guaranteed) so the stronger type-safety is preserved for functions/methods that reference providers.packages/app/src/i18n/no.ts (1)
226-226: Consider using a distinct Norwegian label forcommon.continue.Line 226 currently duplicates
common.submit("Send inn"). If this action is a step-forward CTA,"Fortsett"may be clearer UX.🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@packages/app/src/i18n/no.ts` at line 226, Replace the duplicate Norwegian string for the key common.continue (currently "Send inn") with a distinct, step-forward label such as "Fortsett" to avoid matching common.submit; update the value for the constant common.continue in packages/app/src/i18n/no.ts so the translation reflects a forward/next action and remains consistent with UX intent.packages/app/src/i18n/fr.ts (1)
207-207: Frenchcommon.continuemay be better as “Continuer”.Line 207 maps
common.continueto"Soumettre"(same as submit). If this button means step progression,"Continuer"is a better fit.🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@packages/app/src/i18n/fr.ts` at line 207, Update the French translation for the key "common.continue" in packages/app/src/i18n/fr.ts so it reads "Continuer" instead of "Soumettre"; locate the entry for "common.continue" and replace the value to reflect step progression wording consistent with other navigation labels.packages/app/src/i18n/th.ts (1)
223-223: Consider a Thai term closer to “Continue” forcommon.continue.Line 223 currently mirrors submit (
"ส่ง"). If this is a step-forward action, a continue-specific label would be clearer.🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@packages/app/src/i18n/th.ts` at line 223, The translation for the key common.continue currently uses the Thai word "ส่ง" (which reads like "submit"); change the value for common.continue in packages/app/src/i18n/th.ts to a Thai term that conveys stepping forward or continuing (for example "ต่อไป" or "ดำเนินการต่อ") so the label differentiates from submit actions and more accurately maps to "Continue".packages/app/src/i18n/es.ts (1)
223-223: Spanishcommon.continuemay read better as “Continuar”.Line 223 uses
"Enviar"(same as submit). If the action is progression in a flow,"Continuar"is more precise.🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@packages/app/src/i18n/es.ts` at line 223, The translation for the key "common.continue" currently uses "Enviar" which is better suited for submit actions; update the value of the "common.continue" entry in the es.ts localization (the "common.continue" string) to "Continuar" so it conveys progression in a flow rather than submission.packages/web/src/content/docs/ja/go.mdx (1)
46-51: Mention the workspace prerequisite in the setup steps.These instructions jump from sign-in straight to subscribing, but the note below says Go is workspace-scoped. A brief “create/select a workspace first” link to the new Workspaces guide here would make the flow self-serve.
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@packages/web/src/content/docs/ja/go.mdx` around lines 46 - 51, Update the setup steps in the Go guide to require creating or selecting a workspace before subscribing: modify the numbered list (the step that currently reads "OpenCode Zenにサインインし、GoをサブスクライブしてAPIキーをコピーします") to split into two steps — first instruct users to create or select a workspace (include a link to the new Workspaces guide), then instruct them to subscribe to OpenCode Go and copy the API key; ensure the subsequent instructions referencing the TUI commands `/connect` and `/models` still follow and mention selecting the same workspace when connecting.packages/web/src/content/docs/tr/go.mdx (2)
56-81: Same model ordering inconsistency as in the Spanish version.The bullet list (lines 56-59) shows MiniMax M2.5 before M2.7, while the table (lines 77-81) shows M2.7 before M2.5. Align the ordering for consistency across localized documentation.
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@packages/web/src/content/docs/tr/go.mdx` around lines 56 - 81, The localized Turkish doc has inconsistent model ordering: the bullet list lines with model names (GLM-5, Kimi K2.5, MiniMax M2.5, MiniMax M2.7) does not match the table order (GLM-5, Kimi K2.5, MiniMax M2.7, MiniMax M2.5); update the bullet list so the MiniMax entries appear in the same order as the table (change the list to GLM-5, Kimi K2.5, MiniMax M2.7, MiniMax M2.5) to ensure consistent ordering across the document.
79-81: Table row label may be ambiguous in Turkish.The label "5 saatte bir istek" could be interpreted as "one request per 5 hours" rather than the intended "requests per 5-hour window." Consider rephrasing for clarity, e.g., "5 saatlik istek" or "5 saat içinde istek sayısı" to better convey that these are totals.
📝 Suggested fix
-| 5 saatte bir istek | 1.150 | 1.850 | 14.000 | 20.000 | -| haftalık istek | 2.880 | 4.630 | 35.000 | 50.000 | -| aylık istek | 5.750 | 9.250 | 70.000 | 100.000 | +| 5 saatlik istek | 1.150 | 1.850 | 14.000 | 20.000 | +| haftalık istek | 2.880 | 4.630 | 35.000 | 50.000 | +| aylık istek | 5.750 | 9.250 | 70.000 | 100.000 |🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@packages/web/src/content/docs/tr/go.mdx` around lines 79 - 81, Update the ambiguous Turkish table label "5 saatte bir istek" to a clearer phrasing that conveys a total over a 5-hour window; replace the string "5 saatte bir istek" with one of the suggested alternatives such as "5 saatlik istek" or "5 saat içinde istek sayısı" in the table row so readers understand it represents requests in a 5-hour period.packages/web/src/content/docs/es/go.mdx (1)
66-91: Model ordering inconsistency between list and table.The bullet list (lines 66-69) orders the MiniMax models as M2.5 then M2.7, but the table (lines 87-91) orders them as M2.7 then M2.5. Consider using consistent ordering throughout the document for clarity.
📝 Suggested fix to align ordering
Either update the bullet list to match the table order:
- **GLM-5** - **Kimi K2.5** -- **MiniMax M2.5** - **MiniMax M2.7** +- **MiniMax M2.5**Or update the table to match the bullet list order (swap M2.7 and M2.5 columns).
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@packages/web/src/content/docs/es/go.mdx` around lines 66 - 91, The document shows inconsistent ordering of the MiniMax models: the bullet list lists "MiniMax M2.5" then "MiniMax M2.7" while the table columns are "MiniMax M2.7" then "MiniMax M2.5"; pick one ordering and make both places match by either swapping the two MiniMax entries in the bullet list or rearranging the table columns so the sequence of model names ("GLM-5", "Kimi K2.5", "MiniMax M2.7", "MiniMax M2.5" or the alternative with M2.5 before M2.7) is identical in the list and the table to ensure consistent presentation.packages/opencode/test/filesystem/filesystem.test.ts (1)
2-4: Use the exporteddefaultLayerin this suite.This is duplicating the production composition verbatim. Pointing the tests at
AppFileSystem.defaultLayerkeeps the setup in sync with the public wiring and makes regressions in that export visible here.♻️ Proposed cleanup
-import { Effect, Layer } from "effect" -import { NodeFileSystem } from "@effect/platform-node" +import { Effect } from "effect" import { AppFileSystem } from "../../src/filesystem" ... -const live = AppFileSystem.layer.pipe(Layer.provide(NodeFileSystem.layer)) +const live = AppFileSystem.defaultLayerAlso applies to: 8-9
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@packages/opencode/test/filesystem/filesystem.test.ts` around lines 2 - 4, Tests are duplicating the production composition; replace the manual composition that imports and constructs Layer/NodeFileSystem with the exported public wiring by using AppFileSystem.defaultLayer in the test suite (referencing the symbol AppFileSystem.defaultLayer) so the tests consume the same Layer as production; locate the setup that currently imports NodeFileSystem and builds a Layer/Effect and swap it to use AppFileSystem.defaultLayer and update any references to the old variable names accordingly.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.
Inline comments:
In @.opencode/agent/translator.md:
- Line 4: The model entry "opencode/gemini-3.1-pro" in
.opencode/agent/translator.md is not in the documented model glossary and
appears to be an out-of-scope docs-only change; either revert this model ID or
add documentation and justification for its addition: confirm that
"opencode/gemini-3.1-pro" is a supported model, update the Do-Not-Translate
glossary to include it, and add a short PR description explaining why this docs
change is necessary (or remove the line to revert to the previous documented
model).
In `@packages/app/src/components/dialog-connect-provider.tsx`:
- Around line 261-271: The onSelect handler mutates formStore with
setFormStore("value", ...) before reading item(), which can change the reactive
item() result; fix by capturing the current prompt/index from item() and/or
select() into local constants (e.g., const currentItem = item(); const idx =
currentItem?.index; const prompt = select();) before calling setFormStore,
validate they exist, then compute nextValue, call setFormStore, and finally call
next(idx, nextValue) using the previously captured idx so the index can't change
due to the state update.
In `@packages/console/app/src/routes/go/index.tsx`:
- Around line 50-51: The CSS selector targeting MiniMax graph points still looks
for data-model="minimax" but the model IDs in the code were changed to
"minimax-m2.7" and "minimax-m2.5"; update the selector(s) in index.css (the rule
that uses [data-model="minimax"]) to match the new IDs or use a prefix selector
like [data-model^="minimax"] so both "minimax-m2.7" and "minimax-m2.5" get the
MiniMax-specific styling.
In `@packages/docs/workspaces.mdx`:
- Line 11: Replace the inconsistent phrase "working tree" in the sentence "Each
workspace has its own git branch and directory, so you can experiment without
disturbing your main working tree." with the consistent term "worktree" to match
the rest of the page; update that sentence to read "...without disturbing your
main worktree." and ensure no other occurrences on the page use "working tree."
In `@packages/opencode/src/filesystem/index.ts`:
- Around line 48-50: The JSON parsing/stringifying in readJson and writeJson
must be wrapped so parse/stringify exceptions are converted into the library's
FileSystemError and propagated through the Effect error channel; update the
generator bodies of readJson and writeJson to catch synchronous errors from
JSON.parse and JSON.stringify (and other serialization issues like
BigInt/circular refs), construct a FileSystemError containing the original error
and path context, and propagate it via the Effect failure mechanism (so the
functions no longer throw synchronously or return undefined but fail with
AppFileSystem.Error). Ensure you reference and use the existing FileSystemError
type when creating the error and propagate it from the readJson and writeJson
implementations.
- Around line 188-195: The relative-based boundary checks in contains() and
overlaps() are incorrect because they treat any segment that starts with ".." as
an escape; add a small helper (e.g., isChildOf(parent, child)) that computes rel
= relative(parent, child) and returns true if rel === "" or the first path
segment is not exactly ".." (use rel.split(sep)[0] with path.sep from node's
path); then rewrite contains(parent, child) to call isChildOf(parent, child) and
overlaps(a,b) to use isChildOf(a,b) || isChildOf(b,a) (keep function names
contains and overlaps as-is to locate changes).
In `@packages/opencode/src/lsp/launch.ts`:
- Around line 1-18: The exported spawn's declared return type overstates
guarantees: change the function signature and overloads to return Process.Child
intersected with an object type that explicitly declares non-null stdin, stdout,
and stderr (e.g., Process.Child & { stdin: NodeJS.WritableStream; stdout:
NodeJS.ReadableStream; stderr: NodeJS.ReadableStream }) and tighten opts to
Omit<Process.Options, "stdio"> so callers cannot override stdio; keep the
runtime null-check (if (!proc.stdin || ... ) throw) and cast proc to the
narrowed return type after that check, and update any callers expecting
ChildProcessWithoutNullStreams to use the new narrowed type (symbols: spawn,
Process.spawn, Process.Child, Child).
In `@packages/opencode/src/session/system.ts`:
- Line 29: The change to SystemPrompt.provider that returns [PROMPT_DEFAULT]
alters runtime fallback behavior in production; revert this change in
packages/opencode/src/session/system.ts so SystemPrompt.provider preserves the
original fallback selection (undo the return [PROMPT_DEFAULT] modification) and
either open a separate PR for the behavioral change or update this PR’s
description to explicitly include the runtime change so reviewers know it’s
intentional.
In `@packages/opencode/src/util/process.ts`:
- Around line 146-158: The stop function currently calls proc.kill() (and the
taskkill branch) then returns without waiting for the process to actually exit,
causing races; update export async function stop(proc: ChildProcess) to await
the process termination by returning a Promise that resolves on
proc.once('exit'/'close') (or using a wrapped promise) after calling proc.kill()
or after taskkill finishes, and handle the case where proc.pid is falsy or the
process has already exited (resolve immediately); ensure both the non-Windows
branch (proc.kill()) and the Windows branch (after run([...taskkill...])) wait
for the exit event before resolving so callers in lsp/index.ts and lsp/client.ts
reliably observe a terminated process.
In `@packages/web/src/content/docs/da/go.mdx`:
- Around line 117-121: The "Endpoints" section header and the table header row
are in English; change the header "Endpoints" to a Danish heading like
"Endepunkter" (or "API-endpoints") and translate the table column headers "Model
ID", "Endpoint", and "AI SDK Package" to Danish (suggested: "Model-id",
"Endepunkt", "AI SDK-pakke") so the section remains fully localized; update the
header text and the table header row in the Go docs (the lines containing the
"Endpoints" heading and the table header cells) accordingly.
In `@packages/web/src/content/docs/fr/go.mdx`:
- Around line 77-87: Update the numeric formatting in the table and bullet list
in go.mdx to use French thousands separators (spaces) instead of commas: replace
values like "1,150", "14,000", "20,000", "2,880", "4,630", "35,000", "50,000",
"5,750", "9,250", "70,000", "100,000" and the token/cache figures "52,000",
"55,000" with "1 150", "14 000", "20 000", "2 880", "4 630", "35 000", "50 000",
"5 750", "9 250", "70 000", "100 000", "52 000", "55 000" respectively (prefer
non‑breaking spaces if supported) so the table rows and the bullet points (the
GLM-5, Kimi K2.5, MiniMax lines) use French grouping for thousands.
In `@packages/web/src/content/docs/it/zen.mdx`:
- Line 118: The pricing table lists "Qwen3 Coder 480B" with rates but there is
no corresponding entry in the Endpoint table and the model is marked deprecated
since February 6, 2026; either remove "Qwen3 Coder 480B" from the pricing table
to reflect its deprecated/unavailable status, or add a matching Endpoint table
row for "Qwen3 Coder 480B" (including the endpoint name, input/output formats,
and availability/deprecation note) so the pricing and Endpoint sections stay
consistent; locate the model name "Qwen3 Coder 480B" in the pricing table and
the Endpoint table section to apply the chosen fix.
- Around line 200-202: The Italian docs contain a duplicate privacy entry
"MiniMax M2.5 Free"—replace the second occurrence with "MiMo V2 Flash Free" so
the free-trial models list matches the free models section; update the privacy
sentence for the new entry to the same format used for "MiniMax M2.5 Free" and
"Nemotron 3 Super Free" (i.e., "MiMo V2 Flash Free: durante il periodo gratuito,
i dati raccolti potrebbero essere usati per migliorare il modello.").
In `@packages/web/src/content/docs/providers.mdx`:
- Around line 330-332: Update the product name casing in the providers list:
change "Github Copilot" to "GitHub Copilot" and "Gitlab Duo" to "GitLab Duo" so
user-facing docs use the official casing; locate the list containing "ChatGPT
Plus", "Github Copilot", "Gitlab Duo" and replace those two strings accordingly
to preserve consistency and searchability.
- Around line 321-333: The Anthropic setup steps that instruct users to choose
"Claude Pro/Max" are now contradictory with the note that Anthropic is
prohibited; update the earlier Anthropic connect instructions so step 2
instructs the user to "Select Manually enter API Key and paste your Anthropic
API key" instead of selecting Claude Pro/Max, adjust the example auth-selection
ASCII block to show "Manually enter API Key", and change step 3 wording to "Run
`/models` to select an Anthropic model" so the flow matches the new guidance;
locate and edit the Anthropic setup section text that currently references
"Claude Pro/Max" and replace those phrases and the example snippet accordingly.
In `@packages/web/src/content/docs/th/go.mdx`:
- Line 22: Replace the remaining English section headings on the page (the
"Background" heading at line 22 and the other section titles left in English at
lines 42, 65, 99, 120 and 128) with their Thai equivalents so the page and its
TOC/navigation are fully localized; update the MDX headings themselves (the
H2/H3 lines) and any corresponding anchors or explicit IDs used for the
table-of-contents so the localized headings and links remain in sync.
---
Nitpick comments:
In `@packages/app/src/i18n/es.ts`:
- Line 223: The translation for the key "common.continue" currently uses
"Enviar" which is better suited for submit actions; update the value of the
"common.continue" entry in the es.ts localization (the "common.continue" string)
to "Continuar" so it conveys progression in a flow rather than submission.
In `@packages/app/src/i18n/fr.ts`:
- Line 207: Update the French translation for the key "common.continue" in
packages/app/src/i18n/fr.ts so it reads "Continuer" instead of "Soumettre";
locate the entry for "common.continue" and replace the value to reflect step
progression wording consistent with other navigation labels.
In `@packages/app/src/i18n/no.ts`:
- Line 226: Replace the duplicate Norwegian string for the key common.continue
(currently "Send inn") with a distinct, step-forward label such as "Fortsett" to
avoid matching common.submit; update the value for the constant common.continue
in packages/app/src/i18n/no.ts so the translation reflects a forward/next action
and remains consistent with UX intent.
In `@packages/app/src/i18n/th.ts`:
- Line 223: The translation for the key common.continue currently uses the Thai
word "ส่ง" (which reads like "submit"); change the value for common.continue in
packages/app/src/i18n/th.ts to a Thai term that conveys stepping forward or
continuing (for example "ต่อไป" or "ดำเนินการต่อ") so the label differentiates
from submit actions and more accurately maps to "Continue".
In `@packages/opencode/src/cli/cmd/models.ts`:
- Around line 54-60: Compute ProviderID.make(args.provider) once and reuse it:
create a local const (e.g., providerId = ProviderID.make(args.provider)), use
providers[providerId] for the lookup instead of calling ProviderID.make twice,
keep the UI.error call and return as-is if lookup fails, and pass providerId
into printModels. Update references to use providerId so lookup and printing use
the same canonical value.
In `@packages/opencode/src/provider/provider.ts`:
- Line 841: The providers map is currently created with an unsafe cast (const
providers: Record<ProviderID, Info> = {} as Record<ProviderID, Info>) which
hides that entries may be added/removed over time; change its declaration to use
Partial<Record<ProviderID, Info>> so the type accurately represents
possibly-missing entries (const providers: Partial<Record<ProviderID, Info>> =
{}), and then update any code that reads from providers (e.g., lookups by
ProviderID) to handle undefined results (add null/undefined checks or use
non-null assertions only where guaranteed) so the stronger type-safety is
preserved for functions/methods that reference providers.
In `@packages/opencode/src/session/message-v2.ts`:
- Around line 958-959: The case block matching "case e instanceof Error:"
contains a redundant ternary; inside that branch `e` is already an Error, so
simplify the return in the branch that builds NamedError.Unknown by using
e.message directly (i.e., replace the ternary `e instanceof Error ? e.message :
String(e)` with `e.message`) while keeping the rest of the construction (`new
NamedError.Unknown(..., { cause: e }).toObject()`); update the code in the
switch branch where `e` and `NamedError.Unknown` are used.
In `@packages/opencode/test/filesystem/filesystem.test.ts`:
- Around line 2-4: Tests are duplicating the production composition; replace the
manual composition that imports and constructs Layer/NodeFileSystem with the
exported public wiring by using AppFileSystem.defaultLayer in the test suite
(referencing the symbol AppFileSystem.defaultLayer) so the tests consume the
same Layer as production; locate the setup that currently imports NodeFileSystem
and builds a Layer/Effect and swap it to use AppFileSystem.defaultLayer and
update any references to the old variable names accordingly.
In `@packages/web/src/content/docs/es/go.mdx`:
- Around line 66-91: The document shows inconsistent ordering of the MiniMax
models: the bullet list lists "MiniMax M2.5" then "MiniMax M2.7" while the table
columns are "MiniMax M2.7" then "MiniMax M2.5"; pick one ordering and make both
places match by either swapping the two MiniMax entries in the bullet list or
rearranging the table columns so the sequence of model names ("GLM-5", "Kimi
K2.5", "MiniMax M2.7", "MiniMax M2.5" or the alternative with M2.5 before M2.7)
is identical in the list and the table to ensure consistent presentation.
In `@packages/web/src/content/docs/ja/go.mdx`:
- Around line 46-51: Update the setup steps in the Go guide to require creating
or selecting a workspace before subscribing: modify the numbered list (the step
that currently reads "OpenCode Zenにサインインし、GoをサブスクライブしてAPIキーをコピーします") to split
into two steps — first instruct users to create or select a workspace (include a
link to the new Workspaces guide), then instruct them to subscribe to OpenCode
Go and copy the API key; ensure the subsequent instructions referencing the TUI
commands `/connect` and `/models` still follow and mention selecting the same
workspace when connecting.
In `@packages/web/src/content/docs/providers.mdx`:
- Around line 327-328: Replace the editorial phrase "support freedom of choice"
in the sentence "Other companies support freedom of choice with developer
tooling - you can use the following subscriptions in OpenCode with zero setup:"
with a neutral, factual alternative (e.g., "offer multiple developer tooling
options" or "provide a choice of developer tooling"). Update the sentence to
read plainly (for example: "Other companies offer multiple developer tooling
options — you can use the following subscriptions in OpenCode with zero setup:")
so the wording is neutral and non-editorial.
In `@packages/web/src/content/docs/tr/go.mdx`:
- Around line 56-81: The localized Turkish doc has inconsistent model ordering:
the bullet list lines with model names (GLM-5, Kimi K2.5, MiniMax M2.5, MiniMax
M2.7) does not match the table order (GLM-5, Kimi K2.5, MiniMax M2.7, MiniMax
M2.5); update the bullet list so the MiniMax entries appear in the same order as
the table (change the list to GLM-5, Kimi K2.5, MiniMax M2.7, MiniMax M2.5) to
ensure consistent ordering across the document.
- Around line 79-81: Update the ambiguous Turkish table label "5 saatte bir
istek" to a clearer phrasing that conveys a total over a 5-hour window; replace
the string "5 saatte bir istek" with one of the suggested alternatives such as
"5 saatlik istek" or "5 saat içinde istek sayısı" in the table row so readers
understand it represents requests in a 5-hour period.
ℹ️ Review info
⚙️ Run configuration
Configuration used: defaults
Review profile: CHILL
Plan: Pro
Run ID: 18de2dac-62c8-4d21-8034-83fa40708123
⛔ Files ignored due to path filters (1)
bun.lockis excluded by!**/*.lock
📒 Files selected for processing (101)
.opencode/agent/translator.mdnix/hashes.jsonpackage.jsonpackages/app/e2e/prompt/prompt-multiline.spec.tspackages/app/package.jsonpackages/app/src/components/dialog-connect-provider.tsxpackages/app/src/i18n/ar.tspackages/app/src/i18n/br.tspackages/app/src/i18n/bs.tspackages/app/src/i18n/da.tspackages/app/src/i18n/de.tspackages/app/src/i18n/en.tspackages/app/src/i18n/es.tspackages/app/src/i18n/fr.tspackages/app/src/i18n/ja.tspackages/app/src/i18n/ko.tspackages/app/src/i18n/no.tspackages/app/src/i18n/pl.tspackages/app/src/i18n/ru.tspackages/app/src/i18n/th.tspackages/app/src/i18n/tr.tspackages/app/src/i18n/zh.tspackages/app/src/i18n/zht.tspackages/app/src/pages/layout.tsxpackages/console/app/src/i18n/ar.tspackages/console/app/src/i18n/br.tspackages/console/app/src/i18n/da.tspackages/console/app/src/i18n/de.tspackages/console/app/src/i18n/en.tspackages/console/app/src/i18n/es.tspackages/console/app/src/i18n/fr.tspackages/console/app/src/i18n/it.tspackages/console/app/src/i18n/ja.tspackages/console/app/src/i18n/ko.tspackages/console/app/src/i18n/no.tspackages/console/app/src/i18n/pl.tspackages/console/app/src/i18n/ru.tspackages/console/app/src/i18n/th.tspackages/console/app/src/i18n/tr.tspackages/console/app/src/i18n/zh.tspackages/console/app/src/i18n/zht.tspackages/console/app/src/routes/go/index.tsxpackages/console/app/src/routes/workspace/[id]/go/lite-section.tsxpackages/desktop-electron/package.jsonpackages/docs/docs.jsonpackages/docs/index.mdxpackages/docs/workspaces.mdxpackages/opencode/package.jsonpackages/opencode/src/cli/cmd/models.tspackages/opencode/src/cli/cmd/pr.tspackages/opencode/src/cli/cmd/providers.tspackages/opencode/src/file/watcher.tspackages/opencode/src/filesystem/index.tspackages/opencode/src/ide/index.tspackages/opencode/src/lsp/client.tspackages/opencode/src/lsp/index.tspackages/opencode/src/lsp/launch.tspackages/opencode/src/lsp/server.tspackages/opencode/src/plugin/index.tspackages/opencode/src/provider/provider.tspackages/opencode/src/provider/schema.tspackages/opencode/src/session/llm.tspackages/opencode/src/session/message-v2.tspackages/opencode/src/session/processor.tspackages/opencode/src/session/prompt/anthropic-20250930.txtpackages/opencode/src/session/prompt/default.txtpackages/opencode/src/session/system.tspackages/opencode/src/skill/discovery.tspackages/opencode/src/snapshot/index.tspackages/opencode/src/tool/truncate-effect.tspackages/opencode/src/util/eventloop.tspackages/opencode/src/util/process.tspackages/opencode/test/file/watcher.test.tspackages/opencode/test/filesystem/filesystem.test.tspackages/opencode/test/lsp/launch.test.tspackages/opencode/test/provider/amazon-bedrock.test.tspackages/opencode/test/provider/gitlab-duo.test.tspackages/opencode/test/provider/provider.test.tspackages/opencode/test/session/message-v2.test.tspackages/opencode/test/util/process.test.tspackages/web/src/content/docs/ar/go.mdxpackages/web/src/content/docs/bs/go.mdxpackages/web/src/content/docs/da/go.mdxpackages/web/src/content/docs/de/go.mdxpackages/web/src/content/docs/es/go.mdxpackages/web/src/content/docs/fr/go.mdxpackages/web/src/content/docs/go.mdxpackages/web/src/content/docs/it/go.mdxpackages/web/src/content/docs/it/zen.mdxpackages/web/src/content/docs/ja/go.mdxpackages/web/src/content/docs/ko/go.mdxpackages/web/src/content/docs/nb/go.mdxpackages/web/src/content/docs/pl/go.mdxpackages/web/src/content/docs/providers.mdxpackages/web/src/content/docs/pt-br/go.mdxpackages/web/src/content/docs/ru/go.mdxpackages/web/src/content/docs/th/go.mdxpackages/web/src/content/docs/tr/go.mdxpackages/web/src/content/docs/zen.mdxpackages/web/src/content/docs/zh-cn/go.mdxpackages/web/src/content/docs/zh-tw/go.mdx
💤 Files with no reviewable changes (4)
- packages/opencode/src/util/eventloop.ts
- packages/opencode/src/cli/cmd/providers.ts
- packages/opencode/src/plugin/index.ts
- packages/opencode/src/session/prompt/anthropic-20250930.txt
| description: Translate content for a specified locale while preserving technical terms | ||
| mode: subagent | ||
| model: opencode/gemini-3-pro | ||
| model: opencode/gemini-3.1-pro |
There was a problem hiding this comment.
🧩 Analysis chain
🏁 Script executed:
#!/bin/bash
# Verify where model IDs are defined/referenced and whether this new ID appears elsewhere.
rg -n -C2 'opencode/gemini-3\.1-pro|opencode/gemini-3-pro|model:\s*opencode/' .Repository: anduimagui/opencode
Length of output: 45
🏁 Script executed:
#!/bin/bash
# Check the git diff for this specific file to see what changed
git diff HEAD -- .opencode/agent/translator.md | head -30Repository: anduimagui/opencode
Length of output: 45
🏁 Script executed:
#!/bin/bash
# Search for model configuration definitions, registries, or documentation
rg -n 'model|gemini|opencode' '.opencode/' -t md -t yaml -t json | head -20Repository: anduimagui/opencode
Length of output: 2278
🏁 Script executed:
#!/bin/bash
# Look for any documentation or config files that list supported models
find . -type f \( -name "*.md" -o -name "*.yaml" -o -name "*.yml" -o -name "*.json" \) | xargs rg -l 'model|opencode' | head -10Repository: anduimagui/opencode
Length of output: 415
🏁 Script executed:
#!/bin/bash
# Check git status and history of this specific file
git status .opencode/agent/translator.md
echo "---"
git log --oneline -5 -- .opencode/agent/translator.md
echo "---"
git show HEAD:.opencode/agent/translator.md 2>/dev/null || echo "File not in HEAD"Repository: anduimagui/opencode
Length of output: 16520
🏁 Script executed:
#!/bin/bash
# Search for model definitions, catalogs, or validation logic
rg -n 'gemini|claude|kimi' . -t md -t json -t yaml -t js | grep -i 'model\|catalog\|support\|registry' | head -15Repository: anduimagui/opencode
Length of output: 1455
🏁 Script executed:
#!/bin/bash
# Look for any .opencode configuration or schema documentation
cat .opencode/agent/translator.md
echo "---"
ls -la .opencode/agent/ | head -10Repository: anduimagui/opencode
Length of output: 16757
Confirm this model ID is supported and document why it changes for a docs-only PR.
The model opencode/gemini-3.1-pro does not appear in the official model registry (the Do-Not-Translate glossary in this file lists all documented models) and is not used in any other agent config files. Other agents use models like opencode/claude-haiku-4-5 and opencode/kimi-k2 which are both in configs and in the glossary. This change is also out of scope for a Workspaces-docs PR unless explicitly documented in the PR description.
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.
In @.opencode/agent/translator.md at line 4, The model entry
"opencode/gemini-3.1-pro" in .opencode/agent/translator.md is not in the
documented model glossary and appears to be an out-of-scope docs-only change;
either revert this model ID or add documentation and justification for its
addition: confirm that "opencode/gemini-3.1-pro" is a supported model, update
the Do-Not-Translate glossary to include it, and add a short PR description
explaining why this docs change is necessary (or remove the line to revert to
the previous documented model).
| onSelect={(value) => { | ||
| if (!value) return | ||
| const prompt = select() | ||
| if (!prompt) return | ||
| const nextValue = { | ||
| ...formStore.value, | ||
| [prompt.key]: value.value, | ||
| } | ||
| setFormStore("value", prompt.key, value.value) | ||
| void next(item()!.index, nextValue) | ||
| }} |
There was a problem hiding this comment.
Potential reactive state timing issue in select prompt handler.
After calling setFormStore("value", ...) on line 269, the item() accessor may return a different prompt (or undefined) because current() depends on formStore.value. Capturing the index before the state update would be safer.
Suggested fix
onSelect={(value) => {
if (!value) return
const prompt = select()
if (!prompt) return
+ const currentIndex = item()!.index
const nextValue = {
...formStore.value,
[prompt.key]: value.value,
}
setFormStore("value", prompt.key, value.value)
- void next(item()!.index, nextValue)
+ void next(currentIndex, nextValue)
}}🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.
In `@packages/app/src/components/dialog-connect-provider.tsx` around lines 261 -
271, The onSelect handler mutates formStore with setFormStore("value", ...)
before reading item(), which can change the reactive item() result; fix by
capturing the current prompt/index from item() and/or select() into local
constants (e.g., const currentItem = item(); const idx = currentItem?.index;
const prompt = select();) before calling setFormStore, validate they exist, then
compute nextValue, call setFormStore, and finally call next(idx, nextValue)
using the previously captured idx so the index can't change due to the state
update.
| { id: "minimax-m2.7", name: "MiniMax M2.7", req: 14000, d: "330ms" }, | ||
| { id: "minimax-m2.5", name: "MiniMax M2.5", req: 20000, d: "360ms" }, |
There was a problem hiding this comment.
Update MiniMax CSS selectors to match new model IDs.
Line 50 and Line 51 changed model IDs to versioned values, but packages/console/app/src/routes/go/index.css (Line 664) still targets data-model="minimax". This breaks MiniMax-specific styling for the graph points.
💡 Proposed fix
- [data-point][data-kind="go"][data-model="minimax"] {
+ [data-point][data-kind="go"][data-model^="minimax-"] {
fill: var(--color-go-3);
}🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.
In `@packages/console/app/src/routes/go/index.tsx` around lines 50 - 51, The CSS
selector targeting MiniMax graph points still looks for data-model="minimax" but
the model IDs in the code were changed to "minimax-m2.7" and "minimax-m2.5";
update the selector(s) in index.css (the rule that uses [data-model="minimax"])
to match the new IDs or use a prefix selector like [data-model^="minimax"] so
both "minimax-m2.7" and "minimax-m2.5" get the MiniMax-specific styling.
| - The project’s main worktree is the **local** workspace. | ||
| - Additional worktrees are **sandbox** workspaces (extra directories tracked on the project). | ||
|
|
||
| Each workspace has its own git branch and directory, so you can experiment without disturbing your main working tree. |
There was a problem hiding this comment.
Use consistent git terminology (“worktree” vs “working tree”).
This line switches to “working tree” while the rest of the page uses “worktree.” Keep one term throughout for clarity.
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.
In `@packages/docs/workspaces.mdx` at line 11, Replace the inconsistent phrase
"working tree" in the sentence "Each workspace has its own git branch and
directory, so you can experiment without disturbing your main working tree."
with the consistent term "worktree" to match the rest of the page; update that
sentence to read "...without disturbing your main worktree." and ensure no other
occurrences on the page use "working tree."
| const readJson = Effect.fn("FileSystem.readJson")(function* (path: string) { | ||
| const text = yield* fs.readFileString(path) | ||
| return JSON.parse(text) |
There was a problem hiding this comment.
🧩 Analysis chain
🏁 Script executed:
#!/bin/bash
node <<'NODE'
try {
JSON.parse("{")
} catch (err) {
console.log("parse:", err.name)
}
console.log("stringify undefined:", JSON.stringify(undefined))
try {
JSON.stringify({ n: 1n })
} catch (err) {
console.log("bigint:", err.name)
}
const cyclic = {}
cyclic.self = cyclic
try {
JSON.stringify(cyclic)
} catch (err) {
console.log("cyclic:", err.name)
}
NODERepository: anduimagui/opencode
Length of output: 148
🏁 Script executed:
# Check if the file exists and examine the readJson and writeJson implementations
cat packages/opencode/src/filesystem/index.ts | head -100Repository: anduimagui/opencode
Length of output: 4389
🏁 Script executed:
# Read more to see the complete readJson and writeJson implementations
sed -n '48,60p' packages/opencode/src/filesystem/index.tsRepository: anduimagui/opencode
Length of output: 657
🏁 Script executed:
# Verify Effect.try usage pattern and FileSystemError definition
grep -n "Effect.try" packages/opencode/src/filesystem/index.tsRepository: anduimagui/opencode
Length of output: 107
🏁 Script executed:
# Check if Effect.try is available in the codebase or used elsewhere
rg "Effect\.try" packages/opencode/src/ -A 2Repository: anduimagui/opencode
Length of output: 2011
🏁 Script executed:
# Check what happens when JSON.stringify returns undefined and how it might affect writeFileString
node <<'EOF'
// Test what JSON.stringify returns for edge cases
console.log("undefined:", JSON.stringify(undefined))
console.log("function:", JSON.stringify(() => {}))
console.log("symbol:", JSON.stringify(Symbol('test')))
// These throw
const tests = [
{ name: "bigint", obj: { n: 1n } },
{ name: "cyclic", obj: (() => { const o = {}; o.self = o; return o; })() },
];
for (const test of tests) {
try {
JSON.stringify(test.obj);
} catch (e) {
console.log(`${test.name} throws: ${e.constructor.name}`)
}
}
EOFRepository: anduimagui/opencode
Length of output: 171
Wrap JSON parse/stringify failures in FileSystemError.
Invalid JSON, BigInt, circular data, and unsupported top-level values currently escape as synchronous throws or undefined, violating the API signature that advertises AppFileSystem.Error. The readJson and writeJson implementations lack error handling to channel these failures through the Effect error layer.
Proposed fix
const readJson = Effect.fn("FileSystem.readJson")(function* (path: string) {
const text = yield* fs.readFileString(path)
- return JSON.parse(text)
+ return yield* Effect.try({
+ try: () => JSON.parse(text),
+ catch: (cause) => new FileSystemError({ method: "readJson", cause }),
+ })
})
const writeJson = Effect.fn("FileSystem.writeJson")(function* (path: string, data: unknown, mode?: number) {
- const content = JSON.stringify(data, null, 2)
+ const content = yield* Effect.try({
+ try: () => JSON.stringify(data, null, 2),
+ catch: (cause) => new FileSystemError({ method: "writeJson", cause }),
+ })
+ if (content === undefined) {
+ yield* Effect.fail(new FileSystemError({ method: "writeJson" }))
+ }
yield* fs.writeFileString(path, content)
if (mode) yield* fs.chmod(path, mode)
})🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.
In `@packages/opencode/src/filesystem/index.ts` around lines 48 - 50, The JSON
parsing/stringifying in readJson and writeJson must be wrapped so
parse/stringify exceptions are converted into the library's FileSystemError and
propagated through the Effect error channel; update the generator bodies of
readJson and writeJson to catch synchronous errors from JSON.parse and
JSON.stringify (and other serialization issues like BigInt/circular refs),
construct a FileSystemError containing the original error and path context, and
propagate it via the Effect failure mechanism (so the functions no longer throw
synchronously or return undefined but fail with AppFileSystem.Error). Ensure you
reference and use the existing FileSystemError type when creating the error and
propagate it from the readJson and writeJson implementations.
| | MiniMax M2.5 | $0.30 | $1.20 | $0.06 | $0.375 | | ||
| | GLM 5 | $1.00 | $3.20 | $0.20 | - | | ||
| | Kimi K2.5 | $0.60 | $3.00 | $0.10 | - | | ||
| | Qwen3 Coder 480B | $0.45 | $1.50 | - | - | |
There was a problem hiding this comment.
Inconsistency: Qwen3 Coder 480B has pricing but no endpoint entry.
This model appears in the pricing table but is missing from the Endpoint table (lines 56-89). Additionally, it's listed as deprecated since February 6, 2026 (line 191). Consider either:
- Removing it from the pricing table since it's deprecated and has no endpoint, or
- Adding it to the endpoint table if it should still be available.
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.
In `@packages/web/src/content/docs/it/zen.mdx` at line 118, The pricing table
lists "Qwen3 Coder 480B" with rates but there is no corresponding entry in the
Endpoint table and the model is marked deprecated since February 6, 2026; either
remove "Qwen3 Coder 480B" from the pricing table to reflect its
deprecated/unavailable status, or add a matching Endpoint table row for "Qwen3
Coder 480B" (including the endpoint name, input/output formats, and
availability/deprecation note) so the pricing and Endpoint sections stay
consistent; locate the model name "Qwen3 Coder 480B" in the pricing table and
the Endpoint table section to apply the chosen fix.
| - MiniMax M2.5 Free: durante il periodo gratuito, i dati raccolti potrebbero essere usati per migliorare il modello. | ||
| - OpenAI APIs: le richieste vengono conservate per 30 giorni in conformita alle [OpenAI's Data Policies](https://platform.openai.com/docs/guides/your-data). | ||
| - Anthropic APIs: le richieste vengono conservate per 30 giorni in conformita alle [Anthropic's Data Policies](https://docs.anthropic.com/en/docs/claude-code/data-usage). | ||
| - MiniMax M2.5 Free: durante il periodo gratuito, i dati raccolti potrebbero essere usati per migliorare il modello. | ||
| - Nemotron 3 Super Free: durante il periodo gratuito, i dati raccolti potrebbero essere usati per migliorare il modello. |
There was a problem hiding this comment.
Duplicate privacy exception entry — likely missing MiMo V2 Flash Free.
Line 200 and 201 both list "MiniMax M2.5 Free". Based on the free models section (lines 156-159), line 201 should likely be "MiMo V2 Flash Free" instead, as it's one of the free trial models but is missing its privacy disclosure.
Proposed fix
- Big Pickle: durante il periodo gratuito, i dati raccolti potrebbero essere usati per migliorare il modello.
- MiniMax M2.5 Free: durante il periodo gratuito, i dati raccolti potrebbero essere usati per migliorare il modello.
-- MiniMax M2.5 Free: durante il periodo gratuito, i dati raccolti potrebbero essere usati per migliorare il modello.
+- MiMo V2 Flash Free: durante il periodo gratuito, i dati raccolti potrebbero essere usati per migliorare il modello.
- Nemotron 3 Super Free: durante il periodo gratuito, i dati raccolti potrebbero essere usati per migliorare il modello.🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.
In `@packages/web/src/content/docs/it/zen.mdx` around lines 200 - 202, The Italian
docs contain a duplicate privacy entry "MiniMax M2.5 Free"—replace the second
occurrence with "MiMo V2 Flash Free" so the free-trial models list matches the
free models section; update the privacy sentence for the new entry to the same
format used for "MiniMax M2.5 Free" and "Nemotron 3 Super Free" (i.e., "MiMo V2
Flash Free: durante il periodo gratuito, i dati raccolti potrebbero essere usati
per migliorare il modello.").
| There are plugins that allow you to use your Claude Pro/Max models with | ||
| OpenCode. Anthropic explicitly prohibits this. | ||
|
|
||
| ##### Using API keys | ||
| Previous versions of OpenCode came bundled with these plugins but that is no | ||
| longer the case as of 1.3.0 | ||
|
|
||
| You can also select **Create an API Key** if you don't have a Pro/Max subscription. It'll also open your browser and ask you to login to Anthropic and give you a code you can paste in your terminal. | ||
| Other companies support freedom of choice with developer tooling - you can use | ||
| the following subscriptions in OpenCode with zero setup: | ||
|
|
||
| Or if you already have an API key, you can select **Manually enter API Key** and paste it in your terminal. | ||
| - ChatGPT Plus | ||
| - Github Copilot | ||
| - Gitlab Duo | ||
| ::: |
There was a problem hiding this comment.
Resolve the Anthropic setup contradiction in this section.
This new note conflicts with earlier Anthropic steps (Line 304–315), which still tell users to pick Claude Pro/Max in /connect. That creates a broken flow for readers.
🔧 Suggested doc fix
### Anthropic
1. Once you've signed up, run the `/connect` command and select Anthropic.
```txt
/connect
```
-2. Here you can select the **Claude Pro/Max** option and it'll open your browser
- and ask you to authenticate.
+2. Select **Manually enter API Key** and paste your Anthropic API key.
```txt
┌ Select auth method
│
- │ Manually enter API Key
+ │ Manually enter API Key
└
```
-3. Now all the Anthropic models should be available when you use the `/models` command.
+3. Run `/models` to select an Anthropic model.🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.
In `@packages/web/src/content/docs/providers.mdx` around lines 321 - 333, The
Anthropic setup steps that instruct users to choose "Claude Pro/Max" are now
contradictory with the note that Anthropic is prohibited; update the earlier
Anthropic connect instructions so step 2 instructs the user to "Select Manually
enter API Key and paste your Anthropic API key" instead of selecting Claude
Pro/Max, adjust the example auth-selection ASCII block to show "Manually enter
API Key", and change step 3 wording to "Run `/models` to select an Anthropic
model" so the flow matches the new guidance; locate and edit the Anthropic setup
section text that currently references "Claude Pro/Max" and replace those
phrases and the example snippet accordingly.
| - ChatGPT Plus | ||
| - Github Copilot | ||
| - Gitlab Duo |
There was a problem hiding this comment.
Fix product name capitalization in user-facing docs.
Use official casing for consistency and searchability:
GitHub Copilot(notGithub Copilot)GitLab Duo(notGitlab Duo)
✏️ Suggested copy edit
-- Github Copilot
-- Gitlab Duo
+- GitHub Copilot
+- GitLab Duo📝 Committable suggestion
‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.
| - ChatGPT Plus | |
| - Github Copilot | |
| - Gitlab Duo | |
| - ChatGPT Plus | |
| - GitHub Copilot | |
| - GitLab Duo |
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.
In `@packages/web/src/content/docs/providers.mdx` around lines 330 - 332, Update
the product name casing in the providers list: change "Github Copilot" to
"GitHub Copilot" and "Gitlab Duo" to "GitLab Duo" so user-facing docs use the
official casing; locate the list containing "ChatGPT Plus", "Github Copilot",
"Gitlab Duo" and replace those two strings accordingly to preserve consistency
and searchability.
| --- | ||
|
|
||
| ## ความเป็นมา | ||
| ## Background |
There was a problem hiding this comment.
Translate the edited section headings into Thai.
The section titles on Lines 22, 42, 65, 99, 120, and 128 are still English on an otherwise Thai page, so the localized TOC/navigation remains partially untranslated.
Also applies to: 42-42, 65-65, 99-99, 120-120, 128-128
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.
In `@packages/web/src/content/docs/th/go.mdx` at line 22, Replace the remaining
English section headings on the page (the "Background" heading at line 22 and
the other section titles left in English at lines 42, 65, 99, 120 and 128) with
their Thai equivalents so the page and its TOC/navigation are fully localized;
update the MDX headings themselves (the H2/H3 lines) and any corresponding
anchors or explicit IDs used for the table-of-contents so the localized headings
and links remain in sync.
|
This pull request has been automatically closed because it was not updated to meet our contributing guidelines within the 2-hour window. Feel free to open a new pull request that follows our guidelines. |
Adds a new documentation page explaining what OpenCode workspaces are and how to create one from within a project. Also updates Mintlify navigation and the docs homepage to link to the new page.
Summary by CodeRabbit
Release Notes
New Features
Documentation
Improvements
Chores