Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
95 commits
Select commit Hold shift + click to select a range
13616e3
Update VOUCHED list
github-actions[bot] Feb 22, 2026
b16f7b4
docs(tui): correct typo in TUI documentation (#14604)
pirrozani Feb 22, 2026
e70d2b2
fix(app): terminal issues
adamdotdevin Feb 22, 2026
aaf8317
feat(app): feed customization options
adamdotdevin Feb 22, 2026
eb64ce0
Update VOUCHED list
github-actions[bot] Feb 22, 2026
a74fedd
fix(desktop): change detection on Windows, especially Cygwin (#13659)
edemaine Feb 22, 2026
faa6322
chore: generate
opencode-agent[bot] Feb 22, 2026
a4ed020
upgrade opentui to v0.1.81 (#14605)
kommander Feb 22, 2026
ab75ef8
chore: update nix node_modules hashes
opencode-agent[bot] Feb 23, 2026
0042a07
fix: Windows path support and canonicalization (#13671)
edemaine Feb 23, 2026
ee754c4
fix(win32): normalize paths at permission boundaries (#14738)
Hona Feb 23, 2026
5712cff
zen: track session in usage
fwang Feb 22, 2026
5596775
zen: display session in usage
fwang Feb 22, 2026
a5a70fa
wip: zen lite
fwang Feb 23, 2026
d3ecc5a
chore: generate
opencode-agent[bot] Feb 23, 2026
9f4fc5b
Revert "fix(app): terminal issues"
adamdotdevin Feb 23, 2026
8e96447
fix(app): correct inverted chevron direction in todo list (#14628)
kevinWangSheng Feb 23, 2026
3b5b21a
fix(app): duplicate markdown
adamdotdevin Feb 23, 2026
8f2d8dd
fix(app): duplicate markdown
adamdotdevin Feb 23, 2026
24c6391
fix: update workflows for better automation (#14809)
R44VC0RP Feb 23, 2026
ad5f081
fix(cicd): flakey typecheck (#14828)
Hona Feb 23, 2026
34495a7
fix(win32): scripts/turbo commands would not run (#14829)
Hona Feb 23, 2026
284251a
zen: display BYOK cost
fwang Feb 23, 2026
0a91196
fix(win32): e2e sometimes fails because windows is weird and sometime…
Hona Feb 23, 2026
0269f39
ci: add Windows to unit test matrix (#14836)
Hona Feb 23, 2026
ae19003
ci: use bun baseline build to avoid segfaults (#14839)
Hona Feb 24, 2026
cf5cfb4
upgrade to bun 1.3.10 canary and force baseline builds always (#14843)
Hona Feb 24, 2026
eda7137
app: wait for loadFile before opening file tab
Brendonovich Feb 24, 2026
cda2af2
wip: zen lite
fwang Feb 24, 2026
fb6d201
wip: zen lite
fwang Feb 24, 2026
744059a
chore: generate
opencode-agent[bot] Feb 24, 2026
a592bd9
fix: update createOpenReviewFile test to match new call order (#14881)
Hona Feb 24, 2026
de796d9
fix(test): use path.join for cross-platform glob test assertions (#14…
Hona Feb 24, 2026
3201a7d
fix(win32): add bun prefix to console app build scripts (#14884)
Hona Feb 24, 2026
6590689
fix(win32): handle CRLF line endings in markdown frontmatter parsing …
Hona Feb 24, 2026
13cabae
fix(win32): add git flags for snapshot operations and fix tests for c…
Hona Feb 24, 2026
888b123
feat: ACP - stream bash output and synthetic pending events (#14079)
noamzbr Feb 24, 2026
ef7f222
chore: generate
opencode-agent[bot] Feb 24, 2026
79254c1
fix(test): normalize git excludesFile path for Windows (#14893)
Hona Feb 24, 2026
a292edd
fix(test): harden preload cleanup against Windows EBUSY (#14895)
Hona Feb 24, 2026
1af3e9e
fix(win32): fix plugin resolution with createRequire fallback (#14898)
Hona Feb 24, 2026
1a0639e
fix(win32): normalize backslash paths in config rel() and file ignore…
Hona Feb 24, 2026
06f25c7
fix(test): use path.sep in discovery test for cross-platform path mat…
Hona Feb 24, 2026
3d379c2
fix(test): replace Unix-only assumptions with cross-platform alternat…
Hona Feb 24, 2026
36197f5
fix(win32): add 50ms tolerance for NTFS mtime fuzziness in FileTime a…
Hona Feb 24, 2026
3241777
fix(test): replace structuredClone with spread for process.env (#14908)
Hona Feb 24, 2026
e27d3d5
fix(app): remove filetree tooltips
adamdotdevin Feb 24, 2026
2cee947
fix: ACP both live and load share synthetic pending status preceeding…
noamzbr Feb 24, 2026
082f0cc
fix(app): preserve native path separators in file path helpers (#14912)
Hona Feb 24, 2026
c92913e
chore: cleanup
adamdotdevin Feb 24, 2026
5190589
zen: remove alpha models from models endpoint
fwang Feb 24, 2026
cc02476
refactor: replace error handling with serverErrorMessage utility and …
OpeOginni Feb 24, 2026
0d0d057
chore: generate
opencode-agent[bot] Feb 24, 2026
c6d8e76
fix(app): on cancel comment unhighlight lines (#14103)
neriousy Feb 24, 2026
f8cfb69
zen: restrict alpha models to admin workspaces
fwang Feb 24, 2026
68cf011
fix(app): ignore stale part deltas
adamdotdevin Feb 24, 2026
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
3a4d5e5
feat: implement copy command with options
leoncheng57 Feb 26, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
2 changes: 2 additions & 0 deletions .github/VOUCHED.td
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,9 @@
# - Denounce with minus prefix: -username or -platform:username.
# - Optional details after a space following the handle.
adamdotdevin
-agusbasari29 AI PR slop
ariane-emory
edemaine
-florianleibert
fwang
iamdavidhill
Expand Down
69 changes: 68 additions & 1 deletion .github/actions/setup-bun/action.yml
Original file line number Diff line number Diff line change
@@ -1,5 +1,10 @@
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 @@ -11,10 +16,72 @@ runs:
restore-keys: |
${{ runner.os }}-bun-

- name: Get baseline download URL
id: bun-url
shell: bash
run: |
if [ "$RUNNER_ARCH" = "X64" ]; then
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"
fi

- name: Setup Bun
uses: oven-sh/setup-bun@v2
with:
bun-version-file: package.json
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
Expand Down
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
9 changes: 9 additions & 0 deletions .github/workflows/compliance-close.yml
Original file line number Diff line number Diff line change
Expand Up @@ -65,6 +65,15 @@ jobs:
body: closeMessage,
});

try {
await github.rest.issues.removeLabel({
owner: context.repo.owner,
repo: context.repo.repo,
issue_number: item.number,
name: 'needs:compliance',
});
} catch (e) {}

if (isPR) {
await github.rest.pulls.update({
owner: context.repo.owner,
Expand Down
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
12 changes: 6 additions & 6 deletions .github/workflows/pr-standards.yml
Original file line number Diff line number Diff line change
Expand Up @@ -108,11 +108,11 @@ jobs:

await removeLabel('needs:title');

// Step 2: Check for linked issue (skip for docs/refactor PRs)
const skipIssueCheck = /^(docs|refactor)\s*(\([a-zA-Z0-9-]+\))?\s*:/.test(title);
// Step 2: Check for linked issue (skip for docs/refactor/feat PRs)
const skipIssueCheck = /^(docs|refactor|feat)\s*(\([a-zA-Z0-9-]+\))?\s*:/.test(title);
if (skipIssueCheck) {
await removeLabel('needs:issue');
console.log('Skipping issue check for docs/refactor PR');
console.log('Skipping issue check for docs/refactor/feat PR');
return;
}
const query = `
Expand Down Expand Up @@ -189,7 +189,7 @@ jobs:

const body = pr.body || '';
const title = pr.title;
const isDocsOrRefactor = /^(docs|refactor)\s*(\([a-zA-Z0-9-]+\))?\s*:/.test(title);
const isDocsRefactorOrFeat = /^(docs|refactor|feat)\s*(\([a-zA-Z0-9-]+\))?\s*:/.test(title);

const issues = [];

Expand Down Expand Up @@ -225,8 +225,8 @@ jobs:
}
}

// Check: issue reference (skip for docs/refactor)
if (!isDocsOrRefactor && hasIssueSection) {
// Check: issue reference (skip for docs/refactor/feat)
if (!isDocsRefactorOrFeat && hasIssueSection) {
const issueMatch = body.match(/### Issue for this PR\s*\n([\s\S]*?)(?=###|$)/);
const issueContent = issueMatch ? issueMatch[1].trim() : '';
const hasIssueRef = /(closes|fixes|resolves)\s+#\d+/i.test(issueContent) || /#\d+/.test(issueContent);
Expand Down
4 changes: 3 additions & 1 deletion .github/workflows/publish.yml
Original file line number Diff line number Diff line change
Expand Up @@ -77,6 +77,8 @@ jobs:
fetch-tags: true

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

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

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

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

- name: Upload unsigned Windows CLI
id: upload_unsigned_windows_cli
Expand Down
12 changes: 10 additions & 2 deletions .github/workflows/test.yml
Original file line number Diff line number Diff line change
Expand Up @@ -8,8 +8,16 @@ on:
workflow_dispatch:
jobs:
unit:
name: unit (linux)
runs-on: blacksmith-4vcpu-ubuntu-2404
name: unit (${{ matrix.settings.name }})
strategy:
fail-fast: false
matrix:
settings:
- name: linux
host: blacksmith-4vcpu-ubuntu-2404
- name: windows
host: blacksmith-4vcpu-windows-2025
runs-on: ${{ matrix.settings.host }}
defaults:
run:
shell: bash
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}`);
Loading