Skip to content

Commit d532d28

Browse files
authored
Merge branch 'anomalyco:dev' into dev
2 parents cd97eea + 7afa48b commit d532d28

38 files changed

Lines changed: 329 additions & 89 deletions

.github/workflows/vouch-check-issue.yml

Lines changed: 39 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -42,15 +42,17 @@ jobs:
4242
throw error;
4343
}
4444
45-
// Parse the .td file for denounced users
45+
// Parse the .td file for vouched and denounced users
46+
const vouched = new Set();
4647
const denounced = new Map();
4748
for (const line of content.split('\n')) {
4849
const trimmed = line.trim();
4950
if (!trimmed || trimmed.startsWith('#')) continue;
50-
if (!trimmed.startsWith('-')) continue;
5151
52-
const rest = trimmed.slice(1).trim();
52+
const isDenounced = trimmed.startsWith('-');
53+
const rest = isDenounced ? trimmed.slice(1).trim() : trimmed;
5354
if (!rest) continue;
55+
5456
const spaceIdx = rest.indexOf(' ');
5557
const handle = spaceIdx === -1 ? rest : rest.slice(0, spaceIdx);
5658
const reason = spaceIdx === -1 ? null : rest.slice(spaceIdx + 1).trim();
@@ -65,32 +67,50 @@ jobs:
6567
const username = colonIdx === -1 ? handle : handle.slice(colonIdx + 1);
6668
if (!username) continue;
6769
68-
denounced.set(username.toLowerCase(), reason);
70+
if (isDenounced) {
71+
denounced.set(username.toLowerCase(), reason);
72+
continue;
73+
}
74+
75+
vouched.add(username.toLowerCase());
6976
}
7077
7178
// Check if the author is denounced
7279
const reason = denounced.get(author.toLowerCase());
73-
if (reason === undefined) {
74-
core.info(`User ${author} is not denounced. Allowing issue.`);
80+
if (reason !== undefined) {
81+
// Author is denounced — close the issue
82+
const body = 'This issue has been automatically closed.';
83+
84+
await github.rest.issues.createComment({
85+
owner: context.repo.owner,
86+
repo: context.repo.repo,
87+
issue_number: issueNumber,
88+
body,
89+
});
90+
91+
await github.rest.issues.update({
92+
owner: context.repo.owner,
93+
repo: context.repo.repo,
94+
issue_number: issueNumber,
95+
state: 'closed',
96+
state_reason: 'not_planned',
97+
});
98+
99+
core.info(`Closed issue #${issueNumber} from denounced user ${author}`);
75100
return;
76101
}
77102
78-
// Author is denounced — close the issue
79-
const body = 'This issue has been automatically closed.';
80-
81-
await github.rest.issues.createComment({
82-
owner: context.repo.owner,
83-
repo: context.repo.repo,
84-
issue_number: issueNumber,
85-
body,
86-
});
103+
// Author is positively vouched — add label
104+
if (!vouched.has(author.toLowerCase())) {
105+
core.info(`User ${author} is not denounced or vouched. Allowing issue.`);
106+
return;
107+
}
87108
88-
await github.rest.issues.update({
109+
await github.rest.issues.addLabels({
89110
owner: context.repo.owner,
90111
repo: context.repo.repo,
91112
issue_number: issueNumber,
92-
state: 'closed',
93-
state_reason: 'not_planned',
113+
labels: ['Vouched'],
94114
});
95115
96-
core.info(`Closed issue #${issueNumber} from denounced user ${author}`);
116+
core.info(`Added vouched label to issue #${issueNumber} from ${author}`);

.github/workflows/vouch-check-pr.yml

Lines changed: 38 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ on:
66

77
permissions:
88
contents: read
9+
issues: write
910
pull-requests: write
1011

1112
jobs:
@@ -42,15 +43,17 @@ jobs:
4243
throw error;
4344
}
4445
45-
// Parse the .td file for denounced users
46+
// Parse the .td file for vouched and denounced users
47+
const vouched = new Set();
4648
const denounced = new Map();
4749
for (const line of content.split('\n')) {
4850
const trimmed = line.trim();
4951
if (!trimmed || trimmed.startsWith('#')) continue;
50-
if (!trimmed.startsWith('-')) continue;
5152
52-
const rest = trimmed.slice(1).trim();
53+
const isDenounced = trimmed.startsWith('-');
54+
const rest = isDenounced ? trimmed.slice(1).trim() : trimmed;
5355
if (!rest) continue;
56+
5457
const spaceIdx = rest.indexOf(' ');
5558
const handle = spaceIdx === -1 ? rest : rest.slice(0, spaceIdx);
5659
const reason = spaceIdx === -1 ? null : rest.slice(spaceIdx + 1).trim();
@@ -65,29 +68,47 @@ jobs:
6568
const username = colonIdx === -1 ? handle : handle.slice(colonIdx + 1);
6669
if (!username) continue;
6770
68-
denounced.set(username.toLowerCase(), reason);
71+
if (isDenounced) {
72+
denounced.set(username.toLowerCase(), reason);
73+
continue;
74+
}
75+
76+
vouched.add(username.toLowerCase());
6977
}
7078
7179
// Check if the author is denounced
7280
const reason = denounced.get(author.toLowerCase());
73-
if (reason === undefined) {
74-
core.info(`User ${author} is not denounced. Allowing PR.`);
81+
if (reason !== undefined) {
82+
// Author is denounced — close the PR
83+
await github.rest.issues.createComment({
84+
owner: context.repo.owner,
85+
repo: context.repo.repo,
86+
issue_number: prNumber,
87+
body: 'This pull request has been automatically closed.',
88+
});
89+
90+
await github.rest.pulls.update({
91+
owner: context.repo.owner,
92+
repo: context.repo.repo,
93+
pull_number: prNumber,
94+
state: 'closed',
95+
});
96+
97+
core.info(`Closed PR #${prNumber} from denounced user ${author}`);
7598
return;
7699
}
77100
78-
// Author is denounced — close the PR
79-
await github.rest.issues.createComment({
80-
owner: context.repo.owner,
81-
repo: context.repo.repo,
82-
issue_number: prNumber,
83-
body: 'This pull request has been automatically closed.',
84-
});
101+
// Author is positively vouched — add label
102+
if (!vouched.has(author.toLowerCase())) {
103+
core.info(`User ${author} is not denounced or vouched. Allowing PR.`);
104+
return;
105+
}
85106
86-
await github.rest.pulls.update({
107+
await github.rest.issues.addLabels({
87108
owner: context.repo.owner,
88109
repo: context.repo.repo,
89-
pull_number: prNumber,
90-
state: 'closed',
110+
issue_number: prNumber,
111+
labels: ['Vouched'],
91112
});
92113
93-
core.info(`Closed PR #${prNumber} from denounced user ${author}`);
114+
core.info(`Added vouched label to PR #${prNumber} from ${author}`);

.github/workflows/vouch-manage-by-issue.yml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,5 +33,6 @@ jobs:
3333
with:
3434
issue-id: ${{ github.event.issue.number }}
3535
comment-id: ${{ github.event.comment.id }}
36+
roles: admin,maintain
3637
env:
3738
GITHUB_TOKEN: ${{ steps.committer.outputs.token }}

bun.lock

Lines changed: 15 additions & 15 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

packages/app/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "@opencode-ai/app",
3-
"version": "1.2.13",
3+
"version": "1.2.14",
44
"description": "",
55
"type": "module",
66
"exports": {

packages/app/src/i18n/bs.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -100,7 +100,7 @@ export const dict = {
100100
"dialog.provider.tag.recommended": "Preporučeno",
101101
"dialog.provider.opencode.note": "Kurirani modeli uključujući Claude, GPT, Gemini i druge",
102102
"dialog.provider.anthropic.note": "Direktan pristup Claude modelima, uključujući Pro i Max",
103-
"dialog.provider.copilot.note": "Claude modeli za pomoć pri kodiranju",
103+
"dialog.provider.copilot.note": "AI modeli za pomoć pri kodiranju putem GitHub Copilot",
104104
"dialog.provider.openai.note": "GPT modeli za brze, sposobne opšte AI zadatke",
105105
"dialog.provider.google.note": "Gemini modeli za brze, strukturirane odgovore",
106106
"dialog.provider.openrouter.note": "Pristup svim podržanim modelima preko jednog provajdera",

packages/app/src/i18n/da.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -100,7 +100,7 @@ export const dict = {
100100
"dialog.provider.tag.recommended": "Anbefalet",
101101
"dialog.provider.opencode.note": "Udvalgte modeller inklusive Claude, GPT, Gemini og flere",
102102
"dialog.provider.anthropic.note": "Direkte adgang til Claude-modeller, inklusive Pro og Max",
103-
"dialog.provider.copilot.note": "Claude-modeller til kodningsassistance",
103+
"dialog.provider.copilot.note": "AI-modeller til kodningsassistance via GitHub Copilot",
104104
"dialog.provider.openai.note": "GPT-modeller til hurtige, kompetente generelle AI-opgaver",
105105
"dialog.provider.google.note": "Gemini-modeller til hurtige, strukturerede svar",
106106
"dialog.provider.openrouter.note": "Få adgang til alle understøttede modeller fra én udbyder",

packages/app/src/i18n/en.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -100,7 +100,7 @@ export const dict = {
100100
"dialog.provider.tag.recommended": "Recommended",
101101
"dialog.provider.opencode.note": "Curated models including Claude, GPT, Gemini and more",
102102
"dialog.provider.anthropic.note": "Direct access to Claude models, including Pro and Max",
103-
"dialog.provider.copilot.note": "Claude models for coding assistance",
103+
"dialog.provider.copilot.note": "AI models for coding assistance via GitHub Copilot",
104104
"dialog.provider.openai.note": "GPT models for fast, capable general AI tasks",
105105
"dialog.provider.google.note": "Gemini models for fast, structured responses",
106106
"dialog.provider.openrouter.note": "Access all supported models from one provider",

packages/app/src/i18n/es.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -100,7 +100,7 @@ export const dict = {
100100
"dialog.provider.tag.recommended": "Recomendado",
101101
"dialog.provider.opencode.note": "Modelos seleccionados incluyendo Claude, GPT, Gemini y más",
102102
"dialog.provider.anthropic.note": "Acceso directo a modelos Claude, incluyendo Pro y Max",
103-
"dialog.provider.copilot.note": "Modelos Claude para asistencia de codificación",
103+
"dialog.provider.copilot.note": "Modelos de IA para asistencia de codificación a través de GitHub Copilot",
104104
"dialog.provider.openai.note": "Modelos GPT para tareas de IA generales rápidas y capaces",
105105
"dialog.provider.google.note": "Modelos Gemini para respuestas rápidas y estructuradas",
106106
"dialog.provider.openrouter.note": "Accede a todos los modelos soportados desde un solo proveedor",

packages/app/src/i18n/no.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -103,7 +103,7 @@ export const dict = {
103103
"dialog.provider.tag.recommended": "Anbefalt",
104104
"dialog.provider.opencode.note": "Utvalgte modeller inkludert Claude, GPT, Gemini og mer",
105105
"dialog.provider.anthropic.note": "Direkte tilgang til Claude-modeller, inkludert Pro og Max",
106-
"dialog.provider.copilot.note": "Claude-modeller for kodeassistanse",
106+
"dialog.provider.copilot.note": "AI-modeller for kodeassistanse via GitHub Copilot",
107107
"dialog.provider.openai.note": "GPT-modeller for raske, dyktige generelle AI-oppgaver",
108108
"dialog.provider.google.note": "Gemini-modeller for raske, strukturerte svar",
109109
"dialog.provider.openrouter.note": "Tilgang til alle støttede modeller fra én leverandør",

0 commit comments

Comments
 (0)