Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
80 commits
Select commit Hold shift + click to select a range
625635f
Initial commit
don-petry Mar 21, 2026
aaef7b0
Install BMad Method v6.2.0 with Claude Code integration
claude Mar 21, 2026
d64d677
fix: configure CodeQL to scan Python only (#6)
don-petry Mar 24, 2026
e00605a
chore: add ECC integration, TEA module, and slim CLAUDE.md
Mar 26, 2026
d33ef2a
Add Claude Code GitHub Action (#15)
don-petry Mar 27, 2026
0b585c2
fix: address OpenSSF Scorecard findings (#22)
don-petry Mar 28, 2026
26cd936
chore(deps): bump github/codeql-action from 3.35.1 to 4.35.1 (#27)
dependabot[bot] Apr 1, 2026
6b1a50f
chore(deps): bump actions/checkout from 4.3.1 to 6.0.2 (#24)
dependabot[bot] Apr 1, 2026
2936c65
ci: skip Claude Code reviewer on Dependabot PRs (#28)
don-petry Apr 1, 2026
a245c8a
ci: move Dependabot exclusion to step-level in Claude workflow (#30)
don-petry Apr 1, 2026
d929459
chore(deps): bump anthropics/claude-code-action from 1.0.80 to 1.0.82…
dependabot[bot] Apr 1, 2026
11f8b82
chore(deps): bump anthropics/claude-code-action from 1.0.83 to 1.0.88…
dependabot[bot] Apr 4, 2026
75472aa
chore: enable Claude issue trigger per org CI standard (#48)
don-petry Apr 5, 2026
e49aa7c
fix: add checkout step to Claude workflow for issue-triggered mode (#49)
don-petry Apr 5, 2026
2accd47
feat: split Claude workflow into interactive + issue automation jobs …
don-petry Apr 6, 2026
d0e04aa
feat: switch to org-level reusable Claude Code workflow (#62)
don-petry Apr 6, 2026
51d0ab5
chore: add CODEOWNERS file for code review enforcement
github-actions[bot] Apr 6, 2026
6706ff6
fix: rename codeql workflow and add javascript-typescript + actions m…
don-petry Apr 8, 2026
d098c28
chore(workflows): adopt centralized stubs from petry-projects/.github…
don-petry Apr 8, 2026
741ff99
fix: correct reusable workflow path (remove duplicate .github/) (#135)
don-petry Apr 21, 2026
573821b
Revert "fix: correct reusable workflow path (remove duplicate .github…
Apr 21, 2026
a6905fc
ci: add auto-rebase workflow and check_run trigger to claude.yml
don-petry Apr 21, 2026
cfbb1e1
chore(ci): remove stray codeql.yml workflow (#115)
don-petry Apr 26, 2026
da8aa66
chore(security): remove drift codeql.yml, enable GitHub-managed defau…
don-petry Apr 26, 2026
4b7859b
fix(ci): pin agent-shield reusable workflow to SHA (#126)
don-petry Apr 26, 2026
2d34863
chore: add bot accounts to CODEOWNERS for auto-merge support
don-petry May 3, 2026
58debfe
chore: standardize CODEOWNERS on @petry-projects/org-leads (#160)
don-petry May 4, 2026
f1986f4
chore(dev-lead): remove claude.yml — replaced by dev-lead.yml (#176)
don-petry May 16, 2026
bc1f99d
feat: implement issue #162 — Compliance: codeowners-no-catchall (#182)
don-petry May 20, 2026
cfb8844
feat: implement issue #175 — Compliance: non-stub-pr-review-mention.y…
don-petry May 21, 2026
fe356fa
feat: implement issue #161 — Compliance: codeowners-org-leads-not-fir…
don-petry May 21, 2026
c0eb24b
fix: make copilot setup workflow docs-only for current TalkTerm main
don-petry May 21, 2026
b3f6eff
feat: implement issue #200 — [Fleet Monitor] petry-projects/TalkTerm …
don-petry May 21, 2026
7de8f91
feat: implement issue #86 — Compliance: unpinned-actions-claude.yml (…
don-petry May 21, 2026
3d6a1dd
feat: implement issue #198 — [Fleet Monitor] petry-projects/TalkTerm …
don-petry May 21, 2026
266f4fc
feat: implement issue #163 — Compliance: check-suite-auto-trigger-123…
don-petry May 21, 2026
750731e
rollout: deploy pr-review-mention standard workflow (#236)
don-petry May 31, 2026
e545091
feat: implement issue #217 — Compliance: codeowners-org-leads-not-fir…
don-petry Jun 20, 2026
bdf0c06
Initial commit
don-petry Mar 21, 2026
66d85e2
Install BMad Method v6.2.0 with Claude Code integration
claude Mar 21, 2026
913a89e
fix: configure CodeQL to scan Python only (#6)
don-petry Mar 24, 2026
90d09e1
chore: add ECC integration, TEA module, and slim CLAUDE.md
Mar 26, 2026
e9565de
Add Claude Code GitHub Action (#15)
don-petry Mar 27, 2026
4634b28
fix: address OpenSSF Scorecard findings (#22)
don-petry Mar 28, 2026
c972b7e
chore(deps): bump github/codeql-action from 3.35.1 to 4.35.1 (#27)
dependabot[bot] Apr 1, 2026
83c2bcf
chore(deps): bump actions/checkout from 4.3.1 to 6.0.2 (#24)
dependabot[bot] Apr 1, 2026
9476d19
ci: skip Claude Code reviewer on Dependabot PRs (#28)
don-petry Apr 1, 2026
5b83788
ci: move Dependabot exclusion to step-level in Claude workflow (#30)
don-petry Apr 1, 2026
8ac2179
chore(deps): bump anthropics/claude-code-action from 1.0.80 to 1.0.82…
dependabot[bot] Apr 1, 2026
fa5c54d
chore(deps): bump anthropics/claude-code-action from 1.0.83 to 1.0.88…
dependabot[bot] Apr 4, 2026
21cffee
chore: enable Claude issue trigger per org CI standard (#48)
don-petry Apr 5, 2026
9495ba5
fix: add checkout step to Claude workflow for issue-triggered mode (#49)
don-petry Apr 5, 2026
b432052
feat: split Claude workflow into interactive + issue automation jobs …
don-petry Apr 6, 2026
366c227
feat: switch to org-level reusable Claude Code workflow (#62)
don-petry Apr 6, 2026
cdaae18
chore: add CODEOWNERS file for code review enforcement
github-actions[bot] Apr 6, 2026
13a306c
fix: rename codeql workflow and add javascript-typescript + actions m…
don-petry Apr 8, 2026
6d0fe32
chore(workflows): adopt centralized stubs from petry-projects/.github…
don-petry Apr 8, 2026
5a96bff
fix: correct reusable workflow path (remove duplicate .github/) (#135)
don-petry Apr 21, 2026
09b2064
Revert "fix: correct reusable workflow path (remove duplicate .github…
Apr 21, 2026
09f8241
ci: add auto-rebase workflow and check_run trigger to claude.yml
don-petry Apr 21, 2026
45a490a
chore(ci): remove stray codeql.yml workflow (#115)
don-petry Apr 26, 2026
3bdb6d4
chore(security): remove drift codeql.yml, enable GitHub-managed defau…
don-petry Apr 26, 2026
f6d8423
fix(ci): pin agent-shield reusable workflow to SHA (#126)
don-petry Apr 26, 2026
79a9b48
chore: add bot accounts to CODEOWNERS for auto-merge support
don-petry May 3, 2026
ed45071
chore: standardize CODEOWNERS on @petry-projects/org-leads (#160)
don-petry May 4, 2026
bc67574
feat(dev-lead): adopt dev-lead agent (Phase 8 cross-repo rollout)
don-petry May 15, 2026
19d1fb5
chore(dev-lead): remove claude.yml — replaced by dev-lead.yml (#176)
don-petry May 16, 2026
f308911
feat: implement issue #171 — Compliance: secret_scanning_ai_detection…
don-petry May 20, 2026
04a10ac
feat: implement issue #162 — Compliance: codeowners-no-catchall (#182)
don-petry May 20, 2026
ef8ec6f
feat: implement issue #175 — Compliance: non-stub-pr-review-mention.y…
don-petry May 21, 2026
e6c45ae
feat: implement issue #161 — Compliance: codeowners-org-leads-not-fir…
don-petry May 21, 2026
c63e134
feat: implement issue #200 — [Fleet Monitor] petry-projects/TalkTerm …
don-petry May 21, 2026
1611ff8
feat: implement issue #86 — Compliance: unpinned-actions-claude.yml (…
don-petry May 21, 2026
75c6f6c
feat: implement issue #163 — Compliance: check-suite-auto-trigger-123…
don-petry May 21, 2026
81ac226
rollout: deploy pr-review-mention standard workflow (#236)
don-petry May 31, 2026
855700c
fix(dev-lead): align to @main — drop broken concurrency + grant statu…
don-petry Jun 8, 2026
286835b
chore: apply manual instructions [skip ci-relay]
donpetry-bot Jun 20, 2026
1d06f3d
fix(bot): address bot feedback [skip ci-relay]
donpetry-bot Jun 21, 2026
f3ec6ef
Merge branch 'main' into dev-lead/issue-275-20260613-0928
don-petry Jun 22, 2026
1ae38d6
fix(gitleaks): suppress false positives for commits da36d9b3 and 38e9…
donpetry-bot Jun 22, 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
5 changes: 5 additions & 0 deletions .github/CODEOWNERS
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
# CODEOWNERS
# Standard: use the @petry-projects/org-leads team for all code owner
# assignments. See petry-projects/.github standards/codeowners-standard.md

* @petry-projects/org-leads
20 changes: 4 additions & 16 deletions .github/workflows/auto-rebase.yml
Original file line number Diff line number Diff line change
Expand Up @@ -7,10 +7,8 @@
# • This file is a THIN CALLER STUB. All branch-update logic lives in the
# reusable workflow above.
# • You MAY change: the SHA in the `uses:` line when upgrading the reusable
# workflow version (bump SHA to the commit that `auto-rebase/stable` points
# to in petry-projects/.github — pinned SHA is required for SonarCloud).
# • You MUST NOT change: the trigger event,
# the concurrency group name,
# workflow version (bump SHA to latest main of petry-projects/.github).
# • You MUST NOT change: trigger event, the concurrency group name,
# or the job-level `permissions:` block — reusable workflows can be
# granted no more permissions than the calling job has, so removing
# the stanza breaks the reusable's gh API calls.
Expand All @@ -21,16 +19,6 @@
# Auto-rebase non-Dependabot PRs — thin caller for the org-level reusable.
# To adopt: copy this file to .github/workflows/auto-rebase.yml in your repo.
# No secrets required — uses GITHUB_TOKEN only.
#
# By default the reusable only updates *review-ready* PRs: non-draft AND
# (carrying a current APPROVED review OR the `auto-rebase:ready` label). This
# keeps the workflow from fanning out branch-update CI runs to every behind PR.
# To tune it, pass inputs to the reusable, e.g.:
#
# with:
# eligibility: review-ready # default; or `all` to update every behind PR
# ready_label: auto-rebase:ready # label that opts a non-draft PR in
#
name: Auto-rebase non-Dependabot PRs

on:
Expand All @@ -50,5 +38,5 @@ jobs:
permissions:
contents: write # update-branch via GITHUB_TOKEN (may touch .github/workflows/)
pull-requests: write # post comments on PRs
uses: petry-projects/.github/.github/workflows/auto-rebase-reusable.yml@376a4fcb1117444595e3e702fa450873d0e54310 # auto-rebase/stable
secrets: inherit
uses: petry-projects/.github/.github/workflows/auto-rebase-reusable.yml@d3d768dabb7f28cc63283cdfe48630da53700e50 # v1
secrets: inherit
7 changes: 1 addition & 6 deletions .github/workflows/dev-lead.yml
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,6 @@ name: Dev-Lead Agent

on:
pull_request:
branches: [main]
types: [opened, reopened, synchronize]
pull_request_review:
types: [submitted]
Expand All @@ -33,14 +32,10 @@ on:
check_run:
types: [completed]
repository_dispatch:
types: [dev-lead-ci-failure, dev-lead-reviews-retry, dev-lead-issue-retry]
types: [dev-lead-ci-failure, dev-lead-reviews-retry]

permissions: {}

# Concurrency is centralised in the reusable workflow (dev-lead-reusable.yml) with
# per-issue / per-PR lanes, so issue pickups are never cancelled by PR follow-up
# traffic and the grouping can't drift per-repo. See petry-projects/.github#402.

jobs:
dev-lead:
# Pinned to the moving dev-lead/stable channel tag, not @main, so a broken
Expand Down
1 change: 1 addition & 0 deletions .github/workflows/pr-review-mention.yml
Original file line number Diff line number Diff line change
Expand Up @@ -41,3 +41,4 @@ jobs:
statuses: read
uses: petry-projects/.github/.github/workflows/pr-review-mention-reusable.yml@v2
secrets: inherit

36 changes: 29 additions & 7 deletions .gitleaksignore
Original file line number Diff line number Diff line change
Expand Up @@ -36,9 +36,9 @@ e8cc0956c901e454aed61e7b10857e6a1a412881:_bmad/_config/files-manifest.csv:generi
e8cc0956c901e454aed61e7b10857e6a1a412881:_bmad/_config/files-manifest.csv:generic-api-key:409
e8cc0956c901e454aed61e7b10857e6a1a412881:_bmad/_config/files-manifest.csv:generic-api-key:433

# Commit aec934f9: same _bmad/_config/files-manifest.csv CSV rows as above
# (SHA256 content checksums of BMAD skill files) appearing in a later commit
# that re-introduced the same content. Same false-positive rationale applies.
# Commit aec934f9: same _bmad/_config/files-manifest.csv SHA256-checksum rows as
# e8cc0956 above — identical false-positive pattern (file-content checksums, not
# API keys). Full-history CLI scan flags this ancestor commit independently.
aec934f92f4174b89944ee57a3d5cf68737f71c9:_bmad/_config/files-manifest.csv:generic-api-key:281
aec934f92f4174b89944ee57a3d5cf68737f71c9:_bmad/_config/files-manifest.csv:generic-api-key:282
aec934f92f4174b89944ee57a3d5cf68737f71c9:_bmad/_config/files-manifest.csv:generic-api-key:284
Expand Down Expand Up @@ -85,25 +85,47 @@ c5099d1dfbc58bd65ddd0e4efd267666260bb3f6:_bmad/_config/files-manifest.csv:generi
c5099d1dfbc58bd65ddd0e4efd267666260bb3f6:_bmad/_config/files-manifest.csv:generic-api-key:409
c5099d1dfbc58bd65ddd0e4efd267666260bb3f6:_bmad/_config/files-manifest.csv:generic-api-key:433

# Commits 899ea777, 40bd4031, 4c9852dc: same _bmad/_config/files-manifest.csv CSV rows as
# above (SHA256 content checksums of BMAD skill files). Same false-positive rationale.
# These three commits appeared in the full-history scan triggered by PR #309 but were not
# yet suppressed; pattern is identical to the already-reviewed entries above.
# Commit 899ea777: same _bmad/_config/files-manifest.csv CSV rows as above
# (SHA256 content checksums of BMAD skill files). Same false-positive rationale.
899ea7773683bc45c329b6d5f413c8662c67d6f1:_bmad/_config/files-manifest.csv:generic-api-key:281
899ea7773683bc45c329b6d5f413c8662c67d6f1:_bmad/_config/files-manifest.csv:generic-api-key:282
899ea7773683bc45c329b6d5f413c8662c67d6f1:_bmad/_config/files-manifest.csv:generic-api-key:284
899ea7773683bc45c329b6d5f413c8662c67d6f1:_bmad/_config/files-manifest.csv:generic-api-key:300
899ea7773683bc45c329b6d5f413c8662c67d6f1:_bmad/_config/files-manifest.csv:generic-api-key:409
899ea7773683bc45c329b6d5f413c8662c67d6f1:_bmad/_config/files-manifest.csv:generic-api-key:433

# Commit 40bd403: same _bmad/_config/files-manifest.csv CSV rows as above
# (SHA256 content checksums of BMAD skill files). Same false-positive rationale.
40bd40314d66e26adc09503c098e34e4254a53a9:_bmad/_config/files-manifest.csv:generic-api-key:281
40bd40314d66e26adc09503c098e34e4254a53a9:_bmad/_config/files-manifest.csv:generic-api-key:282
40bd40314d66e26adc09503c098e34e4254a53a9:_bmad/_config/files-manifest.csv:generic-api-key:284
40bd40314d66e26adc09503c098e34e4254a53a9:_bmad/_config/files-manifest.csv:generic-api-key:300
40bd40314d66e26adc09503c098e34e4254a53a9:_bmad/_config/files-manifest.csv:generic-api-key:409
40bd40314d66e26adc09503c098e34e4254a53a9:_bmad/_config/files-manifest.csv:generic-api-key:433

# Commit 4c9852dc: same _bmad/_config/files-manifest.csv CSV rows as above
# (SHA256 content checksums of BMAD skill files). Same false-positive rationale.
4c9852dcd788730edfb9aaac3c7cca3a6777df9f:_bmad/_config/files-manifest.csv:generic-api-key:281
4c9852dcd788730edfb9aaac3c7cca3a6777df9f:_bmad/_config/files-manifest.csv:generic-api-key:282
4c9852dcd788730edfb9aaac3c7cca3a6777df9f:_bmad/_config/files-manifest.csv:generic-api-key:284
4c9852dcd788730edfb9aaac3c7cca3a6777df9f:_bmad/_config/files-manifest.csv:generic-api-key:300
4c9852dcd788730edfb9aaac3c7cca3a6777df9f:_bmad/_config/files-manifest.csv:generic-api-key:409
4c9852dcd788730edfb9aaac3c7cca3a6777df9f:_bmad/_config/files-manifest.csv:generic-api-key:433

# Commit da36d9b3: same _bmad/_config/files-manifest.csv CSV rows as above
# (SHA256 content checksums of BMAD skill files). Same false-positive rationale.
da36d9b36916087f02c4c367ad6107ab7dbdb152:_bmad/_config/files-manifest.csv:generic-api-key:281
da36d9b36916087f02c4c367ad6107ab7dbdb152:_bmad/_config/files-manifest.csv:generic-api-key:282
da36d9b36916087f02c4c367ad6107ab7dbdb152:_bmad/_config/files-manifest.csv:generic-api-key:284
da36d9b36916087f02c4c367ad6107ab7dbdb152:_bmad/_config/files-manifest.csv:generic-api-key:300
da36d9b36916087f02c4c367ad6107ab7dbdb152:_bmad/_config/files-manifest.csv:generic-api-key:409
da36d9b36916087f02c4c367ad6107ab7dbdb152:_bmad/_config/files-manifest.csv:generic-api-key:433

# Commit 38e9f745: same _bmad/_config/files-manifest.csv CSV rows as above
# (SHA256 content checksums of BMAD skill files). Same false-positive rationale.
38e9f74523fb9c79fa465831381c3ce9ac050c29:_bmad/_config/files-manifest.csv:generic-api-key:281
38e9f74523fb9c79fa465831381c3ce9ac050c29:_bmad/_config/files-manifest.csv:generic-api-key:282
38e9f74523fb9c79fa465831381c3ce9ac050c29:_bmad/_config/files-manifest.csv:generic-api-key:284
38e9f74523fb9c79fa465831381c3ce9ac050c29:_bmad/_config/files-manifest.csv:generic-api-key:300
38e9f74523fb9c79fa465831381c3ce9ac050c29:_bmad/_config/files-manifest.csv:generic-api-key:409
38e9f74523fb9c79fa465831381c3ce9ac050c29:_bmad/_config/files-manifest.csv:generic-api-key:433
131 changes: 25 additions & 106 deletions scripts/apply-repo-settings.sh
Original file line number Diff line number Diff line change
@@ -1,69 +1,21 @@
#!/usr/bin/env bash
# Apply repository-level standard settings via the GitHub API.
# Apply repository-level security settings via the GitHub API.
#
# Applies security_and_analysis settings and disables check-suite auto-trigger
# for apps that queue suites on every push without completing them (Claude,
# CodeRabbit), which permanently blocks GitHub auto-merge.
# Called by the apply-repo-settings workflow on every push to main so that
# settings documented in .github/settings.yml stay in effect even if they
# are reset manually.
#
# Standard: petry-projects/.github/standards/github-settings.md
# #check-suite-auto-trigger-preferences
#
# Usage:
# bash scripts/apply-repo-settings.sh <repo-name> # e.g. TalkTerm
# bash scripts/apply-repo-settings.sh <owner/repo>
# GITHUB_REPOSITORY=owner/repo bash scripts/apply-repo-settings.sh # CI form
#
# Environment:
# GH_TOKEN GitHub token. The check-suites API rejects OAuth app
# tokens — use a classic PAT with `repo` scope (or admin).
# ORG GitHub org used to expand a bare repo name (default:
# petry-projects).
# GITHUB_REPOSITORY owner/repo, used when no positional argument is given
# (set automatically by GitHub Actions).
#
# The helpers below are pure and side-effect-free so they can be sourced and
# unit-tested; main only runs when the script is executed directly.
# Required token scope: administration:write
# Usage (local): GH_TOKEN=<token> GITHUB_REPOSITORY=petry-projects/TalkTerm \
# ./scripts/apply-repo-settings.sh
set -euo pipefail

# App IDs whose check-suite auto-trigger must be disabled. GitHub creates a
# queued suite on every push when auto-trigger is on; these apps never complete
# those suites, permanently blocking auto-merge.
readonly -a CHECK_SUITE_APP_IDS=(1236702 347564) # Claude, CodeRabbit
REPO="${GITHUB_REPOSITORY:?GITHUB_REPOSITORY must be set (e.g. petry-projects/TalkTerm)}"

# resolve_repo <arg>
# Resolves the target "owner/repo". Precedence: positional arg, then
# GITHUB_REPOSITORY, then REPO. A bare name is expanded to "<ORG>/<name>".
# Returns non-zero if no repo can be determined.
resolve_repo() {
local repo="${1:-}"
[ -z "$repo" ] && repo="${GITHUB_REPOSITORY:-}"
[ -z "$repo" ] && repo="${REPO:-}"
[ -z "$repo" ] && return 1
case "$repo" in
*/*) printf '%s' "$repo" ;;
*) printf '%s/%s' "${ORG:-petry-projects}" "$repo" ;;
esac
}

# auto_trigger_status <prefs_json> <app_id>
# Echoes the current auto_trigger setting for app_id: "true", "false", or
# "missing" (app absent from preferences — never run in repo, so compliant).
auto_trigger_status() {
local json="${1:-}" app_id="$2"
if [ -z "$json" ]; then
printf 'missing'
return 0
fi
printf '%s' "$json" | jq -r --argjson id "$app_id" \
'.preferences.auto_trigger_checks // []
| map(select(.app_id == $id))
| if length == 0 then "missing" else (.[0].setting | tostring) end'
}
echo "Applying security_and_analysis settings to ${REPO} ..."

# apply_security_and_analysis <owner/repo>
apply_security_and_analysis() {
local repo="$1"
echo "Applying security_and_analysis settings to ${repo} ..."
gh api -X PATCH "repos/${repo}" --input - <<'JSON'
gh api -X PATCH "repos/${REPO}" \
--input - <<'JSON'
{
"security_and_analysis": {
"secret_scanning": { "status": "enabled" },
Expand All @@ -74,53 +26,20 @@ apply_security_and_analysis() {
}
}
JSON
}

# apply_check_suite_prefs <owner/repo>
# Disables auto-trigger for any configured app that currently has it enabled.
# Apps that are "missing" (never run) or already "false" are compliant and left
# untouched. The check-suites/preferences GET endpoint is PATCH-only on GitHub
# and returns 404, so when preferences cannot be read we conservatively apply
# the disabling PATCH for every configured app.
apply_check_suite_prefs() {
local repo="$1"
echo "Configuring check-suite auto-trigger preferences for ${repo} ..."

local prefs status app_id
local -a to_disable=()
if prefs=$(gh api "repos/${repo}/check-suites/preferences" 2>/dev/null) && [ -n "$prefs" ]; then
for app_id in "${CHECK_SUITE_APP_IDS[@]}"; do
status=$(auto_trigger_status "$prefs" "$app_id")
case "$status" in
missing) echo " app ${app_id}: never run in repo — compliant, skipping" ;;
false) echo " app ${app_id}: already disabled — skipping" ;;
*) echo " app ${app_id}: auto-trigger enabled — disabling"; to_disable+=("$app_id") ;;
esac
done
else
echo " could not read current preferences — applying disable for all configured apps"
to_disable=("${CHECK_SUITE_APP_IDS[@]}")
fi

if [ "${#to_disable[@]}" -eq 0 ]; then
echo " already compliant — nothing to do"
return 0
fi
echo "Disabling CodeRabbit (app 347564) and Claude (app 1236702) check-suite auto-trigger ..."

local payload
payload=$(printf '%s\n' "${to_disable[@]}" |
jq -Rcn '[inputs | tonumber] | map({app_id: ., setting: false}) | {auto_trigger_checks: .}')
gh api -X PATCH "repos/${repo}/check-suites/preferences" --input - <<<"$payload"
# These apps create queued check suites on every push that are never completed,
# which permanently blocks auto-merge. Disabling auto-trigger prevents GitHub
# from creating those ghost check suites.
gh api -X PATCH "repos/${REPO}/check-suites/preferences" \
--input - <<'JSON'
{
"auto_trigger_checks": [
{ "app_id": 347564, "setting": false },
{ "app_id": 1236702, "setting": false }
]
}
JSON

# Run main only when executed directly, so tests can source the helpers.
if [ "${BASH_SOURCE[0]:-$0}" = "$0" ]; then
set -euo pipefail
repo="$(resolve_repo "${1:-}")" || {
echo "Usage: $0 <repo-name|owner/repo> (or set GITHUB_REPOSITORY)" >&2
exit 1
}
apply_security_and_analysis "$repo"
apply_check_suite_prefs "$repo"
echo "Done."
fi
echo "Done."