Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
160 commits
Select commit Hold shift + click to select a range
6b3541d
feat(cli)!: remove deprecated commands and the supabase-go binary (#6…
Coly010 Oct 8, 2026
808408c
Merge commit '79eaa9ca8ac224af9f609852d47d0eaba2ff1266' into HEAD
github-actions[bot] Oct 8, 2026
b903db0
refactor(cli)!: remove Go CLI naming and framing from code and docs (…
Coly010 Oct 9, 2026
2ac84c2
feat(cli)!: make pg-delta the default diff engine for all projects (#…
avallete Oct 9, 2026
4324772
Merge remote-tracking branch 'origin/next' into sync/develop-into-next
github-actions[bot] Oct 12, 2026
489a18c
chore(repo): fix the develop-into-next merge
github-actions[bot] Oct 12, 2026
015bf52
Merge remote-tracking branch 'refs/remotes/origin/develop' into HEAD
github-actions[bot] Oct 12, 2026
eaa5c4f
feat(cli)!: resolve config values as flags > env > config.toml > defa…
Coly010 Oct 12, 2026
948107b
feat(cli)!: remove db remote commit and the low-use inspect db aliase…
Coly010 Oct 13, 2026
bc26f81
Merge remote-tracking branch 'origin/next' into sync/develop-into-next
github-actions[bot] Oct 13, 2026
9d90c46
chore(repo): format the develop-into-next merge
github-actions[bot] Oct 13, 2026
76ce5fd
chore(repo): fix the develop-into-next merge
github-actions[bot] Oct 13, 2026
3a16e2b
chore(repo): repair the develop-into-next sync
github-actions[bot] Oct 13, 2026
d09c050
Merge remote-tracking branch 'origin/next' into sync/develop-into-next
github-actions[bot] Oct 13, 2026
7954e73
chore(repo): fix the develop-into-next merge
github-actions[bot] Oct 13, 2026
66f816a
chore(repo): repair the develop-into-next sync
github-actions[bot] Oct 13, 2026
9e6d517
Merge remote-tracking branch 'origin/next' into sync/develop-into-next
github-actions[bot] Oct 13, 2026
2441fbf
chore(repo): format the develop-into-next merge
github-actions[bot] Oct 13, 2026
9d76bb9
Merge remote-tracking branch 'origin/next' into sync/develop-into-next
github-actions[bot] Oct 14, 2026
7dfd9b8
chore(repo): format the develop-into-next merge
github-actions[bot] Oct 14, 2026
5adbad2
Merge remote-tracking branch 'origin/next' into sync/develop-into-next
github-actions[bot] Oct 14, 2026
c9956c3
chore(repo): repair the develop-into-next sync
github-actions[bot] Oct 14, 2026
bf5cb17
Merge remote-tracking branch 'origin/next' into sync/develop-into-next
github-actions[bot] Oct 14, 2026
8bdd6ee
chore(repo): format the develop-into-next merge
github-actions[bot] Oct 14, 2026
9fda620
chore(repo): fix the develop-into-next merge
github-actions[bot] Oct 14, 2026
45e899d
ci: drop Go CLI steps from develop workflows for next
avallete Oct 14, 2026
bfe734e
chore(repo): drop develop's v3 removal warnings on next
avallete Oct 14, 2026
b068add
docs(repo): drop stale ADR copies left by the next merge
avallete Oct 14, 2026
3903494
Merge remote-tracking branch 'origin/next' into sync/develop-into-next
github-actions[bot] Oct 14, 2026
b064c72
chore(repo): repair the develop-into-next sync
github-actions[bot] Oct 14, 2026
8913e85
feat(cli)!: remove deprecated db pull and domains flags (CLI-2596) (#…
Coly010 Oct 15, 2026
59d4627
feat(cli)!: default secrets unset to no and require --all to unset ev…
Coly010 Oct 15, 2026
2f60e0b
feat(cli)!: remove deprecated config keys, env vars and per-function …
Coly010 Oct 15, 2026
8e5a4cb
Merge remote-tracking branch 'refs/remotes/origin/next' into HEAD
github-actions[bot] Oct 15, 2026
4d5bd28
Merge remote-tracking branch 'origin/next' into sync/develop-into-next
github-actions[bot] Oct 15, 2026
313639e
chore(repo): format the develop-into-next merge
github-actions[bot] Oct 15, 2026
84193ea
chore(repo): fix the develop-into-next merge
github-actions[bot] Oct 15, 2026
8a806fd
Merge remote-tracking branch 'origin/develop' into sync/develop-into-…
avallete Oct 15, 2026
d78b1ed
test(cli): match Management API requests by parsed origin
avallete Oct 15, 2026
b7add97
Merge commit '10a11da0e7032614baaa1c03f044fa0bd487605b' into HEAD
github-actions[bot] Oct 15, 2026
7eb99c3
Merge remote-tracking branch 'origin/next' into sync/develop-into-next
github-actions[bot] Oct 16, 2026
b4a24ea
Merge remote-tracking branch 'origin/next' into sync/develop-into-next
github-actions[bot] Oct 16, 2026
74bcab0
Merge remote-tracking branch 'origin/next' into sync/develop-into-next
github-actions[bot] Oct 16, 2026
31b7b4f
Merge remote-tracking branch 'origin/next' into sync/develop-into-next
github-actions[bot] Oct 16, 2026
9e49213
Merge remote-tracking branch 'origin/next' into sync/develop-into-next
github-actions[bot] Oct 16, 2026
3d62653
chore(repo): fix the develop-into-next merge
github-actions[bot] Oct 16, 2026
38085bb
Merge remote-tracking branch 'origin/next' into sync/develop-into-next
github-actions[bot] Oct 16, 2026
e9da236
chore(repo): fix the develop-into-next merge
github-actions[bot] Oct 16, 2026
c92987c
Merge remote-tracking branch 'origin/next' into sync/develop-into-next
github-actions[bot] Oct 16, 2026
3f3cdfa
chore(repo): repair the develop-into-next sync
github-actions[bot] Oct 16, 2026
10cdf54
Merge remote-tracking branch 'origin/next' into sync/develop-into-next
github-actions[bot] Oct 16, 2026
2b22999
Merge remote-tracking branch 'origin/next' into sync/develop-into-next
github-actions[bot] Oct 18, 2026
61d7f9e
Merge remote-tracking branch 'origin/next' into sync/develop-into-next
github-actions[bot] Oct 19, 2026
b8d414e
Merge remote-tracking branch 'origin/next' into sync/develop-into-next
github-actions[bot] Oct 19, 2026
d70151e
Merge remote-tracking branch 'origin/next' into sync/develop-into-next
github-actions[bot] Oct 19, 2026
f219e67
Merge remote-tracking branch 'origin/next' into sync/develop-into-next
github-actions[bot] Oct 19, 2026
8851a28
Merge remote-tracking branch 'origin/next' into sync/develop-into-next
github-actions[bot] Oct 19, 2026
39100e9
Merge remote-tracking branch 'origin/next' into sync/develop-into-next
github-actions[bot] Oct 19, 2026
74359b1
Merge remote-tracking branch 'origin/next' into sync/develop-into-next
github-actions[bot] Oct 19, 2026
fdb5914
fix(config)!: honor sms `enable_confirmations` on config push (CLI-26…
7ttp Oct 19, 2026
a2413ad
Merge remote-tracking branch 'origin/next' into sync/develop-into-next
github-actions[bot] Oct 19, 2026
914d3cf
chore(repo): repair the develop-into-next sync
github-actions[bot] Oct 19, 2026
e1c14f6
Merge remote-tracking branch 'origin/next' into sync/develop-into-next
github-actions[bot] Oct 19, 2026
6f8ec75
Merge remote-tracking branch 'origin/next' into sync/develop-into-next
github-actions[bot] Oct 19, 2026
6273620
chore(repo): fix the develop-into-next merge
github-actions[bot] Oct 19, 2026
76fc6bb
chore(repo): repair the develop-into-next sync
github-actions[bot] Oct 19, 2026
82280cb
Merge remote-tracking branch 'origin/next' into sync/develop-into-next
github-actions[bot] Oct 19, 2026
81b375b
chore(repo): repair the develop-into-next sync
github-actions[bot] Oct 19, 2026
5d968e1
Merge remote-tracking branch 'origin/next' into sync/develop-into-next
github-actions[bot] Oct 19, 2026
9300081
Merge remote-tracking branch 'origin/next' into sync/develop-into-next
github-actions[bot] Oct 20, 2026
15d1db7
Merge remote-tracking branch 'origin/next' into sync/develop-into-next
github-actions[bot] Oct 20, 2026
8149a66
Merge remote-tracking branch 'origin/next' into sync/develop-into-next
github-actions[bot] Oct 20, 2026
9914fc1
Merge remote-tracking branch 'origin/next' into sync/develop-into-next
github-actions[bot] Oct 20, 2026
1fa6164
feat(cli)!: one --remote flag, local target defaults and one hosted-m…
Coly010 Oct 21, 2026
968b41d
chore(repo): merge next into sync/develop-into-next
avallete Oct 23, 2026
c3d6a6d
test(cli): drop pooler URL from db toml precedence goldens
avallete Oct 23, 2026
a7de767
chore(stack): bump storage to v1.84.20-r0 (#7298)
supabase-cli-releaser[bot] Oct 23, 2026
4f26d50
Merge remote-tracking branch 'origin/next' into sync/develop-into-next
github-actions[bot] Oct 23, 2026
607523d
chore(repo): repair the develop-into-next sync
github-actions[bot] Oct 23, 2026
2bdf6c5
chore(stack): bump storage to v1.84.21-r0 (#7303)
supabase-cli-releaser[bot] Oct 23, 2026
1b04c31
Merge remote-tracking branch 'origin/next' into sync/develop-into-next
github-actions[bot] Oct 23, 2026
da27a34
ci: bump toolchains and upgrade mise-action to v5 (#7285)
kanadgupta Oct 23, 2026
e125d0f
chore(ci): bump jactionlint to 2.3.0 and address its new rules (#7287)
kanadgupta Oct 23, 2026
f1834ed
chore(stack): bump storage to v1.84.22-r0 (#7306)
supabase-cli-releaser[bot] Oct 23, 2026
25ee860
Merge remote-tracking branch 'origin/next' into sync/develop-into-next
github-actions[bot] Oct 23, 2026
9740741
chore(stack): bump storage to v1.84.23-r0 (#7308)
supabase-cli-releaser[bot] Oct 23, 2026
666bb77
chore(stack): bump realtime to v2.147.2-r0 (#7314)
supabase-cli-releaser[bot] Oct 23, 2026
1d50d0a
chore: sync API types from infrastructure (#7316)
supabase-cli-releaser[bot] Oct 23, 2026
4664850
chore(stack): bump realtime to v2.147.3-r0 (#7317)
supabase-cli-releaser[bot] Oct 23, 2026
41d66c9
chore(stack): bump studio to 2026.10.26-sha-478bd88-r0 (#7323)
supabase-cli-releaser[bot] Oct 26, 2026
e2a524f
feat(cli): carry plan-gate entitlement on machine-mode errors (#7271)
pamelachia Oct 26, 2026
e3d4723
docs: Add SECURITY.md (#7322)
idawson-sb Oct 26, 2026
249b048
chore(stack): bump postgres to 17.11.0.007-r0 (#7293)
supabase-cli-releaser[bot] Oct 26, 2026
9417476
chore(stack): bump realtime to v2.147.4-r0 (#7328)
supabase-cli-releaser[bot] Oct 26, 2026
3b098d8
fix(cli): skip reserved-role parameter grants in role dump (CLI-2843)…
7ttp Oct 26, 2026
40238ec
refactor(cli): move the delegated binary and project link to effect (…
7ttp Oct 26, 2026
58c3596
refactor(cli): resolve local config values through effect (CLI-2837) …
7ttp Oct 26, 2026
9e84159
fix(cli)!: stop `db advisors --remote` minting a login role (CLI-2829…
7ttp Oct 26, 2026
391a5cd
refactor(api): cover the client sources with effect lint (CLI-2841) (…
7ttp Oct 26, 2026
a64030e
refactor(api): cover the generator scripts with effect lint (CLI-2842…
7ttp Oct 26, 2026
0238c48
test(cli): cover `apps/cli/tests` with effect lint (CLI-2852) (#7327)
7ttp Oct 26, 2026
f6f7859
feat(config): publish x-secret markers in the config JSON schema (#7330)
Coly010 Oct 26, 2026
3e91ac6
chore(stack): bump realtime to v2.148.0-r0 (#7332)
supabase-cli-releaser[bot] Oct 26, 2026
b113cd3
chore(stack): bump storage to v1.84.25-r0 (#7335)
supabase-cli-releaser[bot] Oct 26, 2026
cef7020
chore(stack): bump realtime to v2.148.1-r0 (#7337)
supabase-cli-releaser[bot] Oct 26, 2026
3584594
chore(stack): bump realtime to v2.148.2-r0 (#7341)
supabase-cli-releaser[bot] Oct 27, 2026
fdb0e1f
feat(config): add db.migrations.checks severities and exclusions (CLI…
mdonnalley Oct 27, 2026
071b58f
ci(cli): unblock the go test job (#7343)
7ttp Oct 27, 2026
af99918
refactor(cli): cover `apps/cli/scripts` with effect lint (CLI-2853) (…
7ttp Oct 27, 2026
11559a9
chore(stack): bump storage to v1.84.28-r0 (#7346)
supabase-cli-releaser[bot] Oct 27, 2026
2918d93
fix(stack): reuse the Deno cache when booting Edge Function workers (…
Coly010 Oct 27, 2026
3507dba
feat(config): accept env() on number, boolean, enum and list fields i…
Coly010 Oct 27, 2026
4958201
feat(cli): fall back to ecr public for slim images (CLI-2874) (#7350)
7ttp Oct 27, 2026
99b4540
feat(stack): forward client address headers to upstreams (CLI-2823) (…
7ttp Oct 27, 2026
730dec8
refactor(repo): cover `tools`, `apps/docs` and `cli-test-helpers` wit…
7ttp Oct 27, 2026
e304475
chore(stack): bump postgres to 15.19.0.008-r0 (#7353)
supabase-cli-releaser[bot] Oct 27, 2026
a1a191e
chore(stack): bump storage to v1.84.30-r0 (#7352)
supabase-cli-releaser[bot] Oct 27, 2026
5d0fa9c
chore(stack): bump realtime to v2.148.5-r0 (#7355)
supabase-cli-releaser[bot] Oct 27, 2026
fa6fdf2
chore(stack): bump realtime to v2.148.6-r0 (#7357)
supabase-cli-releaser[bot] Oct 27, 2026
f99aa13
chore: sync API types from infrastructure (#7358)
supabase-cli-releaser[bot] Oct 28, 2026
18f2524
chore(stack): bump storage to v1.84.32-r0 (#7356)
supabase-cli-releaser[bot] Oct 28, 2026
983bf3c
chore(stack): bump edge-runtime to v1.77.9-r0 (#7360)
supabase-cli-releaser[bot] Oct 28, 2026
2aa018f
fix(cli): place the migration error caret correctly (CLI-2538) (#7351)
7ttp Oct 28, 2026
bcda9df
fix(cli): show ethereum web3 example in init config (CLI-2854) (#7334)
7ttp Oct 28, 2026
dbc4dfb
fix(cli): start the local stack when Docker cannot exec health checks…
Coly010 Oct 28, 2026
b448ca0
Merge remote-tracking branch 'origin/next' into sync/develop-into-next
Coly010 Oct 28, 2026
9752843
chore(repo): drop Go CI workflows from the develop-into-next sync
Coly010 Oct 28, 2026
aa40393
chore(stack): bump realtime to v2.149.0-r0 (#7364)
supabase-cli-releaser[bot] Oct 28, 2026
5e7ad29
fix(cli): honor `--workdir` in `secrets set` (CLI-2887) (#7361)
7ttp Oct 28, 2026
44d0387
chore(stack): bump realtime to v2.149.1-r0 (#7365)
supabase-cli-releaser[bot] Oct 28, 2026
8d94420
chore(stack): bump storage to v1.84.33-r0 (#7370)
supabase-cli-releaser[bot] Oct 28, 2026
0e2e126
fix(cli): push oauth server enabled and path together (CLI-2691) (#7367)
7ttp Oct 28, 2026
c725074
chore(stack): bump storage to v1.84.34-r0 (#7373)
supabase-cli-releaser[bot] Oct 28, 2026
7916c98
chore(stack): bump postgres to 17.11.0.008-r0 (#7375)
supabase-cli-releaser[bot] Oct 28, 2026
5d5f526
chore(stack): add postgres 17.11.0.008-orioledb-r0 (#7376)
supabase-cli-releaser[bot] Oct 28, 2026
61c822d
chore(stack): bump storage to v1.84.35-r0 (#7381)
supabase-cli-releaser[bot] Oct 28, 2026
0cc65ea
chore(stack): bump storage to v1.84.36-r0 (#7383)
supabase-cli-releaser[bot] Oct 28, 2026
480345c
chore(stack): bump realtime to v2.149.2-r0 (#7389)
supabase-cli-releaser[bot] Oct 29, 2026
bff634c
fix(cli): let `link` work without secret key access (CLI-2274, CLI-26…
7ttp Oct 29, 2026
b0f1016
feat(config): publish the config schemas as draft-07 under supabase.c…
Coly010 Oct 29, 2026
097b7f2
feat(stack): add the remaining gateway routes and forwarded headers (…
7ttp Oct 29, 2026
96781a4
ci(cli): authenticate mirror detect job to ECR Public (#7390)
avallete Oct 29, 2026
fd2e017
fix(cli): recover start and db start from a stopped database containe…
Coly010 Oct 29, 2026
f8bcf89
ci(cli): add a report-only CLI benchmark for pull requests (#7363)
Prashansa-K Oct 29, 2026
4834c89
chore(stack): bump postgres to 15.19.0.011-r0 (#7392)
supabase-cli-releaser[bot] Oct 29, 2026
6bcada7
chore(stack): bump postgres to 17.11.0.011-r0 (#7391)
supabase-cli-releaser[bot] Oct 29, 2026
3a9e1fb
chore(stack): add postgres 17.11.0.011-orioledb-r0 (#7393)
supabase-cli-releaser[bot] Oct 29, 2026
b73be06
fix(cli): lint config-exposed schemas in local db advisors (CLI-2824)…
mdonnalley Oct 29, 2026
7c6505f
Merge remote-tracking branch 'origin/next' into sync/develop-into-next
Coly010 Oct 29, 2026
74d4774
chore: sync API types from infrastructure (#7400)
supabase-cli-releaser[bot] Oct 29, 2026
56569b5
Merge remote-tracking branch 'origin/next' into sync/develop-into-next
github-actions[bot] Oct 29, 2026
60bb734
chore(repo): fix the develop-into-next merge
github-actions[bot] Oct 29, 2026
c7e287b
chore(repo): repair the develop-into-next sync
github-actions[bot] Oct 29, 2026
bcd3ec9
fix(cli): stop `db reset` failing at random (CLI-2312, CLI-2563) (#7380)
7ttp Oct 29, 2026
db33a57
test(cli): confirm consent-gated commands in live tests
Coly010 Oct 29, 2026
465b1d8
chore(repo): merge develop into sync/develop-into-next
Coly010 Oct 29, 2026
1d2231e
ci(release): run post-publish jobs on beta and next releases (#7404)
Coly010 Oct 29, 2026
7145e41
chore(stack): bump realtime to v2.150.0-r0 (#7399)
supabase-cli-releaser[bot] Oct 29, 2026
e0279ec
chore(stack): bump realtime to v2.150.1-r0 (#7406)
supabase-cli-releaser[bot] Oct 30, 2026
c13428e
fix(cli): serialize local start and stop per project (CLI-2875) (#7372)
jgoux Oct 30, 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: 1 addition & 1 deletion .bun-version
Original file line number Diff line number Diff line change
@@ -1 +1 @@
1.4.2
1.4.4
21 changes: 7 additions & 14 deletions .gitattributes
Original file line number Diff line number Diff line change
Expand Up @@ -14,28 +14,21 @@ apps/cli/src/shared/telemetry/__fixtures__/error-tags.txt text eol=lf
# statistics and collapses them in pull request diffs -- they are build output to
# be regenerated, not code to review, and together they outweigh the hand-written
# source. The attribute is GitHub-only: git, CI, and local diffs are unaffected.
# Collapsed is not hidden. v1-openapi.yaml and the lockfiles do carry changes
# worth reading -- an upstream API change, a dependency substitution -- and both
# stay one click away in review.
# Regeneration is owned by `go generate` in apps/cli-go and by the `generate`
# turbo task, whose `outputs` in turbo.json are the source of truth for this list.
# Only the generated files are listed, not their hand-written inputs
# (pkg/api/*.cfg.yaml, api/overlay.yaml). apps/docs/content/docs/commands/ is
# generated too but gitignored, so it needs no entry.
apps/cli-go/api/v1-openapi.yaml linguist-generated=true
apps/cli-go/pkg/api/*.gen.go linguist-generated=true
# Collapsed is not hidden. The lockfile does carry changes worth reading --
# a dependency substitution -- and stays one click away in review.
# Regeneration is owned by the `generate` turbo task, whose `outputs` in
# turbo.json are the source of truth for this list. Only the generated files
# are listed, not their hand-written inputs. apps/docs/content/docs/commands/
# is generated too but gitignored, so it needs no entry.
packages/api/src/generated/* linguist-generated=true
packages/api/scripts/openapi-source.json linguist-generated=true
packages/stack/src/functions/generated/* text eol=lf linguist-generated=true
apps/cli/src/shared/feedback/database.types.ts linguist-generated=true
apps/docs/public/cli/config.schema.json linguist-generated=true
apps/docs/public/cli/project-config.schema.json linguist-generated=true
apps/docs/public/cli/supabase-lock/v1.schema.json linguist-generated=true
apps/docs/public/schemas/** linguist-generated=true

# Lockfiles. Collapsed rather than hidden -- a dependency change is still one
# click away in review, which is the same treatment GitHub gives package-lock.json.
pnpm-lock.yaml linguist-generated=true
apps/cli-go/go.sum linguist-generated=true

# Not a language marker -- this is the service image manifest, not a container build.
apps/cli/src/shared/services/Dockerfile linguist-detectable=false
7 changes: 0 additions & 7 deletions .github/CODEOWNERS
Original file line number Diff line number Diff line change
Expand Up @@ -10,15 +10,8 @@
/tools/*/package.json @supabase/cli @supabase-oss
/pnpm-lock.yaml @supabase/cli @supabase-oss
/pnpm-workspace.yaml @supabase/cli @supabase-oss
/apps/cli-go/go.mod @supabase/cli @supabase-oss
/apps/cli-go/go.sum @supabase/cli @supabase-oss
/apps/cli-go/pkg/go.mod @supabase/cli @supabase-oss
/apps/cli-go/pkg/go.sum @supabase/cli @supabase-oss
/apps/cli/src/shared/services/Dockerfile @supabase/cli @supabase-oss
/apps/cli-go/pkg/config/templates/Dockerfile @supabase/cli @supabase-oss
/packages/stack/src/Artifacts.ts @supabase/cli @supabase-oss
/apps/cli-go/api/v1-openapi.yaml @supabase/cli @supabase-oss
/apps/cli-go/pkg/api/*.gen.go @supabase/cli @supabase-oss
/packages/api/src/generated/ @supabase/cli @supabase-oss
/packages/api/scripts/openapi-source.json @supabase/cli @supabase-oss

Expand Down
2 changes: 1 addition & 1 deletion .github/ISSUE_TEMPLATE/bug-report.yml
Original file line number Diff line number Diff line change
Expand Up @@ -107,7 +107,7 @@ body:
id: ticket-id
attributes:
label: Crash report ID
description: If the CLI printed one after rerunning with `--create-ticket`, paste the crash report ID.
description: If you have a crash report or support ticket ID, paste it here.
placeholder: ab1ac733e31e4f928a4d7c8402543712
validations:
required: false
Expand Down
48 changes: 3 additions & 45 deletions .github/actions/setup/action.yml
Original file line number Diff line number Diff line change
Expand Up @@ -14,16 +14,10 @@ inputs:
fails with a path validation error.
required: false
default: "true"
go-cache:
description: >-
Whether to restore the Go module and build caches. Disable this in jobs
that never run Go.
required: false
default: "true"
tools:
description: >-
Space-separated mise tools to install instead of every tool in
mise.toml. Skipping the Go toolchain keeps the restored mise cache small.
mise.toml.
required: false
default: ""
pnpm-store-cache:
Expand Down Expand Up @@ -126,11 +120,10 @@ runs:
commit: ${{ steps.sticky.outputs.commit }}

- name: Install toolchains
uses: jdx/mise-action@c2a87611a18de5b3828c5652fe268e992400cb5c # v4.3.0
uses: jdx/mise-action@8418fedb1110381a0d3ba51a7a415d7c1b884550 # v5.2.2
with:
version: 2026.9.0
version: 2026.10.17
install_args: ${{ inputs.tools }}
cache_key: ${{ inputs.tools != '' && format('mise-{0}-{1}-{2}-{3}', runner.os, runner.arch, inputs.tools, hashFiles('mise.toml', 'mise.lock', '.node-version', '.bun-version', 'package.json')) || '' }}

- name: Resolve pnpm store path
if: inputs.dependency-cache == 'true'
Expand Down Expand Up @@ -189,41 +182,6 @@ runs:
path: ${{ steps.pnpm-cache.outputs.path }}/lockfile-verified.jsonl
key: pnpm-verify-${{ runner.os }}-${{ inputs.dependency-firewall-token != '' && 'firewall' || 'public' }}-${{ hashFiles('pnpm-lock.yaml', 'pnpm-workspace.yaml') }}

- name: Resolve Go cache paths
if: inputs.dependency-cache == 'true' && inputs.go-cache == 'true'
id: go-cache
shell: bash
run: |
echo "mod=$(go env GOMODCACHE)" >> "$GITHUB_OUTPUT"
echo "build=$(go env GOCACHE)" >> "$GITHUB_OUTPUT"

- name: Mount Go module disk
if: inputs.dependency-cache == 'true' && inputs.go-cache == 'true' && steps.sticky.outputs.enabled == 'true'
uses: useblacksmith/stickydisk@b6cb58d1d31d6d32a25248fab12493d831f7bd48 # v1.7.2
with:
key: ${{ github.repository }}-go-mod-v3-${{ runner.arch }}
path: ${{ steps.go-cache.outputs.mod }}
commit: ${{ steps.sticky.outputs.commit }}

- name: Mount Go build disk
if: inputs.dependency-cache == 'true' && inputs.go-cache == 'true' && steps.sticky.outputs.enabled == 'true'
uses: useblacksmith/stickydisk@b6cb58d1d31d6d32a25248fab12493d831f7bd48 # v1.7.2
with:
key: ${{ github.repository }}-go-build-v3-${{ runner.arch }}
path: ${{ steps.go-cache.outputs.build }}
commit: ${{ steps.sticky.outputs.commit }}

- name: Configure Go dependency cache
if: inputs.dependency-cache == 'true' && inputs.go-cache == 'true' && steps.sticky.outputs.enabled != 'true'
uses: actions/cache@55cc8345863c7cc4c66a329aec7e433d2d1c52a9 # v6.1.0
with:
path: |
${{ steps.go-cache.outputs.mod }}
${{ steps.go-cache.outputs.build }}
key: go-cache-${{ runner.os }}-${{ runner.arch }}-${{ hashFiles('apps/cli-go/go.mod', 'apps/cli-go/go.sum') }}
restore-keys: |
go-cache-${{ runner.os }}-${{ runner.arch }}-

- name: Install dependencies
shell: bash
env:
Expand Down
22 changes: 0 additions & 22 deletions .github/dependabot.yml
Original file line number Diff line number Diff line change
Expand Up @@ -37,28 +37,6 @@ updates:
# — never bundle it into the actions-major group.
cooldown:
default-days: 7
- package-ecosystem: "gomod"
directories:
- "/apps/cli-go"
- "/apps/cli-go/pkg"
schedule:
interval: "cron"
cronjob: "0 0 * * *"
commit-message:
prefix: "chore(cli-go): "
groups:
go-minor:
update-types:
- minor
- patch
exclude-patterns:
- github.com/compose-spec/compose-go/v2
ignore:
- dependency-name: "github.com/compose-spec/compose-go/v2"
- dependency-name: "github.com/docker/cli"
- dependency-name: "github.com/docker/docker"
cooldown:
default-days: 7
- package-ecosystem: "npm"
directory: "/"
schedule:
Expand Down
10 changes: 9 additions & 1 deletion .github/jactionlint.yaml
Original file line number Diff line number Diff line change
@@ -1,4 +1,7 @@
require-commit-hash: true # actions, reusable workflows and docker:// must be pinned to a full SHA / @sha256 digest
rules:
missing-timeout: off
concurrency-limits: off
unpinned-uses: error # actions, reusable workflows and docker:// must be pinned to a full SHA / @sha256 digest
self-hosted-runner:
labels:
- arm-runner
Expand All @@ -8,3 +11,8 @@ self-hosted-runner:
- blacksmith-8vcpu-ubuntu-2404
- blacksmith-8vcpu-windows-2025
- blacksmith-32vcpu-ubuntu-2404
paths:
# Other projects' repositories, pulled in as git submodules. CI never checks them out.
".repos/**":
ignore:
- ".*"
3 changes: 1 addition & 2 deletions .github/scripts/ai-review/resolve.ts
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@
*
* `resolveDecision` is the pure orchestration function (I/O injected) a test
* can drive without the network; `main()` wires up the real GitHub I/O,
* writes `should_run`/`pr_number`/`head_ref`/`trigger` to `$GITHUB_OUTPUT`,
* writes `should_run`/`pr_number`/`head_sha`/`trigger` to `$GITHUB_OUTPUT`,
* and surfaces the skip reason (if any) in `$GITHUB_STEP_SUMMARY`.
*
* Run in CI as: `bun .github/scripts/ai-review/resolve.ts`.
Expand Down Expand Up @@ -374,7 +374,6 @@ function writeOutputs(result: ResolveResult, prNumber: number): void {
const entries: Record<string, string> = {
should_run: String(result.shouldRun),
pr_number: String(prNumber),
head_ref: `refs/pull/${prNumber}/head`,
head_sha: result.headSha ?? "",
trigger: result.trigger,
};
Expand Down
69 changes: 69 additions & 0 deletions .github/scripts/cli-bench/github.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,69 @@
/** Small GitHub REST helpers shared by the CLI benchmark scripts. */

export function requireEnv(name: string): string {
const value = process.env[name];
if (!value) throw new Error(`Missing required environment variable: ${name}`);
return value;
}

/** A GitHub request that did not succeed, with the HTTP status and GitHub's own message. */
export class GithubRequestError extends Error {
constructor(
readonly status: number,
readonly detail: string,
url: string,
) {
super(`GitHub request failed (${status}) for ${url}`);
this.name = "GithubRequestError";
}
}

export async function githubFetch(
url: string,
token: string,
init: RequestInit = {},
): Promise<Response> {
const response = await fetch(url, {
...init,
headers: {
Authorization: `Bearer ${token}`,
Accept: "application/vnd.github+json",
"X-GitHub-Api-Version": "2022-11-28",
"Content-Type": "application/json",
},
});
if (!response.ok) {
const payload = (await response.json().catch(() => ({}))) as { message?: unknown };
const detail = typeof payload.message === "string" ? payload.message : response.statusText;
throw new GithubRequestError(response.status, detail, url);
}
return response;
}

export interface IssueComment {
id: number;
body: string;
authorLogin: string;
}

/** Every comment on an issue or pull request, oldest first. */
export async function listIssueComments(
token: string,
base: string,
issue: number,
): Promise<Array<IssueComment>> {
const comments: Array<IssueComment> = [];
for (let page = 1; ; page++) {
const batch = (await (
await githubFetch(`${base}/issues/${issue}/comments?per_page=100&page=${page}`, token)
).json()) as Array<{ id: number; body: string | null; user: { login: string } | null }>;
comments.push(
...batch.map((entry) => ({
id: entry.id,
body: entry.body ?? "",
authorLogin: entry.user?.login ?? "",
})),
);
if (batch.length < 100) return comments;
}
}
114 changes: 114 additions & 0 deletions .github/scripts/cli-bench/history.test.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,114 @@
import { describe, expect, test } from "bun:test";
import {
decodeHistory,
headlineOf,
makeEntry,
MAX_PREVIOUS_RUNS,
mergeHistory,
renderHistory,
type RunEntry,
} from "./history.ts";

const entry = (n: number, overrides: Partial<RunEntry> = {}): RunEntry => ({
sha: n.toString(16).padStart(7, "0"),
at: "2026-10-28T09:05Z",
headline: "no changes found",
url: `https://github.com/o/r/actions/runs/${n}`,
...overrides,
});

describe("headlineOf", () => {
test("reads the title of the rendered report", () => {
expect(headlineOf("<!-- cli-bench:pr -->\n\n## CLI benchmark: 2 things to check\n\nbody")).toBe(
"2 things to check",
);
});

test("falls back when the report has no title", () => {
expect(headlineOf("nothing here")).toBe("unknown");
});
});

describe("makeEntry", () => {
test("shortens the commit and rounds the time down to the minute in UTC", () => {
const made = makeEntry({
sha: "0123456789abcdef0123456789abcdef01234567",
now: new Date("2026-10-28T09:05:59Z"),
headline: "no changes found",
url: "https://github.com/o/r/actions/runs/9/attempts/2",
});

expect(made).toMatchObject({ sha: "0123456", at: "2026-10-28T09:05Z" });
});

test("refuses a run link that is not a workflow run", () => {
const made = makeEntry({
sha: "abcdef1",
now: new Date(),
headline: "h",
url: "https://evil.test/x",
});

expect(made).toBeUndefined();
});
});

describe("mergeHistory", () => {
test("puts the new run first", () => {
expect(mergeHistory([entry(1)], entry(2)).map((e) => e.sha)).toEqual([
entry(2).sha,
entry(1).sha,
]);
});

test("keeps the current run plus at most 20 earlier ones, dropping the oldest", () => {
const previous = Array.from({ length: 30 }, (_, i) => entry(i + 1));

const merged = mergeHistory(previous, entry(100));

expect(merged).toHaveLength(MAX_PREVIOUS_RUNS + 1);
expect(merged[0]).toEqual(entry(100));
expect(merged.at(-1)).toEqual(entry(MAX_PREVIOUS_RUNS));
});
});

describe("renderHistory and decodeHistory", () => {
test("round-trips the entries through the hidden marker", () => {
const entries = [entry(3), entry(2), entry(1)];

expect(decodeHistory(`body\n${renderHistory(entries, (t) => t)}\n`)).toEqual(entries);
});

test("lists earlier runs newest first and leaves the current run out of the list", () => {
const rendered = renderHistory(
[entry(3), entry(2, { headline: "1 thing to check" })],
(t) => t,
);

expect(rendered).toContain("<summary>Previous runs</summary>");
expect(rendered).toContain(
"- `0000002` · 2026-10-28 09:05 UTC · 1 thing to check · [run](https://github.com/o/r/actions/runs/2)",
);
expect(rendered).not.toContain("0000003` ·");
});

test("shows no list for a first run", () => {
expect(renderHistory([entry(1)], (t) => t)).not.toContain("Previous runs");
});

test.each([
["no marker", "plain comment"],
["not base64 json", "<!-- cli-bench:history bm90IGpzb24= -->"],
["wrong shape", `<!-- cli-bench:history ${Buffer.from('[{"sha":1}]').toString("base64")} -->`],
[
"a forged run link",
`<!-- cli-bench:history ${Buffer.from(JSON.stringify([entry(1, { url: "https://evil.test/x" })])).toString("base64")} -->`,
],
[
"too many entries",
`<!-- cli-bench:history ${Buffer.from(JSON.stringify(Array.from({ length: 22 }, (_, i) => entry(i + 1)))).toString("base64")} -->`,
],
])("treats %s as empty history", (_name, body) => {
expect(decodeHistory(body)).toEqual([]);
});
});
Loading
Loading