Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
94 commits
Select commit Hold shift + click to select a range
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
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
7e6a007
feat(app): auto-accept all permissions mode
adamdotdevin Feb 26, 2026
9312867
feat(app): new tabs styling (#15284)
adamdotdevin Feb 26, 2026
270d084
fix(ui): avoid truncating workspace paths in assistant text (#14584)
nexxeln Feb 26, 2026
a0b3bbf
fix(ui): prevent filename and diff count overlap in session changes (…
nexxeln Feb 26, 2026
8c484a0
fix(app): terminal issues
adamdotdevin Feb 26, 2026
05d77b7
chore: storybook (#15285)
adamdotdevin Feb 26, 2026
9736fce
chore: update nix node_modules hashes
opencode-agent[bot] Feb 26, 2026
d9a81df
fix(tui): resolve streaming freeze from GC pressure and event flooding
coleleavitt Feb 27, 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
  •  
  •  
  •  
17 changes: 16 additions & 1 deletion .github/actions/setup-bun/action.yml
Original file line number Diff line number Diff line change
Expand Up @@ -11,10 +11,25 @@ runs:
restore-keys: |
${{ runner.os }}-bun-

- name: Get baseline download URL
id: bun-url
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/bun-v${V}/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: 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) {}
Copy link

@cubic-dev-ai cubic-dev-ai bot Feb 27, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P3: Empty catch (e) {} silently swallows all errors, not just the expected 404. Consider logging the error at debug level so unexpected failures (auth issues, rate limits, network errors) aren't invisible.

Prompt for AI agents
Check if this issue is valid — if so, understand the root cause and fix it. At .github/workflows/compliance-close.yml, line 75:

<comment>Empty `catch (e) {}` silently swallows all errors, not just the expected 404. Consider logging the error at debug level so unexpected failures (auth issues, rate limits, network errors) aren't invisible.</comment>

<file context>
@@ -65,6 +65,15 @@ jobs:
+                  issue_number: item.number,
+                  name: 'needs:compliance',
+                });
+              } catch (e) {}
+
               if (isPR) {
</file context>
Suggested change
} catch (e) {}
} catch (e) {
core.info(`Failed to remove label from #${item.number}: ${e.message}`);
}
Fix with Cubic

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
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}`);
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