Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
51 commits
Select commit Hold shift + click to select a range
2a87860
zen: gpt 5.3 codex
fwang Feb 24, 2026
2c00eb6
feat(core): add workspace-serve command (experimental) (#14960)
jlongster Feb 24, 2026
29ddd55
release: v1.2.11
Feb 24, 2026
3af12c5
fix(opencode): import custom tools via file URL (#14971)
Hona Feb 25, 2026
e718263
fix(project): await git id cache write (#14977)
Hona Feb 25, 2026
da40ab7
fix(opencode): disable config bun cache in CI (#14985)
Hona Feb 25, 2026
814c1d3
refactor: migrate Bun.spawn to Process utility with timeout and clean…
thdxr Feb 25, 2026
fa559b0
core: temporarily disable plan enter tool to prevent unintended mode …
thdxr Feb 25, 2026
637059a
feat: show LSP errors for apply_patch tool (#14715)
thdxr Feb 25, 2026
a487f11
ci: auto-resolve merge conflicts in beta sync using opencode
thdxr Feb 25, 2026
0b3fb5d
ci: specify opencode/kimi-k2.5 model in beta script to ensure consist…
thdxr Feb 25, 2026
6af7ddf
ci: switch beta script to gpt-5.3-codex for improved code generation …
thdxr Feb 25, 2026
76b60f3
desktop: make readme more accurate
Brendonovich Feb 25, 2026
6fc5506
zen: go
fwang Feb 25, 2026
d00d98d
wip: zen go
fwang Feb 25, 2026
1172ebe
wip: zen go
fwang Feb 25, 2026
5d5f2cf
wip: zen go
fwang Feb 25, 2026
d7500b2
zen: go
fwang Feb 25, 2026
fc6e793
feat(desktop): enhance Windows app resolution and UI loading states (…
neriousy Feb 25, 2026
3c6c744
sync
thdxr Feb 25, 2026
561f9f5
opencode go copy
thdxr Feb 25, 2026
d848c9b
release: v1.2.13
Feb 25, 2026
088a81c
fix: consume stdout concurrently with process exit in auth login (#15…
Ayushlm10 Feb 25, 2026
79b5ce5
feat(core): add message delete endpoint (#14417)
shantur Feb 25, 2026
de2bc25
release: v1.2.14
Feb 25, 2026
5e5823e
chore: generate
opencode-agent[bot] Feb 25, 2026
e48c1cc
chore(workflows): label vouched users and restrict vouch managers (#1…
R44VC0RP Feb 25, 2026
2869922
fix(app): correct Copilot provider description in i18n files (#15071)
Oleksii-Pavliuk Feb 25, 2026
45191ad
fix(app): keyboard navigation previous/next message (#15047)
neriousy Feb 25, 2026
7afa48b
tweak(ui): keep reasoning inline code subdued in dark mode
iamdavidhill Feb 20, 2026
b368181
chore: move glossary
adamdotdevin Feb 25, 2026
1172fa4
wip: zen go
fwang Feb 25, 2026
9d29d69
split tui/server config (#13968)
kommander Feb 25, 2026
4551282
chore: generate
opencode-agent[bot] Feb 25, 2026
444178e
fix(docs): update schema URL in share configuration examples across m…
OpeOginni Feb 25, 2026
b8337cd
fix(app): permissions and questions from child sessions (#15105)
adamdotdevin Feb 26, 2026
c4ea11f
wip: zen
fwang Feb 26, 2026
392a6d9
fix(desktop): remove interactive shell flag from sidecar spawn to pre…
kilhyeonjun Feb 26, 2026
aae75b3
fix(app): middle-click tab close in scrollable tab bar (#15081)
choephix Feb 26, 2026
fce811b
fix: most segfaults on windows with Bun v1.3.10 stable (#15181)
Hona Feb 26, 2026
799b262
release: v1.2.15
Feb 26, 2026
6b02165
fix(app): open in powershell (#15112)
neriousy Feb 26, 2026
bb8a171
fix(desktop): restore shell path env for desktop sidecar (#15211)
nexxeln Feb 26, 2026
7453e78
feat: opencode go provider list (#15203)
iamdavidhill Feb 26, 2026
05ac0a7
fix(app): simplify review layout (#14953)
adamdotdevin Feb 26, 2026
b4d0090
chore: fix flaky test
adamdotdevin Feb 26, 2026
96ca0de
wip: zen
fwang Feb 26, 2026
08f056d
docs: Sync zh_CN docs with English Version (#15228)
niushuai1991 Feb 26, 2026
5745ee8
refactor(desktop): enhance project tile interaction with suppress hov…
OpeOginni Feb 26, 2026
26f21b4
feat(ui): make file references clickable in session output
a-happysoft Feb 26, 2026
ae896ca
Merge branch 'dev' into feat/desktop-clickable-file-links
a-happysoft Feb 26, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
56 changes: 2 additions & 54 deletions .github/actions/setup-bun/action.yml
Original file line number Diff line number Diff line change
@@ -1,10 +1,5 @@
name: "Setup Bun"
description: "Setup Bun with caching and install dependencies"
inputs:
cross-compile:
description: "Pre-cache canary cross-compile binaries for all targets"
required: false
default: "false"
runs:
using: "composite"
steps:
Expand All @@ -21,12 +16,13 @@ runs:
shell: bash
run: |
if [ "$RUNNER_ARCH" = "X64" ]; then
V=$(node -p "require('./package.json').packageManager.split('@')[1]")
case "$RUNNER_OS" in
macOS) OS=darwin ;;
Linux) OS=linux ;;
Windows) OS=windows ;;
esac
echo "url=https://github.com/oven-sh/bun/releases/download/canary/bun-${OS}-x64-baseline.zip" >> "$GITHUB_OUTPUT"
echo "url=https://github.com/oven-sh/bun/releases/download/bun-v${V}/bun-${OS}-x64-baseline.zip" >> "$GITHUB_OUTPUT"
fi

- name: Setup Bun
Expand All @@ -35,54 +31,6 @@ runs:
bun-version-file: ${{ !steps.bun-url.outputs.url && 'package.json' || '' }}
bun-download-url: ${{ steps.bun-url.outputs.url }}

- name: Pre-cache canary cross-compile binaries
if: inputs.cross-compile == 'true'
shell: bash
run: |
BUN_VERSION=$(bun --revision)
if echo "$BUN_VERSION" | grep -q "canary"; then
SEMVER=$(echo "$BUN_VERSION" | sed 's/^\([0-9]*\.[0-9]*\.[0-9]*\).*/\1/')
echo "Bun version: $BUN_VERSION (semver: $SEMVER)"
CACHE_DIR="$HOME/.bun/install/cache"
mkdir -p "$CACHE_DIR"
TMP_DIR=$(mktemp -d)
for TARGET in linux-aarch64 linux-x64 linux-x64-baseline linux-aarch64-musl linux-x64-musl linux-x64-musl-baseline darwin-aarch64 darwin-x64 windows-x64 windows-x64-baseline; do
DEST="$CACHE_DIR/bun-${TARGET}-v${SEMVER}"
if [ -f "$DEST" ]; then
echo "Already cached: $DEST"
continue
fi
URL="https://github.com/oven-sh/bun/releases/download/canary/bun-${TARGET}.zip"
echo "Downloading $TARGET from $URL"
if curl -sfL -o "$TMP_DIR/bun.zip" "$URL"; then
unzip -qo "$TMP_DIR/bun.zip" -d "$TMP_DIR"
if echo "$TARGET" | grep -q "windows"; then
BIN_NAME="bun.exe"
else
BIN_NAME="bun"
fi
mv "$TMP_DIR/bun-${TARGET}/$BIN_NAME" "$DEST"
chmod +x "$DEST"
rm -rf "$TMP_DIR/bun-${TARGET}" "$TMP_DIR/bun.zip"
echo "Cached: $DEST"
# baseline bun resolves "bun-darwin-x64" to the baseline cache key
# so copy the modern binary there too
if [ "$TARGET" = "darwin-x64" ]; then
BASELINE_DEST="$CACHE_DIR/bun-darwin-x64-baseline-v${SEMVER}"
if [ ! -f "$BASELINE_DEST" ]; then
cp "$DEST" "$BASELINE_DEST"
echo "Cached (baseline alias): $BASELINE_DEST"
fi
fi
else
echo "Skipped: $TARGET (not available)"
fi
done
rm -rf "$TMP_DIR"
else
echo "Not a canary build ($BUN_VERSION), skipping pre-cache"
fi

- name: Install dependencies
run: bun install
shell: bash
4 changes: 4 additions & 0 deletions .github/workflows/beta.yml
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,11 @@ jobs:
opencode-app-id: ${{ vars.OPENCODE_APP_ID }}
opencode-app-secret: ${{ secrets.OPENCODE_APP_SECRET }}

- name: Install OpenCode
run: bun i -g opencode-ai

- name: Sync beta branch
env:
GH_TOKEN: ${{ steps.setup-git-committer.outputs.token }}
OPENCODE_API_KEY: ${{ secrets.OPENCODE_API_KEY }}
run: bun script/beta.ts
8 changes: 4 additions & 4 deletions .github/workflows/docs-locale-sync.yml
Original file line number Diff line number Diff line change
Expand Up @@ -65,9 +65,9 @@ jobs:
"packages/web/src/content/docs/*/*.mdx": "allow",
".opencode": "allow",
".opencode/agent": "allow",
".opencode/agent/glossary": "allow",
".opencode/glossary": "allow",
".opencode/agent/translator.md": "allow",
".opencode/agent/glossary/*.md": "allow"
".opencode/glossary/*.md": "allow"
},
"edit": {
"*": "deny",
Expand All @@ -76,7 +76,7 @@ jobs:
"glob": {
"*": "deny",
"packages/web/src/content/docs*": "allow",
".opencode/agent/glossary*": "allow"
".opencode/glossary*": "allow"
},
"task": {
"*": "deny",
Expand All @@ -90,7 +90,7 @@ jobs:
"read": {
"*": "deny",
".opencode/agent/translator.md": "allow",
".opencode/agent/glossary/*.md": "allow"
".opencode/glossary/*.md": "allow"
}
}
}
Expand Down
4 changes: 1 addition & 3 deletions .github/workflows/publish.yml
Original file line number Diff line number Diff line change
Expand Up @@ -77,8 +77,6 @@ jobs:
fetch-tags: true

- uses: ./.github/actions/setup-bun
with:
cross-compile: "true"

- name: Setup git committer
id: committer
Expand All @@ -90,7 +88,7 @@ jobs:
- name: Build
id: build
run: |
./packages/opencode/script/build.ts --all
./packages/opencode/script/build.ts
env:
OPENCODE_VERSION: ${{ needs.version.outputs.version }}
OPENCODE_RELEASE: ${{ needs.version.outputs.release }}
Expand Down
4 changes: 1 addition & 3 deletions .github/workflows/sign-cli.yml
Original file line number Diff line number Diff line change
Expand Up @@ -20,12 +20,10 @@ jobs:
fetch-tags: true

- uses: ./.github/actions/setup-bun
with:
cross-compile: "true"

- name: Build
run: |
./packages/opencode/script/build.ts --all
./packages/opencode/script/build.ts

- name: Upload unsigned Windows CLI
id: upload_unsigned_windows_cli
Expand Down
58 changes: 39 additions & 19 deletions .github/workflows/vouch-check-issue.yml
Original file line number Diff line number Diff line change
Expand Up @@ -42,15 +42,17 @@ jobs:
throw error;
}

// Parse the .td file for denounced users
// Parse the .td file for vouched and denounced users
const vouched = new Set();
const denounced = new Map();
for (const line of content.split('\n')) {
const trimmed = line.trim();
if (!trimmed || trimmed.startsWith('#')) continue;
if (!trimmed.startsWith('-')) continue;

const rest = trimmed.slice(1).trim();
const isDenounced = trimmed.startsWith('-');
const rest = isDenounced ? trimmed.slice(1).trim() : trimmed;
if (!rest) continue;

const spaceIdx = rest.indexOf(' ');
const handle = spaceIdx === -1 ? rest : rest.slice(0, spaceIdx);
const reason = spaceIdx === -1 ? null : rest.slice(spaceIdx + 1).trim();
Expand All @@ -65,32 +67,50 @@ jobs:
const username = colonIdx === -1 ? handle : handle.slice(colonIdx + 1);
if (!username) continue;

denounced.set(username.toLowerCase(), reason);
if (isDenounced) {
denounced.set(username.toLowerCase(), reason);
continue;
}

vouched.add(username.toLowerCase());
}

// Check if the author is denounced
const reason = denounced.get(author.toLowerCase());
if (reason === undefined) {
core.info(`User ${author} is not denounced. Allowing issue.`);
if (reason !== undefined) {
// Author is denounced — close the issue
const body = 'This issue has been automatically closed.';

await github.rest.issues.createComment({
owner: context.repo.owner,
repo: context.repo.repo,
issue_number: issueNumber,
body,
});

await github.rest.issues.update({
owner: context.repo.owner,
repo: context.repo.repo,
issue_number: issueNumber,
state: 'closed',
state_reason: 'not_planned',
});

core.info(`Closed issue #${issueNumber} from denounced user ${author}`);
return;
}

// Author is denounced — close the issue
const body = 'This issue has been automatically closed.';

await github.rest.issues.createComment({
owner: context.repo.owner,
repo: context.repo.repo,
issue_number: issueNumber,
body,
});
// Author is positively vouched — add label
if (!vouched.has(author.toLowerCase())) {
core.info(`User ${author} is not denounced or vouched. Allowing issue.`);
return;
}

await github.rest.issues.update({
await github.rest.issues.addLabels({
owner: context.repo.owner,
repo: context.repo.repo,
issue_number: issueNumber,
state: 'closed',
state_reason: 'not_planned',
labels: ['Vouched'],
});

core.info(`Closed issue #${issueNumber} from denounced user ${author}`);
core.info(`Added vouched label to issue #${issueNumber} from ${author}`);
55 changes: 38 additions & 17 deletions .github/workflows/vouch-check-pr.yml
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ on:

permissions:
contents: read
issues: write
pull-requests: write

jobs:
Expand Down Expand Up @@ -42,15 +43,17 @@ jobs:
throw error;
}

// Parse the .td file for denounced users
// Parse the .td file for vouched and denounced users
const vouched = new Set();
const denounced = new Map();
for (const line of content.split('\n')) {
const trimmed = line.trim();
if (!trimmed || trimmed.startsWith('#')) continue;
if (!trimmed.startsWith('-')) continue;

const rest = trimmed.slice(1).trim();
const isDenounced = trimmed.startsWith('-');
const rest = isDenounced ? trimmed.slice(1).trim() : trimmed;
if (!rest) continue;

const spaceIdx = rest.indexOf(' ');
const handle = spaceIdx === -1 ? rest : rest.slice(0, spaceIdx);
const reason = spaceIdx === -1 ? null : rest.slice(spaceIdx + 1).trim();
Expand All @@ -65,29 +68,47 @@ jobs:
const username = colonIdx === -1 ? handle : handle.slice(colonIdx + 1);
if (!username) continue;

denounced.set(username.toLowerCase(), reason);
if (isDenounced) {
denounced.set(username.toLowerCase(), reason);
continue;
}

vouched.add(username.toLowerCase());
}

// Check if the author is denounced
const reason = denounced.get(author.toLowerCase());
if (reason === undefined) {
core.info(`User ${author} is not denounced. Allowing PR.`);
if (reason !== undefined) {
// Author is denounced — close the PR
await github.rest.issues.createComment({
owner: context.repo.owner,
repo: context.repo.repo,
issue_number: prNumber,
body: 'This pull request has been automatically closed.',
});

await github.rest.pulls.update({
owner: context.repo.owner,
repo: context.repo.repo,
pull_number: prNumber,
state: 'closed',
});

core.info(`Closed PR #${prNumber} from denounced user ${author}`);
return;
}

// Author is denounced — close the PR
await github.rest.issues.createComment({
owner: context.repo.owner,
repo: context.repo.repo,
issue_number: prNumber,
body: 'This pull request has been automatically closed.',
});
// Author is positively vouched — add label
if (!vouched.has(author.toLowerCase())) {
core.info(`User ${author} is not denounced or vouched. Allowing PR.`);
return;
}

await github.rest.pulls.update({
await github.rest.issues.addLabels({
owner: context.repo.owner,
repo: context.repo.repo,
pull_number: prNumber,
state: 'closed',
issue_number: prNumber,
labels: ['Vouched'],
});

core.info(`Closed PR #${prNumber} from denounced user ${author}`);
core.info(`Added vouched label to PR #${prNumber} from ${author}`);
1 change: 1 addition & 0 deletions .github/workflows/vouch-manage-by-issue.yml
Original file line number Diff line number Diff line change
Expand Up @@ -33,5 +33,6 @@ jobs:
with:
issue-id: ${{ github.event.issue.number }}
comment-id: ${{ github.event.comment.id }}
roles: admin,maintain
env:
GITHUB_TOKEN: ${{ steps.committer.outputs.token }}
2 changes: 1 addition & 1 deletion .opencode/agent/translator.md
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ Requirements:
- Preserve meaning, intent, tone, and formatting (including Markdown/MDX structure).
- Preserve all technical terms and artifacts exactly: product/company names, API names, identifiers, code, commands/flags, file paths, URLs, versions, error messages, config keys/values, and anything inside inline code or code blocks.
- Also preserve every term listed in the Do-Not-Translate glossary below.
- Also apply locale-specific guidance from `.opencode/agent/glossary/<locale>.md` when available (for example, `zh-cn.md`).
- Also apply locale-specific guidance from `.opencode/glossary/<locale>.md` when available (for example, `zh-cn.md`).
- Do not modify fenced code blocks.
- Output ONLY the translation (no commentary).

Expand Down
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
Loading
Loading