Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
28 commits
Select commit Hold shift + click to select a range
2a4ea2a
Fix task-queue config set help: use real fairness weight flag names (…
jpvotta May 29, 2026
12655a4
VLN-1354: pin and bump GitHub Actions to latest versions (#1054)
picatz May 29, 2026
6692b61
Bump golang.org/x/mod from 0.35.0 to 0.36.0 (#1052)
dependabot[bot] May 30, 2026
5380e71
Add temporal schedule list-matching-times command …
NasitSony May 30, 2026
90f1364
Remove time.Sleep() in commands.taskqueue_test.go (#1020)
hussam-salah May 30, 2026
f015ce2
Add persistence info to start-dev banner (#1033)
SAY-5 May 30, 2026
7e5ba38
fix: skip CountWorkflow in batch operations when --yes is set (#1012)
bitalizer May 31, 2026
a10f9ae
Unwrap System Nexus Operations in event history (#1017)
spkane31 Jun 2, 2026
8bb57b7
fix: use allow instead of ignore for dependency-type in dependabot co…
chaptersix Jun 2, 2026
dd0524a
Bump the github-actions group with 2 updates (#1080)
dependabot[bot] Jun 3, 2026
2ae37a3
Prefix dev server cluster ID with 'dev-server-' (#1059)
NasitSony Jun 4, 2026
e20ca61
feat: auto-generate deprecation warnings from YAML config (#941)
chaptersix Jun 4, 2026
67af3a2
Add support for Standalone Nexus Operations (#1046)
Quinn-With-Two-Ns Jun 5, 2026
700a87d
worker deployment update-version-compute-config (#1001)
jaypipes Jun 10, 2026
bc18772
Address Nexus Operation command issues (#1087)
Quinn-With-Two-Ns Jun 11, 2026
ad24393
prevent create of "empty" WorkerDeploymentVersions (#1091)
jaypipes Jun 15, 2026
79e9f8f
fix: tls is not added for profiles without tls (#1089)
spkane31 Jun 15, 2026
3d715e2
Add client-authority support to config profile settings (#1084)
NasitSony Jun 16, 2026
4f5bb7c
Bump google.golang.org/grpc from 1.80.0 to 1.81.1 (#1063)
dependabot[bot] Jun 22, 2026
8c3e3b2
Clarify activity pause timeout behavior (#1099)
JLDLaughlin Jun 25, 2026
b2ee8a2
Add one-time move versioning override CLI support (#1093)
Shivs11 Jul 6, 2026
655910e
Bump ui-server to v2.50.1 (#1109)
Alex-Tideman Jul 6, 2026
f2a7159
Add option to disable newsfeed in UI (#1110)
tomwheeler Jul 7, 2026
a38333d
ci/docs: escape MDX-incompatible patterns and add -subdir to gen-docs…
chaptersix Jul 8, 2026
4262ffb
Bump UI server v2.52.0 (#1117)
Quinn-With-Two-Ns Jul 9, 2026
99eb050
When delegating to an extension, exit with the same code the extensio…
jeri-temporal Jul 9, 2026
8270cfc
Fix SANO operation list description (#1119)
Quinn-With-Two-Ns Jul 10, 2026
9bcd5dc
ci: run required checks for merge groups
chaptersix Jul 11, 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
4 changes: 2 additions & 2 deletions .github/dependabot.yml
Original file line number Diff line number Diff line change
Expand Up @@ -6,9 +6,9 @@ updates:
interval: weekly
cooldown:
default-days: 14
allow:
- dependency-type: direct
ignore:
- dependency-name: "*"
dependency-type: indirect
# Temporal dependencies are managed manually to ensure coordinated upgrades across all temporal packages
- dependency-name: "go.temporal.io/*"

Expand Down
10 changes: 5 additions & 5 deletions .github/workflows/build-and-publish-docker.yml
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@ jobs:
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v6
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
with:
persist-credentials: false

Expand All @@ -36,7 +36,7 @@ jobs:
env:
INPUT_VERSION: ${{ inputs.version }}
INPUT_TAG_LATEST: ${{ inputs.tag_latest }}
uses: actions/github-script@v8
uses: actions/github-script@3a2844b7e9c422d3c10d287c895573f7108da1b3 # v9.0.0
with:
script: |
const inputVersion = process.env.INPUT_VERSION;
Expand Down Expand Up @@ -82,14 +82,14 @@ jobs:
ls -lh dist/arm64/temporal

- name: Set up QEMU
uses: docker/setup-qemu-action@v3
uses: docker/setup-qemu-action@06116385d9baf250c9f4dcb4858b16962ea869c3 # v4.1.0

- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v3
uses: docker/setup-buildx-action@d7f5e7f509e45cec5c76c4d5afdd7de93d0b3df5 # v4.1.0

- name: Log in to Docker Hub
if: inputs.publish
uses: docker/login-action@v3
uses: docker/login-action@650006c6eb7dba73a995cc03b0b2d7f5ca915bee # v4.2.0
with:
username: ${{ secrets.DOCKER_USERNAME }}
password: ${{ secrets.DOCKER_PASSWORD }}
Expand Down
18 changes: 10 additions & 8 deletions .github/workflows/ci.yaml
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
name: Continuous Integration
on:
pull_request:
merge_group:
types: [checks_requested]
push:
branches:
- main
Expand All @@ -12,14 +14,14 @@ permissions:
jobs:
validate-server-version:
name: Validate Server Version
if: github.event_name == 'push' || github.base_ref == 'main'
if: github.event_name == 'push' || github.event_name == 'merge_group' || github.base_ref == 'main'
runs-on: ubuntu-latest
steps:
- name: Checkout repository
uses: actions/checkout@v4
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2

- name: Setup Go
uses: actions/setup-go@v5
uses: actions/setup-go@4a3601121dd01d1626a1e23e37211e3254c1c06c # v6.4.0
with:
go-version-file: go.mod

Expand Down Expand Up @@ -53,12 +55,12 @@ jobs:
HAS_SECRETS: ${{ secrets.TEMPORAL_CLIENT_CERT != '' && secrets.TEMPORAL_CLIENT_KEY != '' }}
steps:
- name: Checkout repository
uses: actions/checkout@v4
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
with:
submodules: recursive

- name: Setup Go
uses: actions/setup-go@v5
uses: actions/setup-go@4a3601121dd01d1626a1e23e37211e3254c1c06c # v6.4.0
with:
go-version-file: go.mod

Expand All @@ -72,7 +74,7 @@ jobs:
run: gotestsum --junitfile junit-xml/${{matrix.os}}.xml -- ./...

- name: Upload junit-xml artifacts
uses: actions/upload-artifact@v7
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
if: always()
with:
name: junit-xml--${{github.run_id}}--${{github.run_attempt}}--${{matrix.os}}
Expand Down Expand Up @@ -108,7 +110,7 @@ jobs:
- name: Test cloud API key env var
if: ${{ matrix.cloudTestTarget && env.HAS_SECRETS == 'true' }}
env:
TEMPORAL_ADDRESS: us-east-1.aws.api.temporal.io:7233
TEMPORAL_ADDRESS: ca-central-1.aws.api.temporal.io:7233
TEMPORAL_NAMESPACE: ${{ vars.TEMPORAL_CLIENT_NAMESPACE }}
TEMPORAL_API_KEY: ${{ secrets.TEMPORAL_CLIENT_CLOUD_API_KEY }}
shell: bash
Expand All @@ -117,7 +119,7 @@ jobs:
- name: Test cloud API key arg
if: ${{ matrix.cloudTestTarget && env.HAS_SECRETS == 'true' }}
env:
TEMPORAL_ADDRESS: us-east-1.aws.api.temporal.io:7233
TEMPORAL_ADDRESS: ca-central-1.aws.api.temporal.io:7233
TEMPORAL_NAMESPACE: ${{ vars.TEMPORAL_CLIENT_NAMESPACE }}
shell: bash
run: go run ./cmd/temporal workflow list --limit 2 --api-key ${{ secrets.TEMPORAL_CLIENT_CLOUD_API_KEY }}
6 changes: 4 additions & 2 deletions .github/workflows/govulncheck.yml
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,8 @@ name: Govulncheck

on:
pull_request:
merge_group:
types: [checks_requested]

permissions:
contents: read
Expand All @@ -11,8 +13,8 @@ jobs:
name: Govulncheck
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v6
- uses: actions/setup-go@v6
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
- uses: actions/setup-go@4a3601121dd01d1626a1e23e37211e3254c1c06c # v6.4.0
with:
go-version-file: go.mod
- uses: temporalio/public-actions/golang/govulncheck@main
6 changes: 3 additions & 3 deletions .github/workflows/release.yml
Original file line number Diff line number Diff line change
Expand Up @@ -15,12 +15,12 @@ jobs:
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v6
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
with:
fetch-depth: 0

- name: Set up Go
uses: actions/setup-go@v6
uses: actions/setup-go@4a3601121dd01d1626a1e23e37211e3254c1c06c # v6.4.0
with:
go-version-file: "go.mod"
check-latest: true
Expand All @@ -47,7 +47,7 @@ jobs:
run: echo "go=$(go version | cut -d ' ' -f 3)" >> "$GITHUB_OUTPUT"

- name: Run GoReleaser
uses: goreleaser/goreleaser-action@v6
uses: goreleaser/goreleaser-action@5daf1e915a5f0af01ddbcd89a43b8061ff4f1a89 # v7.2.2
with:
version: v2.12.7
args: release
Expand Down
2 changes: 1 addition & 1 deletion .github/workflows/trigger-docs.yml
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,7 @@ jobs:

- name: Generate token
id: generate_token
uses: actions/create-github-app-token@v2
uses: actions/create-github-app-token@bcd2ba49218906704ab6c1aa796996da409d3eb1 # v3.2.0
with:
app-id: ${{ secrets.TEMPORAL_CICD_APP_ID }}
private-key: ${{ secrets.TEMPORAL_CICD_PRIVATE_KEY }}
Expand Down
29 changes: 29 additions & 0 deletions .github/workflows/validate-dependabot.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
name: Validate Dependabot Config
on:
pull_request:
paths:
- '.github/dependabot.yml'
push:
branches:
- main
paths:
- '.github/dependabot.yml'

permissions:
contents: read

jobs:
validate:
name: Validate Dependabot Config
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6

- uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405 # v6
with:
python-version: '3.12'

- name: Validate dependabot.yml
run: |
pip install check-jsonschema==0.37.2
check-jsonschema --builtin-schema vendor.dependabot .github/dependabot.yml
33 changes: 22 additions & 11 deletions cliext/client.go
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,11 @@ type ClientOptionsBuilder struct {
// Logger is the slog logger to use for the client. If set, it will be
// wrapped with the SDK's structured logger adapter.
Logger *slog.Logger

// PayloadCodec is populated by Build when a remote payload codec is
// configured. Callers can use it to decode payloads outside the gRPC
// interceptor chain (e.g. payloads nested inside opaque proto bytes).
PayloadCodec converter.PayloadCodec
}

type oauthCredentials struct {
Expand Down Expand Up @@ -127,6 +132,11 @@ func (b *ClientOptionsBuilder) Build(ctx context.Context) (client.Options, error
profile.APIKey = cfg.ApiKey
}

// Set client authority on profile if provided
if cfg.ClientAuthority != "" {
profile.Authority = cfg.ClientAuthority
}

// Handle gRPC metadata from flags.
if len(cfg.GrpcMeta) > 0 {
grpcMetaFromArg, err := parseKeyValuePairs(cfg.GrpcMeta)
Expand Down Expand Up @@ -248,13 +258,18 @@ func (b *ClientOptionsBuilder) Build(ctx context.Context) (client.Options, error
if err != nil {
return client.Options{}, fmt.Errorf("invalid codec headers: %w", err)
}
interceptor, err := newPayloadCodecInterceptor(
payloadCodec := newRemotePayloadCodec(
profile.Namespace, profile.Codec.Endpoint, profile.Codec.Auth, codecHeaders)
interceptor, err := converter.NewPayloadCodecGRPCClientInterceptor(
converter.PayloadCodecGRPCClientInterceptorOptions{
Codecs: []converter.PayloadCodec{payloadCodec},
})
if err != nil {
return client.Options{}, fmt.Errorf("failed creating payload codec interceptor: %w", err)
}
clientOpts.ConnectionOptions.DialOptions = append(
clientOpts.ConnectionOptions.DialOptions, grpc.WithChainUnaryInterceptor(interceptor))
b.PayloadCodec = payloadCodec
}

// Set connect timeout for GetSystemInfo if provided.
Expand All @@ -278,16 +293,17 @@ func parseKeyValuePairs(pairs []string) (map[string]string, error) {
return result, nil
}

// newPayloadCodecInterceptor creates a gRPC interceptor for remote payload codec.
func newPayloadCodecInterceptor(
// newRemotePayloadCodec constructs a remote payload codec from the configured endpoint,
// auth, and headers. The returned codec can be used both inside a gRPC interceptor and
// to decode payloads nested inside opaque proto bytes (e.g. system Nexus operation inputs).
func newRemotePayloadCodec(
namespace string,
codecEndpoint string,
codecAuth string,
codecHeaders map[string]string,
) (grpc.UnaryClientInterceptor, error) {
) converter.PayloadCodec {
codecEndpoint = strings.ReplaceAll(codecEndpoint, "{namespace}", namespace)

payloadCodec := converter.NewRemotePayloadCodec(
return converter.NewRemotePayloadCodec(
converter.RemotePayloadCodecOptions{
Endpoint: codecEndpoint,
ModifyRequest: func(req *http.Request) error {
Expand All @@ -302,11 +318,6 @@ func newPayloadCodecInterceptor(
},
},
)
return converter.NewPayloadCodecGRPCClientInterceptor(
converter.PayloadCodecGRPCClientInterceptorOptions{
Codecs: []converter.PayloadCodec{payloadCodec},
},
)
}

func (c *oauthCredentials) getToken(ctx context.Context) (string, error) {
Expand Down
6 changes: 1 addition & 5 deletions cliext/config.oauth.go
Original file line number Diff line number Diff line change
Expand Up @@ -141,11 +141,7 @@ func resolveConfigAndProfile(configFilePath, profileName string, envLookup envco
configFilePath, _ = envLookup.LookupEnv("TEMPORAL_CONFIG_FILE")
}
if configFilePath == "" {
var err error
configFilePath, err = envconfig.DefaultConfigFilePath()
if err != nil {
return "", "", fmt.Errorf("failed to get default config path: %w", err)
}
configFilePath = envconfig.DefaultConfigFilePath()
}

// Resolve profile name.
Expand Down
12 changes: 10 additions & 2 deletions cmd/gen-docs/main.go
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,8 @@ import (
"github.com/temporalio/cli/internal/commandsgen"
)

// stringSlice implements flag.Value to support multiple -input flags
// stringSlice implements flag.Value to support flags that may be specified
// multiple times (e.g. -input, -subdir).
type stringSlice []string

func (s *stringSlice) String() string {
Expand All @@ -32,10 +33,12 @@ func run() error {
var (
outputDir string
inputFiles stringSlice
subdirs stringSlice
)

flag.Var(&inputFiles, "input", "Input YAML file (can be specified multiple times)")
flag.StringVar(&outputDir, "output", ".", "Output directory for docs")
flag.Var(&subdirs, "subdir", "Write the subcommands of this command into a subdirectory of separate files instead of a single file (can be specified multiple times)")
flag.Parse()

if len(inputFiles) == 0 {
Expand All @@ -60,13 +63,18 @@ func run() error {
return fmt.Errorf("failed parsing YAML: %w", err)
}

docs, err := commandsgen.GenerateDocsFiles(cmds)
docs, err := commandsgen.GenerateDocsFiles(cmds, subdirs)
if err != nil {
return fmt.Errorf("failed generating docs: %w", err)
}

for filename, content := range docs {
filePath := filepath.Join(outputDir, filename+".mdx")
// Filenames may contain a path separator (e.g. "cloud/namespace") when
// -subdir is used, so ensure the parent directory exists.
if err := os.MkdirAll(filepath.Dir(filePath), 0755); err != nil {
return fmt.Errorf("failed creating directory for %s: %w", filePath, err)
}
if err := os.WriteFile(filePath, content, 0644); err != nil {
return fmt.Errorf("failed writing %s: %w", filePath, err)
}
Expand Down
Loading
Loading