[PR #767] [MERGED] Audit issues #759-#765 and implement high-value CLI changes #772

Closed
opened 2026-02-26 22:32:29 +03:00 by kerem · 0 comments
Owner

📋 Pull Request Information

Original PR: https://github.com/rudrankriyam/App-Store-Connect-CLI/pull/767
Author: @rudrankriyam
Created: 2/25/2026
Status: Merged
Merged: 2/25/2026
Merged by: @rudrankriyam

Base: mainHead: cursor/issues-759-765-audit-5401


📝 Commits (2)

  • f79d463 Implement and audit issues 759-765 CLI enhancements
  • 2ea528c fix live build/test-notes regressions in 759-765 audit branch

📊 Changes

28 files changed (+2093 additions, -46 deletions)

View changed files

📝 internal/asc/client_builds.go (+9 -2)
📝 internal/asc/client_http_test.go (+66 -0)
📝 internal/asc/client_options.go (+20 -0)
📝 internal/asc/client_publish.go (+2 -0)
📝 internal/asc/client_publish_test.go (+31 -0)
📝 internal/asc/client_queries.go (+2 -0)
📝 internal/asc/client_test.go (+22 -0)
📝 internal/asc/publish.go (+1 -0)
📝 internal/cli/betabuildlocalizations/beta_build_localizations.go (+14 -4)
📝 internal/cli/betabuildlocalizations/beta_build_localizations_test.go (+19 -1)
📝 internal/cli/builds/build_test_notes.go (+12 -4)
📝 internal/cli/builds/builds.go (+91 -7)
📝 internal/cli/builds/builds_commands.go (+59 -0)
📝 internal/cli/builds/builds_commands_test.go (+78 -0)
internal/cli/builds/builds_find.go (+70 -0)
📝 internal/cli/builds/builds_group_resolver_test.go (+36 -0)
internal/cli/builds/builds_wait.go (+215 -0)
internal/cli/cmdtest/beta_build_localizations_upsert_test.go (+160 -0)
internal/cli/cmdtest/builds_add_groups_internal_test.go (+224 -0)
internal/cli/cmdtest/builds_find_test.go (+123 -0)

...and 8 more files

📄 Description

Summary

This PR audits issues #759-#765 and implements all high-value items in one pass.

Issue-by-issue outcome

  • #759 implemented: asc builds list --processing-state (VALID|PROCESSING|FAILED|INVALID|all) with API filter wiring.
  • #760 implemented: new asc builds wait subcommand (wait by --build or --app + --build-number, timeout/poll/terminal states).
  • #761 implemented: asc builds add-groups --skip-internal, improved actionable internal-group errors, safe no-op when only internal groups are provided.
  • ℹ️ #762 no code change: already closed as not planned with owner rationale.
  • #763 implemented: asc beta-build-localizations create --upsert using existing shared upsert logic.
  • #764 implemented: new asc builds find --app --build-number [--platform].
  • #765 implemented: asc publish testflight supports existing-build flows via --build / --build-number (skip upload), with mode validation and preserved wait/test-notes/group/notify flow.

Design/architecture notes

  • Kept command taxonomy under existing groups (builds, publish, beta-build-localizations).
  • Validated new API-facing filters against OpenAPI (filter[processingState], filter[preReleaseVersion.platform]).
  • Preserved backward compatibility for existing upload path in publish testflight.
  • Added usage validation for all new flags/modes with exit code 2 semantics.

Testing

Local automated

  • ASC_BYPASS_KEYCHAIN=1 go test ./internal/asc -run 'TestBuildBuildsQuery_WithProcessingStates|TestGetBuilds_WithProcessingStateFilter|TestBuildBuildsQuery_WithPreReleasePlatforms|TestGetBuilds_WithPreReleasePlatforms'
  • ASC_BYPASS_KEYCHAIN=1 go test ./internal/cli/builds -run 'TestBuildsListCommand_ProcessingStateFlagDescription|TestNormalizeBuildProcessingStateFilter|TestResolveBuildBetaGroupsFromListIncludesInternalMetadata'
  • ASC_BYPASS_KEYCHAIN=1 go test ./internal/cli/betabuildlocalizations -run 'TestBetaBuildLocalizationsCommandConstructors|TestBetaBuildLocalizationsCreateCommandUpsertFlag'
  • ASC_BYPASS_KEYCHAIN=1 go test ./internal/cli/publish -run 'TestValidateIPAPathRejectsSymlink|TestValidateIPAPathAllowsRegularFile'
  • ASC_BYPASS_KEYCHAIN=1 go test ./internal/cli/cmdtest -run 'TestBuildsListProcessingStateFilterUsesTopLevelBuildsEndpoint|TestBuildsListProcessingStateAllExpandsToAllStates|TestBuildsListProcessingStateInvalidValueReturnsUsageError|TestBuildsWaitByBuildIDPollsUntilValid|TestBuildsWaitByAppAndBuildNumberResolvesThenWaits|TestBuildsWaitFailOnInvalidReturnsError|TestBuildsAddGroupsInternalGroupReturnsActionableError|TestBuildsAddGroupsSkipInternalAddsOnlyExternalGroups|TestBuildsAddGroupsSkipInternalWithOnlyInternalGroupsIsNoOp|TestBetaBuildLocalizationsCreateUpsertUpdatesExistingLocale|TestBetaBuildLocalizationsCreateUpsertCreatesWhenLocaleMissing|TestBuildsFindByBuildNumberSuccess|TestBuildsFindByBuildNumberNotFound|TestPublishTestflightExistingBuildIDSkipsUpload|TestPublishTestflightExistingBuildNumberResolvesAndWaits|TestPublishValidationErrors|TestBuildsWaitValidationErrors|TestBuildsFindValidationErrors|TestRun_UsageValidationErrorsReturnExitUsage'
  • PATH="$(go env GOPATH)/bin:$PATH" make format
  • PATH="$(go env GOPATH)/bin:$PATH" make lint (falls back to go vet if golangci-lint is unavailable)
  • PATH="$(go env GOPATH)/bin:$PATH" ASC_BYPASS_KEYCHAIN=1 make test

Built-binary exit behavior

  • go build -o /tmp/asc .
  • /tmp/asc builds list --app APP_123 --processing-state WRONG (exit code 2)
  • /tmp/asc builds wait (exit code 2)
  • /tmp/asc publish testflight --app APP_123 --group GROUP_ID (exit code 2)

Live smoke tests with ASC credentials

Read-only / low-risk live checks were run for new flows:

  • builds list --processing-state all|PROCESSING
  • builds find
  • builds wait
  • builds add-groups internal-group hint + --skip-internal no-op
  • publish testflight --build and --build-number with API debug logs verifying upload endpoints are skipped

Alternatives considered

  • Reusing shared/findBuildByNumber from shared/build_wait.go directly for builds find/publish --build-number.
    • Not possible as-is because it is unexported and tightly coupled to pre-release-version lookup assumptions.
    • Chosen approach uses supported /v1/builds server-side filters with platform + processing-state, reducing API round-trips and ambiguity.
  • Adding a global raw API passthrough for #762 in this PR.
    • Rejected since issue is already closed/not planned and outside this scoped audit’s accepted value set.

Expected invocation examples

  • asc builds list --app "$ASC_APP_ID" --processing-state all
  • asc builds wait --app "$ASC_APP_ID" --build-number "312" --platform IOS
  • asc builds add-groups --build BUILD_ID --group INTERNAL,EXTERNAL --skip-internal
  • asc beta-build-localizations create --build BUILD_ID --locale en-US --whats-new "notes" --upsert
  • asc builds find --app "$ASC_APP_ID" --build-number "312" --platform IOS
  • asc publish testflight --app "$ASC_APP_ID" --build BUILD_ID --group GROUP_ID --wait
  • asc publish testflight --app "$ASC_APP_ID" --build-number 312 --group GROUP_ID --wait

Closes #759
Closes #760
Closes #761
Closes #763
Closes #764
Closes #765


🔄 This issue represents a GitHub Pull Request. It cannot be merged through Gitea due to API limitations.

## 📋 Pull Request Information **Original PR:** https://github.com/rudrankriyam/App-Store-Connect-CLI/pull/767 **Author:** [@rudrankriyam](https://github.com/rudrankriyam) **Created:** 2/25/2026 **Status:** ✅ Merged **Merged:** 2/25/2026 **Merged by:** [@rudrankriyam](https://github.com/rudrankriyam) **Base:** `main` ← **Head:** `cursor/issues-759-765-audit-5401` --- ### 📝 Commits (2) - [`f79d463`](https://github.com/rudrankriyam/App-Store-Connect-CLI/commit/f79d463956aa814092fc6faf1fc577b92f895f01) Implement and audit issues 759-765 CLI enhancements - [`2ea528c`](https://github.com/rudrankriyam/App-Store-Connect-CLI/commit/2ea528ca85f480908146c010d7e4b84e587d6a62) fix live build/test-notes regressions in 759-765 audit branch ### 📊 Changes **28 files changed** (+2093 additions, -46 deletions) <details> <summary>View changed files</summary> 📝 `internal/asc/client_builds.go` (+9 -2) 📝 `internal/asc/client_http_test.go` (+66 -0) 📝 `internal/asc/client_options.go` (+20 -0) 📝 `internal/asc/client_publish.go` (+2 -0) 📝 `internal/asc/client_publish_test.go` (+31 -0) 📝 `internal/asc/client_queries.go` (+2 -0) 📝 `internal/asc/client_test.go` (+22 -0) 📝 `internal/asc/publish.go` (+1 -0) 📝 `internal/cli/betabuildlocalizations/beta_build_localizations.go` (+14 -4) 📝 `internal/cli/betabuildlocalizations/beta_build_localizations_test.go` (+19 -1) 📝 `internal/cli/builds/build_test_notes.go` (+12 -4) 📝 `internal/cli/builds/builds.go` (+91 -7) 📝 `internal/cli/builds/builds_commands.go` (+59 -0) 📝 `internal/cli/builds/builds_commands_test.go` (+78 -0) ➕ `internal/cli/builds/builds_find.go` (+70 -0) 📝 `internal/cli/builds/builds_group_resolver_test.go` (+36 -0) ➕ `internal/cli/builds/builds_wait.go` (+215 -0) ➕ `internal/cli/cmdtest/beta_build_localizations_upsert_test.go` (+160 -0) ➕ `internal/cli/cmdtest/builds_add_groups_internal_test.go` (+224 -0) ➕ `internal/cli/cmdtest/builds_find_test.go` (+123 -0) _...and 8 more files_ </details> ### 📄 Description ## Summary This PR audits issues #759-#765 and implements all high-value items in one pass. ### Issue-by-issue outcome - ✅ #759 implemented: `asc builds list --processing-state` (`VALID|PROCESSING|FAILED|INVALID|all`) with API filter wiring. - ✅ #760 implemented: new `asc builds wait` subcommand (wait by `--build` or `--app` + `--build-number`, timeout/poll/terminal states). - ✅ #761 implemented: `asc builds add-groups --skip-internal`, improved actionable internal-group errors, safe no-op when only internal groups are provided. - ℹ️ #762 no code change: already closed as `not planned` with owner rationale. - ✅ #763 implemented: `asc beta-build-localizations create --upsert` using existing shared upsert logic. - ✅ #764 implemented: new `asc builds find --app --build-number [--platform]`. - ✅ #765 implemented: `asc publish testflight` supports existing-build flows via `--build` / `--build-number` (skip upload), with mode validation and preserved wait/test-notes/group/notify flow. ## Design/architecture notes - Kept command taxonomy under existing groups (`builds`, `publish`, `beta-build-localizations`). - Validated new API-facing filters against OpenAPI (`filter[processingState]`, `filter[preReleaseVersion.platform]`). - Preserved backward compatibility for existing upload path in `publish testflight`. - Added usage validation for all new flags/modes with exit code `2` semantics. ## Testing ### Local automated - `ASC_BYPASS_KEYCHAIN=1 go test ./internal/asc -run 'TestBuildBuildsQuery_WithProcessingStates|TestGetBuilds_WithProcessingStateFilter|TestBuildBuildsQuery_WithPreReleasePlatforms|TestGetBuilds_WithPreReleasePlatforms'` - `ASC_BYPASS_KEYCHAIN=1 go test ./internal/cli/builds -run 'TestBuildsListCommand_ProcessingStateFlagDescription|TestNormalizeBuildProcessingStateFilter|TestResolveBuildBetaGroupsFromListIncludesInternalMetadata'` - `ASC_BYPASS_KEYCHAIN=1 go test ./internal/cli/betabuildlocalizations -run 'TestBetaBuildLocalizationsCommandConstructors|TestBetaBuildLocalizationsCreateCommandUpsertFlag'` - `ASC_BYPASS_KEYCHAIN=1 go test ./internal/cli/publish -run 'TestValidateIPAPathRejectsSymlink|TestValidateIPAPathAllowsRegularFile'` - `ASC_BYPASS_KEYCHAIN=1 go test ./internal/cli/cmdtest -run 'TestBuildsListProcessingStateFilterUsesTopLevelBuildsEndpoint|TestBuildsListProcessingStateAllExpandsToAllStates|TestBuildsListProcessingStateInvalidValueReturnsUsageError|TestBuildsWaitByBuildIDPollsUntilValid|TestBuildsWaitByAppAndBuildNumberResolvesThenWaits|TestBuildsWaitFailOnInvalidReturnsError|TestBuildsAddGroupsInternalGroupReturnsActionableError|TestBuildsAddGroupsSkipInternalAddsOnlyExternalGroups|TestBuildsAddGroupsSkipInternalWithOnlyInternalGroupsIsNoOp|TestBetaBuildLocalizationsCreateUpsertUpdatesExistingLocale|TestBetaBuildLocalizationsCreateUpsertCreatesWhenLocaleMissing|TestBuildsFindByBuildNumberSuccess|TestBuildsFindByBuildNumberNotFound|TestPublishTestflightExistingBuildIDSkipsUpload|TestPublishTestflightExistingBuildNumberResolvesAndWaits|TestPublishValidationErrors|TestBuildsWaitValidationErrors|TestBuildsFindValidationErrors|TestRun_UsageValidationErrorsReturnExitUsage'` - `PATH="$(go env GOPATH)/bin:$PATH" make format` - `PATH="$(go env GOPATH)/bin:$PATH" make lint` (falls back to `go vet` if `golangci-lint` is unavailable) - `PATH="$(go env GOPATH)/bin:$PATH" ASC_BYPASS_KEYCHAIN=1 make test` ### Built-binary exit behavior - `go build -o /tmp/asc .` - `/tmp/asc builds list --app APP_123 --processing-state WRONG` (exit code 2) - `/tmp/asc builds wait` (exit code 2) - `/tmp/asc publish testflight --app APP_123 --group GROUP_ID` (exit code 2) ### Live smoke tests with ASC credentials Read-only / low-risk live checks were run for new flows: - `builds list --processing-state all|PROCESSING` - `builds find` - `builds wait` - `builds add-groups` internal-group hint + `--skip-internal` no-op - `publish testflight --build` and `--build-number` with API debug logs verifying upload endpoints are skipped ## Alternatives considered - Reusing `shared/findBuildByNumber` from `shared/build_wait.go` directly for `builds find`/`publish --build-number`. - Not possible as-is because it is unexported and tightly coupled to pre-release-version lookup assumptions. - Chosen approach uses supported `/v1/builds` server-side filters with platform + processing-state, reducing API round-trips and ambiguity. - Adding a global raw API passthrough for #762 in this PR. - Rejected since issue is already closed/not planned and outside this scoped audit’s accepted value set. ## Expected invocation examples - `asc builds list --app "$ASC_APP_ID" --processing-state all` - `asc builds wait --app "$ASC_APP_ID" --build-number "312" --platform IOS` - `asc builds add-groups --build BUILD_ID --group INTERNAL,EXTERNAL --skip-internal` - `asc beta-build-localizations create --build BUILD_ID --locale en-US --whats-new "notes" --upsert` - `asc builds find --app "$ASC_APP_ID" --build-number "312" --platform IOS` - `asc publish testflight --app "$ASC_APP_ID" --build BUILD_ID --group GROUP_ID --wait` - `asc publish testflight --app "$ASC_APP_ID" --build-number 312 --group GROUP_ID --wait` Closes #759 Closes #760 Closes #761 Closes #763 Closes #764 Closes #765 --- <sub>🔄 This issue represents a GitHub Pull Request. It cannot be merged through Gitea due to API limitations.</sub>
kerem 2026-02-26 22:32:29 +03:00
Sign in to join this conversation.
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference
starred/App-Store-Connect-CLI#772
No description provided.