From c713e96d482414e466a02078231377921c503751 Mon Sep 17 00:00:00 2001 From: John Cavanaugh <59479+cavanaug@users.noreply.github.com> Date: Mon, 4 May 2026 16:16:10 -0700 Subject: [PATCH] Disable github jobs --- {.github => .github_disabled}/CODEOWNERS | 0 .../ISSUE_TEMPLATE/bug-report.yml | 0 .../ISSUE_TEMPLATE/config.yml | 0 .../ISSUE_TEMPLATE/feature-request.yml | 0 .../ISSUE_TEMPLATE/question.yml | 0 {.github => .github_disabled}/TEAM_MEMBERS | 0 .github_disabled/VOUCHED.td | 23 +++ .../actions/setup-bun/action.yml | 0 .../actions/setup-git-committer/action.yml | 0 .../publish-python-sdk.yml | 0 .../pull_request_template.md | 0 .../workflows/beta.yml | 0 .../workflows/close-issues.yml | 0 .../workflows/close-stale-prs.yml | 0 .../workflows/compliance-close.yml | 0 .../workflows/containers.yml | 0 .../workflows/daily-issues-recap.yml | 170 +++++++++++++++++ .github_disabled/workflows/daily-pr-recap.yml | 173 ++++++++++++++++++ .../workflows/deploy.yml | 0 .../workflows/docs-locale-sync.yml | 0 .../workflows/docs-update.yml | 0 .../workflows/duplicate-issues.yml | 0 .../workflows/generate.yml | 0 .../workflows/nix-eval.yml | 0 .../workflows/nix-hashes.yml | 0 .../workflows/notify-discord.yml | 0 .../workflows/opencode.yml | 0 .../workflows/pr-management.yml | 0 .../workflows/pr-standards.yml | 0 .../workflows/publish-github-action.yml | 0 .../workflows/publish-vscode.yml | 0 .../workflows/publish.yml | 0 .../workflows/release-github-action.yml | 0 .../workflows/review.yml | 0 .github_disabled/workflows/sign-cli.yml | 56 ++++++ .github_disabled/workflows/stale-issues.yml | 33 ++++ .../workflows/stats.yml | 0 .../workflows/storybook.yml | 0 .../workflows/sync-zed-extension.yml | 0 .../workflows/test.yml | 0 .../workflows/triage.yml | 0 .../workflows/typecheck.yml | 0 .../workflows/vouch-check-issue.yml | 116 ++++++++++++ .github_disabled/workflows/vouch-check-pr.yml | 114 ++++++++++++ .../workflows/vouch-manage-by-issue.yml | 38 ++++ .vscode/launch.example.json | 11 -- .vscode/settings.example.json | 5 - 47 files changed, 723 insertions(+), 16 deletions(-) rename {.github => .github_disabled}/CODEOWNERS (100%) rename {.github => .github_disabled}/ISSUE_TEMPLATE/bug-report.yml (100%) rename {.github => .github_disabled}/ISSUE_TEMPLATE/config.yml (100%) rename {.github => .github_disabled}/ISSUE_TEMPLATE/feature-request.yml (100%) rename {.github => .github_disabled}/ISSUE_TEMPLATE/question.yml (100%) rename {.github => .github_disabled}/TEAM_MEMBERS (100%) create mode 100644 .github_disabled/VOUCHED.td rename {.github => .github_disabled}/actions/setup-bun/action.yml (100%) rename {.github => .github_disabled}/actions/setup-git-committer/action.yml (100%) rename {.github => .github_disabled}/publish-python-sdk.yml (100%) rename {.github => .github_disabled}/pull_request_template.md (100%) rename {.github => .github_disabled}/workflows/beta.yml (100%) rename {.github => .github_disabled}/workflows/close-issues.yml (100%) rename {.github => .github_disabled}/workflows/close-stale-prs.yml (100%) rename {.github => .github_disabled}/workflows/compliance-close.yml (100%) rename {.github => .github_disabled}/workflows/containers.yml (100%) create mode 100644 .github_disabled/workflows/daily-issues-recap.yml create mode 100644 .github_disabled/workflows/daily-pr-recap.yml rename {.github => .github_disabled}/workflows/deploy.yml (100%) rename {.github => .github_disabled}/workflows/docs-locale-sync.yml (100%) rename {.github => .github_disabled}/workflows/docs-update.yml (100%) rename {.github => .github_disabled}/workflows/duplicate-issues.yml (100%) rename {.github => .github_disabled}/workflows/generate.yml (100%) rename {.github => .github_disabled}/workflows/nix-eval.yml (100%) rename {.github => .github_disabled}/workflows/nix-hashes.yml (100%) rename {.github => .github_disabled}/workflows/notify-discord.yml (100%) rename {.github => .github_disabled}/workflows/opencode.yml (100%) rename {.github => .github_disabled}/workflows/pr-management.yml (100%) rename {.github => .github_disabled}/workflows/pr-standards.yml (100%) rename {.github => .github_disabled}/workflows/publish-github-action.yml (100%) rename {.github => .github_disabled}/workflows/publish-vscode.yml (100%) rename {.github => .github_disabled}/workflows/publish.yml (100%) rename {.github => .github_disabled}/workflows/release-github-action.yml (100%) rename {.github => .github_disabled}/workflows/review.yml (100%) create mode 100644 .github_disabled/workflows/sign-cli.yml create mode 100644 .github_disabled/workflows/stale-issues.yml rename {.github => .github_disabled}/workflows/stats.yml (100%) rename {.github => .github_disabled}/workflows/storybook.yml (100%) rename {.github => .github_disabled}/workflows/sync-zed-extension.yml (100%) rename {.github => .github_disabled}/workflows/test.yml (100%) rename {.github => .github_disabled}/workflows/triage.yml (100%) rename {.github => .github_disabled}/workflows/typecheck.yml (100%) create mode 100644 .github_disabled/workflows/vouch-check-issue.yml create mode 100644 .github_disabled/workflows/vouch-check-pr.yml create mode 100644 .github_disabled/workflows/vouch-manage-by-issue.yml delete mode 100644 .vscode/launch.example.json delete mode 100644 .vscode/settings.example.json diff --git a/.github/CODEOWNERS b/.github_disabled/CODEOWNERS similarity index 100% rename from .github/CODEOWNERS rename to .github_disabled/CODEOWNERS diff --git a/.github/ISSUE_TEMPLATE/bug-report.yml b/.github_disabled/ISSUE_TEMPLATE/bug-report.yml similarity index 100% rename from .github/ISSUE_TEMPLATE/bug-report.yml rename to .github_disabled/ISSUE_TEMPLATE/bug-report.yml diff --git a/.github/ISSUE_TEMPLATE/config.yml b/.github_disabled/ISSUE_TEMPLATE/config.yml similarity index 100% rename from .github/ISSUE_TEMPLATE/config.yml rename to .github_disabled/ISSUE_TEMPLATE/config.yml diff --git a/.github/ISSUE_TEMPLATE/feature-request.yml b/.github_disabled/ISSUE_TEMPLATE/feature-request.yml similarity index 100% rename from .github/ISSUE_TEMPLATE/feature-request.yml rename to .github_disabled/ISSUE_TEMPLATE/feature-request.yml diff --git a/.github/ISSUE_TEMPLATE/question.yml b/.github_disabled/ISSUE_TEMPLATE/question.yml similarity index 100% rename from .github/ISSUE_TEMPLATE/question.yml rename to .github_disabled/ISSUE_TEMPLATE/question.yml diff --git a/.github/TEAM_MEMBERS b/.github_disabled/TEAM_MEMBERS similarity index 100% rename from .github/TEAM_MEMBERS rename to .github_disabled/TEAM_MEMBERS diff --git a/.github_disabled/VOUCHED.td b/.github_disabled/VOUCHED.td new file mode 100644 index 000000000000..28535b577992 --- /dev/null +++ b/.github_disabled/VOUCHED.td @@ -0,0 +1,23 @@ +# Vouched contributors for this project. +# +# See https://github.com/mitchellh/vouch for details. +# +# Syntax: +# - One handle per line (without @), sorted alphabetically. +# - Optional platform prefix: platform:username (e.g., github:user). +# - 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 +jayair +kitlangton +kommander +r44vc0rp +rekram1-node +-spider-yamet clawdbot/llm psychosis, spam pinging the team +thdxr diff --git a/.github/actions/setup-bun/action.yml b/.github_disabled/actions/setup-bun/action.yml similarity index 100% rename from .github/actions/setup-bun/action.yml rename to .github_disabled/actions/setup-bun/action.yml diff --git a/.github/actions/setup-git-committer/action.yml b/.github_disabled/actions/setup-git-committer/action.yml similarity index 100% rename from .github/actions/setup-git-committer/action.yml rename to .github_disabled/actions/setup-git-committer/action.yml diff --git a/.github/publish-python-sdk.yml b/.github_disabled/publish-python-sdk.yml similarity index 100% rename from .github/publish-python-sdk.yml rename to .github_disabled/publish-python-sdk.yml diff --git a/.github/pull_request_template.md b/.github_disabled/pull_request_template.md similarity index 100% rename from .github/pull_request_template.md rename to .github_disabled/pull_request_template.md diff --git a/.github/workflows/beta.yml b/.github_disabled/workflows/beta.yml similarity index 100% rename from .github/workflows/beta.yml rename to .github_disabled/workflows/beta.yml diff --git a/.github/workflows/close-issues.yml b/.github_disabled/workflows/close-issues.yml similarity index 100% rename from .github/workflows/close-issues.yml rename to .github_disabled/workflows/close-issues.yml diff --git a/.github/workflows/close-stale-prs.yml b/.github_disabled/workflows/close-stale-prs.yml similarity index 100% rename from .github/workflows/close-stale-prs.yml rename to .github_disabled/workflows/close-stale-prs.yml diff --git a/.github/workflows/compliance-close.yml b/.github_disabled/workflows/compliance-close.yml similarity index 100% rename from .github/workflows/compliance-close.yml rename to .github_disabled/workflows/compliance-close.yml diff --git a/.github/workflows/containers.yml b/.github_disabled/workflows/containers.yml similarity index 100% rename from .github/workflows/containers.yml rename to .github_disabled/workflows/containers.yml diff --git a/.github_disabled/workflows/daily-issues-recap.yml b/.github_disabled/workflows/daily-issues-recap.yml new file mode 100644 index 000000000000..31cf08233b99 --- /dev/null +++ b/.github_disabled/workflows/daily-issues-recap.yml @@ -0,0 +1,170 @@ +name: daily-issues-recap + +on: + schedule: + # Run at 6 PM EST (23:00 UTC, or 22:00 UTC during daylight saving) + - cron: "0 23 * * *" + workflow_dispatch: # Allow manual trigger for testing + +jobs: + daily-recap: + runs-on: blacksmith-4vcpu-ubuntu-2404 + permissions: + contents: read + issues: read + steps: + - name: Checkout repository + uses: actions/checkout@v4 + with: + fetch-depth: 1 + + - uses: ./.github/actions/setup-bun + + - name: Install opencode + run: curl -fsSL https://opencode.ai/install | bash + + - name: Generate daily issues recap + id: recap + env: + OPENCODE_API_KEY: ${{ secrets.OPENCODE_API_KEY }} + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + OPENCODE_PERMISSION: | + { + "bash": { + "*": "deny", + "gh issue*": "allow", + "gh search*": "allow" + }, + "webfetch": "deny", + "edit": "deny", + "write": "deny" + } + run: | + # Get today's date range + TODAY=$(date -u +%Y-%m-%d) + + opencode run -m opencode/claude-sonnet-4-5 "Generate a daily issues recap for the OpenCode repository. + + TODAY'S DATE: ${TODAY} + + STEP 1: Gather today's issues + Search for all OPEN issues created today (${TODAY}) using: + gh issue list --repo ${{ github.repository }} --state open --search \"created:${TODAY}\" --json number,title,body,labels,state,comments,createdAt,author --limit 500 + + IMPORTANT: EXCLUDE all issues authored by Anomaly team members. Filter out issues where the author login matches ANY of these: + adamdotdevin, Brendonovich, fwang, Hona, iamdavidhill, jayair, kitlangton, kommander, MrMushrooooom, R44VC0RP, rekram1-node, thdxr + This recap is specifically for COMMUNITY (external) issues only. + + STEP 2: Analyze and categorize + For each issue created today, categorize it: + + **Severity Assessment:** + - CRITICAL: Crashes, data loss, security issues, blocks major functionality + - HIGH: Significant bugs affecting many users, important features broken + - MEDIUM: Bugs with workarounds, minor features broken + - LOW: Minor issues, cosmetic, nice-to-haves + + **Activity Assessment:** + - Note issues with high comment counts or engagement + - Note issues from repeat reporters (check if author has filed before) + + STEP 3: Cross-reference with existing issues + For issues that seem like feature requests or recurring bugs: + - Search for similar older issues to identify patterns + - Note if this is a frequently requested feature + - Identify any issues that are duplicates of long-standing requests + + STEP 4: Generate the recap + Create a structured recap with these sections: + + ===DISCORD_START=== + **Daily Issues Recap - ${TODAY}** + + **Summary Stats** + - Total issues opened today: [count] + - By category: [bugs/features/questions] + + **Critical/High Priority Issues** + [List any CRITICAL or HIGH severity issues with brief descriptions and issue numbers] + + **Most Active/Discussed** + [Issues with significant engagement or from active community members] + + **Trending Topics** + [Patterns noticed - e.g., 'Multiple reports about X', 'Continued interest in Y feature'] + + **Duplicates & Related** + [Issues that relate to existing open issues] + ===DISCORD_END=== + + STEP 5: Format for Discord + Format the recap as a Discord-compatible message: + - Use Discord markdown (**, __, etc.) + - BE EXTREMELY CONCISE - this is an EOD summary, not a detailed report + - Use hyperlinked issue numbers with suppressed embeds: [#1234]() + - Group related issues on single lines where possible + - Add emoji sparingly for critical items only + - HARD LIMIT: Keep under 1800 characters total + - Skip sections that have nothing notable (e.g., if no critical issues, omit that section) + - Prioritize signal over completeness - only surface what matters + + OUTPUT: Output ONLY the content between ===DISCORD_START=== and ===DISCORD_END=== markers. Include the markers so I can extract it." > /tmp/recap_raw.txt + + # Extract only the Discord message between markers + sed -n '/===DISCORD_START===/,/===DISCORD_END===/p' /tmp/recap_raw.txt | grep -v '===DISCORD' > /tmp/recap.txt + + echo "recap_file=/tmp/recap.txt" >> $GITHUB_OUTPUT + + - name: Post to Discord + env: + DISCORD_WEBHOOK_URL: ${{ secrets.DISCORD_ISSUES_WEBHOOK_URL }} + run: | + if [ -z "$DISCORD_WEBHOOK_URL" ]; then + echo "Warning: DISCORD_ISSUES_WEBHOOK_URL secret not set, skipping Discord post" + cat /tmp/recap.txt + exit 0 + fi + + # Read the recap + RECAP_RAW=$(cat /tmp/recap.txt) + RECAP_LENGTH=${#RECAP_RAW} + + echo "Recap length: ${RECAP_LENGTH} chars" + + # Function to post a message to Discord + post_to_discord() { + local msg="$1" + local content=$(echo "$msg" | jq -Rs '.') + curl -s -H "Content-Type: application/json" \ + -X POST \ + -d "{\"content\": ${content}}" \ + "$DISCORD_WEBHOOK_URL" + sleep 1 + } + + # If under limit, send as single message + if [ "$RECAP_LENGTH" -le 1950 ]; then + post_to_discord "$RECAP_RAW" + else + echo "Splitting into multiple messages..." + remaining="$RECAP_RAW" + while [ ${#remaining} -gt 0 ]; do + if [ ${#remaining} -le 1950 ]; then + post_to_discord "$remaining" + break + else + chunk="${remaining:0:1900}" + last_newline=$(echo "$chunk" | grep -bo $'\n' | tail -1 | cut -d: -f1) + if [ -n "$last_newline" ] && [ "$last_newline" -gt 500 ]; then + chunk="${remaining:0:$last_newline}" + remaining="${remaining:$((last_newline+1))}" + else + chunk="${remaining:0:1900}" + remaining="${remaining:1900}" + fi + post_to_discord "$chunk" + fi + done + fi + + echo "Posted daily recap to Discord" diff --git a/.github_disabled/workflows/daily-pr-recap.yml b/.github_disabled/workflows/daily-pr-recap.yml new file mode 100644 index 000000000000..2f0f023cfd09 --- /dev/null +++ b/.github_disabled/workflows/daily-pr-recap.yml @@ -0,0 +1,173 @@ +name: daily-pr-recap + +on: + schedule: + # Run at 5pm EST (22:00 UTC, or 21:00 UTC during daylight saving) + - cron: "0 22 * * *" + workflow_dispatch: # Allow manual trigger for testing + +jobs: + pr-recap: + runs-on: blacksmith-4vcpu-ubuntu-2404 + permissions: + contents: read + pull-requests: read + steps: + - name: Checkout repository + uses: actions/checkout@v4 + with: + fetch-depth: 1 + + - uses: ./.github/actions/setup-bun + + - name: Install opencode + run: curl -fsSL https://opencode.ai/install | bash + + - name: Generate daily PR recap + id: recap + env: + OPENCODE_API_KEY: ${{ secrets.OPENCODE_API_KEY }} + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + OPENCODE_PERMISSION: | + { + "bash": { + "*": "deny", + "gh pr*": "allow", + "gh search*": "allow" + }, + "webfetch": "deny", + "edit": "deny", + "write": "deny" + } + run: | + TODAY=$(date -u +%Y-%m-%d) + + opencode run -m opencode/claude-sonnet-4-5 "Generate a daily PR activity recap for the OpenCode repository. + + TODAY'S DATE: ${TODAY} + + STEP 1: Gather PR data + Run these commands to gather PR information. ONLY include OPEN PRs created or updated TODAY (${TODAY}): + + # Open PRs created today + gh pr list --repo ${{ github.repository }} --state open --search \"created:${TODAY}\" --json number,title,author,labels,createdAt,updatedAt,reviewDecision,isDraft,additions,deletions --limit 100 + + # Open PRs with activity today (updated today) + gh pr list --repo ${{ github.repository }} --state open --search \"updated:${TODAY}\" --json number,title,author,labels,createdAt,updatedAt,reviewDecision,isDraft,additions,deletions --limit 100 + + IMPORTANT: EXCLUDE all PRs authored by Anomaly team members. Filter out PRs where the author login matches ANY of these: + adamdotdevin, Brendonovich, fwang, Hona, iamdavidhill, jayair, kitlangton, kommander, MrMushrooooom, R44VC0RP, rekram1-node, thdxr + This recap is specifically for COMMUNITY (external) contributions only. + + + + STEP 2: For high-activity PRs, check comment counts + For promising PRs, run: + gh pr view [NUMBER] --repo ${{ github.repository }} --json comments --jq '[.comments[] | select(.author.login != \"copilot-pull-request-reviewer\" and .author.login != \"github-actions\")] | length' + + IMPORTANT: When counting comments/activity, EXCLUDE these bot accounts: + - copilot-pull-request-reviewer + - github-actions + + STEP 3: Identify what matters (ONLY from today's PRs) + + **Bug Fixes From Today:** + - PRs with 'fix' or 'bug' in title created/updated today + - Small bug fixes (< 100 lines changed) that are easy to review + - Bug fixes from community contributors + + **High Activity Today:** + - PRs with significant human comments today (excluding bots listed above) + - PRs with back-and-forth discussion today + + **Quick Wins:** + - Small PRs (< 50 lines) that are approved or nearly approved + - PRs that just need a final review + + STEP 4: Generate the recap + Create a structured recap: + + ===DISCORD_START=== + **Daily PR Recap - ${TODAY}** + + **New PRs Today** + [PRs opened today - group by type: bug fixes, features, etc.] + + **Active PRs Today** + [PRs with activity/updates today - significant discussion] + + **Quick Wins** + [Small PRs ready to merge] + ===DISCORD_END=== + + STEP 5: Format for Discord + - Use Discord markdown (**, __, etc.) + - BE EXTREMELY CONCISE - surface what we might miss + - Use hyperlinked PR numbers with suppressed embeds: [#1234]() + - Include PR author: [#1234]() (@author) + - For bug fixes, add brief description of what it fixes + - Show line count for quick wins: \"(+15/-3 lines)\" + - HARD LIMIT: Keep under 1800 characters total + - Skip empty sections + - Focus on PRs that need human eyes + + OUTPUT: Output ONLY the content between ===DISCORD_START=== and ===DISCORD_END=== markers. Include the markers so I can extract it." > /tmp/pr_recap_raw.txt + + # Extract only the Discord message between markers + sed -n '/===DISCORD_START===/,/===DISCORD_END===/p' /tmp/pr_recap_raw.txt | grep -v '===DISCORD' > /tmp/pr_recap.txt + + echo "recap_file=/tmp/pr_recap.txt" >> $GITHUB_OUTPUT + + - name: Post to Discord + env: + DISCORD_WEBHOOK_URL: ${{ secrets.DISCORD_ISSUES_WEBHOOK_URL }} + run: | + if [ -z "$DISCORD_WEBHOOK_URL" ]; then + echo "Warning: DISCORD_ISSUES_WEBHOOK_URL secret not set, skipping Discord post" + cat /tmp/pr_recap.txt + exit 0 + fi + + # Read the recap + RECAP_RAW=$(cat /tmp/pr_recap.txt) + RECAP_LENGTH=${#RECAP_RAW} + + echo "Recap length: ${RECAP_LENGTH} chars" + + # Function to post a message to Discord + post_to_discord() { + local msg="$1" + local content=$(echo "$msg" | jq -Rs '.') + curl -s -H "Content-Type: application/json" \ + -X POST \ + -d "{\"content\": ${content}}" \ + "$DISCORD_WEBHOOK_URL" + sleep 1 + } + + # If under limit, send as single message + if [ "$RECAP_LENGTH" -le 1950 ]; then + post_to_discord "$RECAP_RAW" + else + echo "Splitting into multiple messages..." + remaining="$RECAP_RAW" + while [ ${#remaining} -gt 0 ]; do + if [ ${#remaining} -le 1950 ]; then + post_to_discord "$remaining" + break + else + chunk="${remaining:0:1900}" + last_newline=$(echo "$chunk" | grep -bo $'\n' | tail -1 | cut -d: -f1) + if [ -n "$last_newline" ] && [ "$last_newline" -gt 500 ]; then + chunk="${remaining:0:$last_newline}" + remaining="${remaining:$((last_newline+1))}" + else + chunk="${remaining:0:1900}" + remaining="${remaining:1900}" + fi + post_to_discord "$chunk" + fi + done + fi + + echo "Posted daily PR recap to Discord" diff --git a/.github/workflows/deploy.yml b/.github_disabled/workflows/deploy.yml similarity index 100% rename from .github/workflows/deploy.yml rename to .github_disabled/workflows/deploy.yml diff --git a/.github/workflows/docs-locale-sync.yml b/.github_disabled/workflows/docs-locale-sync.yml similarity index 100% rename from .github/workflows/docs-locale-sync.yml rename to .github_disabled/workflows/docs-locale-sync.yml diff --git a/.github/workflows/docs-update.yml b/.github_disabled/workflows/docs-update.yml similarity index 100% rename from .github/workflows/docs-update.yml rename to .github_disabled/workflows/docs-update.yml diff --git a/.github/workflows/duplicate-issues.yml b/.github_disabled/workflows/duplicate-issues.yml similarity index 100% rename from .github/workflows/duplicate-issues.yml rename to .github_disabled/workflows/duplicate-issues.yml diff --git a/.github/workflows/generate.yml b/.github_disabled/workflows/generate.yml similarity index 100% rename from .github/workflows/generate.yml rename to .github_disabled/workflows/generate.yml diff --git a/.github/workflows/nix-eval.yml b/.github_disabled/workflows/nix-eval.yml similarity index 100% rename from .github/workflows/nix-eval.yml rename to .github_disabled/workflows/nix-eval.yml diff --git a/.github/workflows/nix-hashes.yml b/.github_disabled/workflows/nix-hashes.yml similarity index 100% rename from .github/workflows/nix-hashes.yml rename to .github_disabled/workflows/nix-hashes.yml diff --git a/.github/workflows/notify-discord.yml b/.github_disabled/workflows/notify-discord.yml similarity index 100% rename from .github/workflows/notify-discord.yml rename to .github_disabled/workflows/notify-discord.yml diff --git a/.github/workflows/opencode.yml b/.github_disabled/workflows/opencode.yml similarity index 100% rename from .github/workflows/opencode.yml rename to .github_disabled/workflows/opencode.yml diff --git a/.github/workflows/pr-management.yml b/.github_disabled/workflows/pr-management.yml similarity index 100% rename from .github/workflows/pr-management.yml rename to .github_disabled/workflows/pr-management.yml diff --git a/.github/workflows/pr-standards.yml b/.github_disabled/workflows/pr-standards.yml similarity index 100% rename from .github/workflows/pr-standards.yml rename to .github_disabled/workflows/pr-standards.yml diff --git a/.github/workflows/publish-github-action.yml b/.github_disabled/workflows/publish-github-action.yml similarity index 100% rename from .github/workflows/publish-github-action.yml rename to .github_disabled/workflows/publish-github-action.yml diff --git a/.github/workflows/publish-vscode.yml b/.github_disabled/workflows/publish-vscode.yml similarity index 100% rename from .github/workflows/publish-vscode.yml rename to .github_disabled/workflows/publish-vscode.yml diff --git a/.github/workflows/publish.yml b/.github_disabled/workflows/publish.yml similarity index 100% rename from .github/workflows/publish.yml rename to .github_disabled/workflows/publish.yml diff --git a/.github/workflows/release-github-action.yml b/.github_disabled/workflows/release-github-action.yml similarity index 100% rename from .github/workflows/release-github-action.yml rename to .github_disabled/workflows/release-github-action.yml diff --git a/.github/workflows/review.yml b/.github_disabled/workflows/review.yml similarity index 100% rename from .github/workflows/review.yml rename to .github_disabled/workflows/review.yml diff --git a/.github_disabled/workflows/sign-cli.yml b/.github_disabled/workflows/sign-cli.yml new file mode 100644 index 000000000000..89176223176d --- /dev/null +++ b/.github_disabled/workflows/sign-cli.yml @@ -0,0 +1,56 @@ +name: sign-cli + +on: + push: + branches: + - brendan/desktop-signpath + workflow_dispatch: + +permissions: + contents: read + actions: read + +jobs: + sign-cli: + runs-on: blacksmith-4vcpu-ubuntu-2404 + if: github.repository == 'anomalyco/opencode' + steps: + - uses: actions/checkout@v3 + with: + fetch-tags: true + + - uses: ./.github/actions/setup-bun + with: + cross-compile: "true" + + - name: Build + run: | + ./packages/opencode/script/build.ts --all + + - name: Upload unsigned Windows CLI + id: upload_unsigned_windows_cli + uses: actions/upload-artifact@v4 + with: + name: unsigned-opencode-windows-cli + path: packages/opencode/dist/opencode-windows-x64/bin/opencode.exe + if-no-files-found: error + + - name: Submit SignPath signing request + id: submit_signpath_signing_request + uses: signpath/github-action-submit-signing-request@v1 + with: + api-token: ${{ secrets.SIGNPATH_API_KEY }} + organization-id: ${{ secrets.SIGNPATH_ORGANIZATION_ID }} + project-slug: ${{ secrets.SIGNPATH_PROJECT_SLUG }} + signing-policy-slug: ${{ secrets.SIGNPATH_SIGNING_POLICY_SLUG }} + artifact-configuration-slug: ${{ secrets.SIGNPATH_ARTIFACT_CONFIGURATION_SLUG }} + github-artifact-id: ${{ steps.upload_unsigned_windows_cli.outputs.artifact-id }} + wait-for-completion: true + output-artifact-directory: signed-opencode-cli + + - name: Upload signed Windows CLI + uses: actions/upload-artifact@v4 + with: + name: signed-opencode-windows-cli + path: signed-opencode-cli/*.exe + if-no-files-found: error diff --git a/.github_disabled/workflows/stale-issues.yml b/.github_disabled/workflows/stale-issues.yml new file mode 100644 index 000000000000..a4b8583f9285 --- /dev/null +++ b/.github_disabled/workflows/stale-issues.yml @@ -0,0 +1,33 @@ +name: stale-issues + +on: + schedule: + - cron: "30 1 * * *" # Daily at 1:30 AM + workflow_dispatch: + +env: + DAYS_BEFORE_STALE: 90 + DAYS_BEFORE_CLOSE: 7 + +jobs: + stale: + runs-on: ubuntu-latest + permissions: + issues: write + steps: + - uses: actions/stale@v10 + with: + days-before-stale: ${{ env.DAYS_BEFORE_STALE }} + days-before-close: ${{ env.DAYS_BEFORE_CLOSE }} + stale-issue-label: "stale" + close-issue-message: | + [automated] Closing due to ${{ env.DAYS_BEFORE_STALE }}+ days of inactivity. + + Feel free to reopen if you still need this! + stale-issue-message: | + [automated] This issue has had no activity for ${{ env.DAYS_BEFORE_STALE }} days. + + It will be closed in ${{ env.DAYS_BEFORE_CLOSE }} days if there's no new activity. + remove-stale-when-updated: true + exempt-issue-labels: "pinned,security,feature-request,on-hold" + start-date: "2025-12-27" diff --git a/.github/workflows/stats.yml b/.github_disabled/workflows/stats.yml similarity index 100% rename from .github/workflows/stats.yml rename to .github_disabled/workflows/stats.yml diff --git a/.github/workflows/storybook.yml b/.github_disabled/workflows/storybook.yml similarity index 100% rename from .github/workflows/storybook.yml rename to .github_disabled/workflows/storybook.yml diff --git a/.github/workflows/sync-zed-extension.yml b/.github_disabled/workflows/sync-zed-extension.yml similarity index 100% rename from .github/workflows/sync-zed-extension.yml rename to .github_disabled/workflows/sync-zed-extension.yml diff --git a/.github/workflows/test.yml b/.github_disabled/workflows/test.yml similarity index 100% rename from .github/workflows/test.yml rename to .github_disabled/workflows/test.yml diff --git a/.github/workflows/triage.yml b/.github_disabled/workflows/triage.yml similarity index 100% rename from .github/workflows/triage.yml rename to .github_disabled/workflows/triage.yml diff --git a/.github/workflows/typecheck.yml b/.github_disabled/workflows/typecheck.yml similarity index 100% rename from .github/workflows/typecheck.yml rename to .github_disabled/workflows/typecheck.yml diff --git a/.github_disabled/workflows/vouch-check-issue.yml b/.github_disabled/workflows/vouch-check-issue.yml new file mode 100644 index 000000000000..4c2aa960b2a8 --- /dev/null +++ b/.github_disabled/workflows/vouch-check-issue.yml @@ -0,0 +1,116 @@ +name: vouch-check-issue + +on: + issues: + types: [opened] + +permissions: + contents: read + issues: write + +jobs: + check: + runs-on: ubuntu-latest + steps: + - name: Check if issue author is denounced + uses: actions/github-script@v7 + with: + script: | + const author = context.payload.issue.user.login; + const issueNumber = context.payload.issue.number; + + // Skip bots + if (author.endsWith('[bot]')) { + core.info(`Skipping bot: ${author}`); + return; + } + + // Read the VOUCHED.td file via API (no checkout needed) + let content; + try { + const response = await github.rest.repos.getContent({ + owner: context.repo.owner, + repo: context.repo.repo, + path: '.github/VOUCHED.td', + }); + content = Buffer.from(response.data.content, 'base64').toString('utf-8'); + } catch (error) { + if (error.status === 404) { + core.info('No .github/VOUCHED.td file found, skipping check.'); + return; + } + throw error; + } + + // 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; + + 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(); + + // Handle platform:username or bare username + // Only match bare usernames or github: prefix (skip other platforms) + const colonIdx = handle.indexOf(':'); + if (colonIdx !== -1) { + const platform = handle.slice(0, colonIdx).toLowerCase(); + if (platform !== 'github') continue; + } + const username = colonIdx === -1 ? handle : handle.slice(colonIdx + 1); + if (!username) continue; + + 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) { + // 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 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.addLabels({ + owner: context.repo.owner, + repo: context.repo.repo, + issue_number: issueNumber, + labels: ['Vouched'], + }); + + core.info(`Added vouched label to issue #${issueNumber} from ${author}`); diff --git a/.github_disabled/workflows/vouch-check-pr.yml b/.github_disabled/workflows/vouch-check-pr.yml new file mode 100644 index 000000000000..51816dfb7590 --- /dev/null +++ b/.github_disabled/workflows/vouch-check-pr.yml @@ -0,0 +1,114 @@ +name: vouch-check-pr + +on: + pull_request_target: + types: [opened] + +permissions: + contents: read + issues: write + pull-requests: write + +jobs: + check: + runs-on: ubuntu-latest + steps: + - name: Check if PR author is denounced + uses: actions/github-script@v7 + with: + script: | + const author = context.payload.pull_request.user.login; + const prNumber = context.payload.pull_request.number; + + // Skip bots + if (author.endsWith('[bot]')) { + core.info(`Skipping bot: ${author}`); + return; + } + + // Read the VOUCHED.td file via API (no checkout needed) + let content; + try { + const response = await github.rest.repos.getContent({ + owner: context.repo.owner, + repo: context.repo.repo, + path: '.github/VOUCHED.td', + }); + content = Buffer.from(response.data.content, 'base64').toString('utf-8'); + } catch (error) { + if (error.status === 404) { + core.info('No .github/VOUCHED.td file found, skipping check.'); + return; + } + throw error; + } + + // 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; + + 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(); + + // Handle platform:username or bare username + // Only match bare usernames or github: prefix (skip other platforms) + const colonIdx = handle.indexOf(':'); + if (colonIdx !== -1) { + const platform = handle.slice(0, colonIdx).toLowerCase(); + if (platform !== 'github') continue; + } + const username = colonIdx === -1 ? handle : handle.slice(colonIdx + 1); + if (!username) continue; + + 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) { + // 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 positively vouched — add label + if (!vouched.has(author.toLowerCase())) { + core.info(`User ${author} is not denounced or vouched. Allowing PR.`); + return; + } + + await github.rest.issues.addLabels({ + owner: context.repo.owner, + repo: context.repo.repo, + issue_number: prNumber, + labels: ['Vouched'], + }); + + core.info(`Added vouched label to PR #${prNumber} from ${author}`); diff --git a/.github_disabled/workflows/vouch-manage-by-issue.yml b/.github_disabled/workflows/vouch-manage-by-issue.yml new file mode 100644 index 000000000000..9604bf87f375 --- /dev/null +++ b/.github_disabled/workflows/vouch-manage-by-issue.yml @@ -0,0 +1,38 @@ +name: vouch-manage-by-issue + +on: + issue_comment: + types: [created] + +concurrency: + group: vouch-manage + cancel-in-progress: false + +permissions: + contents: write + issues: write + pull-requests: read + +jobs: + manage: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + with: + persist-credentials: false + fetch-depth: 0 + + - name: Setup git committer + id: committer + uses: ./.github/actions/setup-git-committer + with: + opencode-app-id: ${{ vars.OPENCODE_APP_ID }} + opencode-app-secret: ${{ secrets.OPENCODE_APP_SECRET }} + + - uses: mitchellh/vouch/action/manage-by-issue@main + with: + issue-id: ${{ github.event.issue.number }} + comment-id: ${{ github.event.comment.id }} + roles: admin,maintain + env: + GITHUB_TOKEN: ${{ steps.committer.outputs.token }} diff --git a/.vscode/launch.example.json b/.vscode/launch.example.json deleted file mode 100644 index 3f8a2a760863..000000000000 --- a/.vscode/launch.example.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "version": "0.2.0", - "configurations": [ - { - "type": "bun", - "request": "attach", - "name": "opencode (attach)", - "url": "ws://localhost:6499/" - } - ] -} diff --git a/.vscode/settings.example.json b/.vscode/settings.example.json deleted file mode 100644 index 05bbf7fe11c1..000000000000 --- a/.vscode/settings.example.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "recommendations": [ - "oven.bun-vscode" - ] -}