[GH-ISSUE #483] Auth Doctor: detect Appfile/Fastfile and suggest equivalent asc workflows #134

Closed
opened 2026-02-26 21:33:41 +03:00 by kerem · 3 comments
Owner

Originally created by @rudrankriyam on GitHub (Feb 10, 2026).
Original GitHub issue: https://github.com/rudrankriyam/App-Store-Connect-CLI/issues/483

Summary

Extend asc auth doctor with migration-oriented detection and actionable command mapping for teams moving existing lane-based automation into asc.

Why this matters

auth doctor currently validates ASC credentials and local security posture well, but it stops at ASC-specific state.
Teams often already have repository signals (Appfile, Fastfile, Deliverfile, Bundler setup) that can be translated into immediate asc next steps.
Without this, users hit a dead end between "auth is healthy" and "what command should I run first?"

Current state (verified)

  • asc auth doctor checks storage, profiles, private keys, environment, and temp files.
  • Implementation lives in internal/auth/doctor.go and is surfaced by internal/cli/auth/auth.go.
  • No checks currently inspect Appfile / Fastfile / Deliverfile or suggest equivalent asc commands.

Proposed UX

New report section: Migration Hints

Add a doctor section that:

  1. Detects repository signals:
    • Appfile presence and common keys (app_identifier, apple_id, team_id, itc_team_id, apple_dev_portal_id, itunes_connect_id)
    • Fastfile presence and common actions (app_store_connect_api_key, deliver, upload_to_testflight, pilot, upload_to_app_store, precheck, app_store_build_number, latest_testflight_build_number)
    • optional Bundler signal (Gemfile, Gemfile.lock)
  2. Produces concrete asc equivalents, for example:
    • API key setup -> asc auth login ...
    • metadata sync lanes -> asc migrate validate, asc migrate import
    • beta distribution lanes -> asc publish testflight ...
    • store submission lanes -> asc publish appstore ... / asc submit create ...
    • build-number lookup lanes -> asc builds latest ... (and --next when available)
  3. Emits both:
    • human-readable hints in text output
    • structured JSON in --output json (detectedFiles, detectedActions, suggestedCommands)

Behavior constraints

  • Never parse or print secrets.
  • Missing repo files should be INFO, not WARN/FAIL.
  • Keep command suggestions deterministic and copy-pasteable.

Detailed implementation plan

  • Add inspectMigrationHints() in internal/auth/doctor.go.
  • Add parser helpers in internal/auth/doctor_migration.go:
    • lightweight Appfile key extraction
    • lightweight Fastfile action extraction
    • bounded workspace scan (current dir + common automation directories, no deep recursion)
  • Extend DoctorReport payload with optional migration metadata for JSON output.
  • Add mapping table in code (action -> []asc command suggestions) with stable ordering.
  • Wire text rendering in internal/cli/auth/auth.go so recommendations appear under "Migration Hints".
  • Add tests in internal/auth/doctor_test.go:
    • detects Appfile/Fastfile signals
    • generates expected command suggestions
    • does not leak credential values
    • empty repo produces info-only output
  • Update docs examples in README.md for asc auth doctor.

Acceptance criteria

  • asc auth doctor includes a migration section when repository signals are present.
  • JSON output includes machine-readable suggestions.
  • No secrets or private key material appear in output.
  • Existing doctor exit behavior remains unchanged (errors still drive non-zero status).
  • make test passes with added coverage for migration hints.
Originally created by @rudrankriyam on GitHub (Feb 10, 2026). Original GitHub issue: https://github.com/rudrankriyam/App-Store-Connect-CLI/issues/483 ## Summary Extend `asc auth doctor` with migration-oriented detection and actionable command mapping for teams moving existing lane-based automation into `asc`. ## Why this matters `auth doctor` currently validates ASC credentials and local security posture well, but it stops at ASC-specific state. Teams often already have repository signals (`Appfile`, `Fastfile`, `Deliverfile`, Bundler setup) that can be translated into immediate `asc` next steps. Without this, users hit a dead end between "auth is healthy" and "what command should I run first?" ## Current state (verified) - `asc auth doctor` checks storage, profiles, private keys, environment, and temp files. - Implementation lives in `internal/auth/doctor.go` and is surfaced by `internal/cli/auth/auth.go`. - No checks currently inspect `Appfile` / `Fastfile` / `Deliverfile` or suggest equivalent `asc` commands. ## Proposed UX ### New report section: `Migration Hints` Add a doctor section that: 1. Detects repository signals: - `Appfile` presence and common keys (`app_identifier`, `apple_id`, `team_id`, `itc_team_id`, `apple_dev_portal_id`, `itunes_connect_id`) - `Fastfile` presence and common actions (`app_store_connect_api_key`, `deliver`, `upload_to_testflight`, `pilot`, `upload_to_app_store`, `precheck`, `app_store_build_number`, `latest_testflight_build_number`) - optional Bundler signal (`Gemfile`, `Gemfile.lock`) 2. Produces concrete `asc` equivalents, for example: - API key setup -> `asc auth login ...` - metadata sync lanes -> `asc migrate validate`, `asc migrate import` - beta distribution lanes -> `asc publish testflight ...` - store submission lanes -> `asc publish appstore ...` / `asc submit create ...` - build-number lookup lanes -> `asc builds latest ...` (and `--next` when available) 3. Emits both: - human-readable hints in text output - structured JSON in `--output json` (`detectedFiles`, `detectedActions`, `suggestedCommands`) ### Behavior constraints - Never parse or print secrets. - Missing repo files should be `INFO`, not `WARN`/`FAIL`. - Keep command suggestions deterministic and copy-pasteable. ## Detailed implementation plan - [ ] Add `inspectMigrationHints()` in `internal/auth/doctor.go`. - [ ] Add parser helpers in `internal/auth/doctor_migration.go`: - [ ] lightweight `Appfile` key extraction - [ ] lightweight `Fastfile` action extraction - [ ] bounded workspace scan (current dir + common automation directories, no deep recursion) - [ ] Extend `DoctorReport` payload with optional migration metadata for JSON output. - [ ] Add mapping table in code (`action -> []asc command suggestions`) with stable ordering. - [ ] Wire text rendering in `internal/cli/auth/auth.go` so recommendations appear under "Migration Hints". - [ ] Add tests in `internal/auth/doctor_test.go`: - [ ] detects Appfile/Fastfile signals - [ ] generates expected command suggestions - [ ] does not leak credential values - [ ] empty repo produces info-only output - [ ] Update docs examples in `README.md` for `asc auth doctor`. ## Acceptance criteria - [ ] `asc auth doctor` includes a migration section when repository signals are present. - [ ] JSON output includes machine-readable suggestions. - [ ] No secrets or private key material appear in output. - [ ] Existing doctor exit behavior remains unchanged (`errors` still drive non-zero status). - [ ] `make test` passes with added coverage for migration hints.
kerem 2026-02-26 21:33:41 +03:00
Author
Owner

@rudrankriyam commented on GitHub (Feb 11, 2026):

@cursor Please implement this issue end-to-end.

What to build

Extend asc auth doctor with repository migration hints based on Appfile/Fastfile/Deliverfile detection, and output equivalent asc command suggestions.

Implementation plan

  1. Doctor model + section wiring
  • internal/auth/doctor.go
    • Add a new section (e.g. Migration Hints) into Doctor().
    • Include findings in both text and JSON output paths.
  • Keep existing status semantics unchanged (errors/warnings still driven by auth health checks).
  1. Parsing + detection helpers
  • Add internal/auth/doctor_migration.go (or equivalent):
    • Detect presence of Appfile, Fastfile, Deliverfile, Gemfile.
    • Parse lightweight signal keys/actions (no secret extraction).
    • Keep scan bounded to workspace root and common automation dirs.
  1. Command mapping
  • Add deterministic mapping from detected actions to asc commands, including:
    • auth setup
    • metadata sync/import
    • build lookup / next-number workflow
    • test distribution / store submission workflows
  • Emit suggestions in stable order.
  1. CLI rendering
  • internal/cli/auth/auth.go
    • Ensure printDoctorReport renders migration hints clearly in text mode.
    • JSON output should include machine-readable structures for detected files/actions/suggestions.

New tests to write

A) Auth doctor unit tests (internal/auth/doctor_test.go)

  • detects Appfile and Fastfile and emits migration hints
  • missing files returns info-only checks (no false failures)
  • suggestions are stable and deterministic
  • no secret values are surfaced from files

B) CLI output tests (internal/cli/cmdtest)

  • asc auth doctor --output json includes migration section keys
  • text output includes migration section heading + recommendations

C) Regression checks

  • existing auth doctor summary/error behavior unchanged
  • existing auth doctor --fix behavior unaffected

How to test locally

Run exactly:

  • make format
  • make lint
  • make test

Targeted tests:

  • go test ./internal/auth -run 'Doctor.*Migration|Doctor.*Hints'
  • go test ./internal/cli/cmdtest -run 'auth doctor'

Done criteria

  • asc auth doctor reports migration hints when relevant files are present.
  • JSON output includes machine-readable hints.
  • No secrets are leaked.
  • Existing auth diagnostics and exit behavior remain intact.
  • All checks pass (format, lint, test).
<!-- gh-comment-id:3881458764 --> @rudrankriyam commented on GitHub (Feb 11, 2026): @cursor Please implement this issue end-to-end. ## What to build Extend `asc auth doctor` with repository migration hints based on `Appfile`/`Fastfile`/`Deliverfile` detection, and output equivalent `asc` command suggestions. ## Implementation plan 1. **Doctor model + section wiring** - `internal/auth/doctor.go` - Add a new section (e.g. `Migration Hints`) into `Doctor()`. - Include findings in both text and JSON output paths. - Keep existing status semantics unchanged (errors/warnings still driven by auth health checks). 2. **Parsing + detection helpers** - Add `internal/auth/doctor_migration.go` (or equivalent): - Detect presence of `Appfile`, `Fastfile`, `Deliverfile`, `Gemfile`. - Parse lightweight signal keys/actions (no secret extraction). - Keep scan bounded to workspace root and common automation dirs. 3. **Command mapping** - Add deterministic mapping from detected actions to `asc` commands, including: - auth setup - metadata sync/import - build lookup / next-number workflow - test distribution / store submission workflows - Emit suggestions in stable order. 4. **CLI rendering** - `internal/cli/auth/auth.go` - Ensure `printDoctorReport` renders migration hints clearly in text mode. - JSON output should include machine-readable structures for detected files/actions/suggestions. ## New tests to write ### A) Auth doctor unit tests (`internal/auth/doctor_test.go`) - detects `Appfile` and `Fastfile` and emits migration hints - missing files returns info-only checks (no false failures) - suggestions are stable and deterministic - no secret values are surfaced from files ### B) CLI output tests (`internal/cli/cmdtest`) - `asc auth doctor --output json` includes migration section keys - text output includes migration section heading + recommendations ### C) Regression checks - existing auth doctor summary/error behavior unchanged - existing auth doctor `--fix` behavior unaffected ## How to test locally Run exactly: - `make format` - `make lint` - `make test` Targeted tests: - `go test ./internal/auth -run 'Doctor.*Migration|Doctor.*Hints'` - `go test ./internal/cli/cmdtest -run 'auth doctor'` ## Done criteria - `asc auth doctor` reports migration hints when relevant files are present. - JSON output includes machine-readable hints. - No secrets are leaked. - Existing auth diagnostics and exit behavior remain intact. - All checks pass (`format`, `lint`, `test`).
Author
Owner

@cursor[bot] commented on GitHub (Feb 11, 2026):

I added a “Migration Hints” section to asc auth doctor that scans Appfile/Fastfile/Deliverfile/Gemfile, extracts safe keys/actions, and maps them to deterministic asc command suggestions, with a JSON payload wired into the report output. I also added unit + cmdtest coverage for detection/suggestions and updated the README auth doctor example to mention migration hints.

type DoctorReport struct {
	Sections        []DoctorSection       `json:"sections"`
	Summary         DoctorSummary         `json:"summary"`
	Recommendations []string              `json:"recommendations,omitempty"`
	Migration       *DoctorMigrationHints `json:"migration,omitempty"`
}

type DoctorOptions struct {
	Fix bool
}

func Doctor(options DoctorOptions) DoctorReport {
	migrationSection, migrationHints := inspectMigrationHints()
	sections := []DoctorSection{
		inspectStorage(options),
		inspectProfiles(),
		inspectPrivateKeys(options),
		inspectEnvironment(),
		inspectTempKeys(options),
		migrationSection,
	}

	report := DoctorReport{Sections: sections, Migration: migrationHints}
	report.Summary, report.Recommendations = summarizeDoctorReport(sections)
	return report
}
func appfileKeyOrder() []string {
	return []string{
		"app_identifier",
		"apple_id",
		"team_id",
		"itc_team_id",
		"apple_dev_portal_id",
		"itunes_connect_id",
	}
}
...
func buildSuggestedCommands(signals migrationSignals) []string {
	var commands []string
	seen := map[string]struct{}{}
	add := func(cmd string) {
		if _, ok := seen[cmd]; ok {
			return
		}
		seen[cmd] = struct{}{}
		commands = append(commands, cmd)
	}

	hasAuthSignal := containsAction(signals.detectedActions, "app_store_connect_api_key")
	hasMetadataSignal := len(signals.appfiles) > 0 || len(signals.deliverfiles) > 0 || containsAction(signals.detectedActions, "deliver")
	hasBuildSignal := containsAction(signals.detectedActions, "app_store_build_number") ||
		containsAction(signals.detectedActions, "latest_testflight_build_number")
	hasTestflightSignal := containsAction(signals.detectedActions, "upload_to_testflight") || containsAction(signals.detectedActions, "pilot")
	hasAppStoreSignal := containsAction(signals.detectedActions, "upload_to_app_store") || containsAction(signals.detectedActions, "precheck")

	if hasAuthSignal {
		add(`asc auth login --name "MyKey" --key-id "KEY_ID" --issuer-id "ISSUER_ID" --private-key /path/to/AuthKey.p8`)
	}
	if hasMetadataSignal {
		fastlaneDir := formatFastlaneDir(signals.fastlaneDir)
		add(fmt.Sprintf("asc migrate validate --fastlane-dir %s", fastlaneDir))
		add(fmt.Sprintf(`asc migrate import --app "APP_ID" --version-id "VERSION_ID" --fastlane-dir %s`, fastlaneDir))
	}
	if hasBuildSignal {
		add(`asc builds latest --app "APP_ID"`)
	}
	if hasTestflightSignal {
		add(`asc publish testflight --app "APP_ID" --ipa app.ipa --group "GROUP_ID"`)
	}
	if hasAppStoreSignal {
		add(`asc publish appstore --app "APP_ID" --ipa app.ipa --version "1.2.3" --submit --confirm`)
		add(`asc submit create --app "APP_ID" --version "1.2.3" --build "BUILD_ID" --confirm`)
	}

	return commands
}
func TestDoctorMigrationHintsDetected(t *testing.T) {
	repo := t.TempDir()
	...
	report := Doctor(DoctorOptions{})
	section := findDoctorSection(t, report, "Migration Hints")
	...
	expectedCommands := []string{
		`asc auth login --name "MyKey" --key-id "KEY_ID" --issuer-id "ISSUER_ID" --private-key /path/to/AuthKey.p8`,
		"asc migrate validate --fastlane-dir ./fastlane",
		`asc migrate import --app "APP_ID" --version-id "VERSION_ID" --fastlane-dir ./fastlane`,
		`asc builds latest --app "APP_ID"`,
		`asc publish testflight --app "APP_ID" --ipa app.ipa --group "GROUP_ID"`,
	}
	...
	assertNoSecretInDoctorReport(t, report, secretValue)
}

func TestDoctorMigrationHintsMissingFilesInfoOnly(t *testing.T) {
	...
}
func TestAuthDoctorJSONIncludesMigrationHints(t *testing.T) {
	...
	if !sliceContains(report.Migration.DetectedFiles, "fastlane/Appfile") {
		t.Fatalf("expected Appfile in detected files, got %#v", report.Migration.DetectedFiles)
	}
	...
}
...
func TestAuthDoctorTextIncludesMigrationHints(t *testing.T) {
	...
	if !strings.Contains(stdout, "Migration Hints:") {
		t.Fatalf("expected migration section heading, got %q", stdout)
	}
	...
}
# Diagnose authentication issues (includes migration hints when fastlane files are detected)
asc auth doctor
asc auth doctor --output json --pretty
asc auth doctor --fix --confirm

Tests run:

  • go test ./internal/auth -run 'Doctor.*Migration|Doctor.*Hints'
  • go test ./internal/cli/cmdtest -run 'auth doctor' (Go reported: [no tests to run])
  • make format (after make tools, rerun with PATH=/home/ubuntu/go/bin:$PATH)
  • make lint (after reinstalling golangci-lint with GOTOOLCHAIN=go1.26.0, rerun with PATH=/home/ubuntu/go/bin:$PATH)
  • make test

Walkthrough video (shows asc auth doctor output with Migration Hints and suggested commands):

  • /opt/cursor/artifacts/auth_doctor_migration_hints_demo_clear/recording_demo.mp4

View PR

Open in Cursor Open in Web

<!-- gh-comment-id:3881459242 --> @cursor[bot] commented on GitHub (Feb 11, 2026): I added a “Migration Hints” section to `asc auth doctor` that scans Appfile/Fastfile/Deliverfile/Gemfile, extracts safe keys/actions, and maps them to deterministic asc command suggestions, with a JSON payload wired into the report output. I also added unit + cmdtest coverage for detection/suggestions and updated the README auth doctor example to mention migration hints. ```42:66:internal/auth/doctor.go type DoctorReport struct { Sections []DoctorSection `json:"sections"` Summary DoctorSummary `json:"summary"` Recommendations []string `json:"recommendations,omitempty"` Migration *DoctorMigrationHints `json:"migration,omitempty"` } type DoctorOptions struct { Fix bool } func Doctor(options DoctorOptions) DoctorReport { migrationSection, migrationHints := inspectMigrationHints() sections := []DoctorSection{ inspectStorage(options), inspectProfiles(), inspectPrivateKeys(options), inspectEnvironment(), inspectTempKeys(options), migrationSection, } report := DoctorReport{Sections: sections, Migration: migrationHints} report.Summary, report.Recommendations = summarizeDoctorReport(sections) return report } ``` ```180:379:internal/auth/doctor_migration.go func appfileKeyOrder() []string { return []string{ "app_identifier", "apple_id", "team_id", "itc_team_id", "apple_dev_portal_id", "itunes_connect_id", } } ... func buildSuggestedCommands(signals migrationSignals) []string { var commands []string seen := map[string]struct{}{} add := func(cmd string) { if _, ok := seen[cmd]; ok { return } seen[cmd] = struct{}{} commands = append(commands, cmd) } hasAuthSignal := containsAction(signals.detectedActions, "app_store_connect_api_key") hasMetadataSignal := len(signals.appfiles) > 0 || len(signals.deliverfiles) > 0 || containsAction(signals.detectedActions, "deliver") hasBuildSignal := containsAction(signals.detectedActions, "app_store_build_number") || containsAction(signals.detectedActions, "latest_testflight_build_number") hasTestflightSignal := containsAction(signals.detectedActions, "upload_to_testflight") || containsAction(signals.detectedActions, "pilot") hasAppStoreSignal := containsAction(signals.detectedActions, "upload_to_app_store") || containsAction(signals.detectedActions, "precheck") if hasAuthSignal { add(`asc auth login --name "MyKey" --key-id "KEY_ID" --issuer-id "ISSUER_ID" --private-key /path/to/AuthKey.p8`) } if hasMetadataSignal { fastlaneDir := formatFastlaneDir(signals.fastlaneDir) add(fmt.Sprintf("asc migrate validate --fastlane-dir %s", fastlaneDir)) add(fmt.Sprintf(`asc migrate import --app "APP_ID" --version-id "VERSION_ID" --fastlane-dir %s`, fastlaneDir)) } if hasBuildSignal { add(`asc builds latest --app "APP_ID"`) } if hasTestflightSignal { add(`asc publish testflight --app "APP_ID" --ipa app.ipa --group "GROUP_ID"`) } if hasAppStoreSignal { add(`asc publish appstore --app "APP_ID" --ipa app.ipa --version "1.2.3" --submit --confirm`) add(`asc submit create --app "APP_ID" --version "1.2.3" --build "BUILD_ID" --confirm`) } return commands } ``` ```92:247:internal/auth/doctor_test.go func TestDoctorMigrationHintsDetected(t *testing.T) { repo := t.TempDir() ... report := Doctor(DoctorOptions{}) section := findDoctorSection(t, report, "Migration Hints") ... expectedCommands := []string{ `asc auth login --name "MyKey" --key-id "KEY_ID" --issuer-id "ISSUER_ID" --private-key /path/to/AuthKey.p8`, "asc migrate validate --fastlane-dir ./fastlane", `asc migrate import --app "APP_ID" --version-id "VERSION_ID" --fastlane-dir ./fastlane`, `asc builds latest --app "APP_ID"`, `asc publish testflight --app "APP_ID" --ipa app.ipa --group "GROUP_ID"`, } ... assertNoSecretInDoctorReport(t, report, secretValue) } func TestDoctorMigrationHintsMissingFilesInfoOnly(t *testing.T) { ... } ``` ```1:132:internal/cli/cmdtest/auth_doctor_test.go func TestAuthDoctorJSONIncludesMigrationHints(t *testing.T) { ... if !sliceContains(report.Migration.DetectedFiles, "fastlane/Appfile") { t.Fatalf("expected Appfile in detected files, got %#v", report.Migration.DetectedFiles) } ... } ... func TestAuthDoctorTextIncludesMigrationHints(t *testing.T) { ... if !strings.Contains(stdout, "Migration Hints:") { t.Fatalf("expected migration section heading, got %q", stdout) } ... } ``` ```1587:1596:README.md # Diagnose authentication issues (includes migration hints when fastlane files are detected) asc auth doctor asc auth doctor --output json --pretty asc auth doctor --fix --confirm ``` Tests run: - `go test ./internal/auth -run 'Doctor.*Migration|Doctor.*Hints'` - `go test ./internal/cli/cmdtest -run 'auth doctor'` (Go reported: `[no tests to run]`) - `make format` (after `make tools`, rerun with `PATH=/home/ubuntu/go/bin:$PATH`) - `make lint` (after reinstalling golangci-lint with `GOTOOLCHAIN=go1.26.0`, rerun with `PATH=/home/ubuntu/go/bin:$PATH`) - `make test` Walkthrough video (shows `asc auth doctor` output with Migration Hints and suggested commands): - `/opt/cursor/artifacts/auth_doctor_migration_hints_demo_clear/recording_demo.mp4` <p><a href="https://github.com/rudrankriyam/App-Store-Connect-CLI/pull/488"><picture><source media="(prefers-color-scheme: dark)" srcset="https://cursor.com/assets/images/view-pr-dark.png"><source media="(prefers-color-scheme: light)" srcset="https://cursor.com/assets/images/view-pr-light.png"><img alt="View PR" width="86" height="28" src="https://cursor.com/assets/images/view-pr-light.png"></picture></a></p> <p><a href="https://cursor.com/background-agent?bcId=bc-b6bb9888-8687-45d4-ba2f-cb33668b48e2"><picture><source media="(prefers-color-scheme: dark)" srcset="https://cursor.com/assets/images/open-in-cursor-dark.png"><source media="(prefers-color-scheme: light)" srcset="https://cursor.com/assets/images/open-in-cursor-light.png"><img alt="Open in Cursor" width="131" height="28" src="https://cursor.com/assets/images/open-in-cursor-dark.png"></picture></a>&nbsp;<a href="https://cursor.com/agents?id=bc-b6bb9888-8687-45d4-ba2f-cb33668b48e2"><picture><source media="(prefers-color-scheme: dark)" srcset="https://cursor.com/assets/images/open-in-web-dark.png"><source media="(prefers-color-scheme: light)" srcset="https://cursor.com/assets/images/open-in-web-light.png"><img alt="Open in Web" width="114" height="28" src="https://cursor.com/assets/images/open-in-web-dark.png"></picture></a></p>
Author
Owner

@rudrankriyam commented on GitHub (Feb 11, 2026):

Implemented and merged in PR #488: https://github.com/rudrankriyam/App-Store-Connect-CLI/pull/488\n\nThis delivered auth doctor migration hints (Fastlane/Appfile/Fastfile detection, suggested asc workflows, JSON/text migration output, and supporting tests/docs), so this issue is now complete.

<!-- gh-comment-id:3881688815 --> @rudrankriyam commented on GitHub (Feb 11, 2026): Implemented and merged in PR #488: https://github.com/rudrankriyam/App-Store-Connect-CLI/pull/488\n\nThis delivered auth doctor migration hints (Fastlane/Appfile/Fastfile detection, suggested asc workflows, JSON/text migration output, and supporting tests/docs), so this issue is now complete.
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#134
No description provided.