Skip to content

Add a --metadata-dir option to asc publish appstore - #1485

Merged
rudrankriyam merged 4 commits into
rorkai:mainfrom
justinseanmartin:jmartin/publish-with-metadata
May 8, 2026
Merged

Add a --metadata-dir option to asc publish appstore#1485
rudrankriyam merged 4 commits into
rorkai:mainfrom
justinseanmartin:jmartin/publish-with-metadata

Conversation

@justinseanmartin

@justinseanmartin justinseanmartin commented May 4, 2026

Copy link
Copy Markdown
Contributor

Summary

This updates asc publish appstore --metadata-dir to apply App Store version localization metadata during publish, after ensuring the target App Store version exists and before attaching/submitting the build.

When --metadata-dir is provided, publish reads files under:

metadata/version/<version>/*.json

and applies any supported version-localization fields present in those files:

  • description
  • keywords
  • marketingUrl
  • promotionalText
  • supportUrl
  • whatsNew

Omitted fields are left unchanged. This allows App Store Connect to keep any metadata it copied forward when the new version was created, while still letting the publish command patch release-specific metadata such as “What’s New”.

Why This Direction

The publish flow should only touch metadata that belongs to the App Store version being published. Fields like whatsNew, description, keywords, and support/marketing URLs all live on AppStoreVersionLocalization, so they can be updated directly from metadata/version/<version>/*.json.

We intentionally do not apply metadata/app-info/*.json from publish appstore. App info localization is a broader app-level metadata sync concern and may require resolving an App Info ID when an app has multiple app info records. Pulling that into publish made the command more complex and introduced an --app-info flag that is not needed for the release-metadata workflow.

This keeps publish behavior patch-oriented:

  • apply fields explicitly present in version metadata files
  • leave omitted fields alone
  • do not treat missing locale files as deletes
  • avoid requiring app-info resolution
  • preserve ASC’s backend copy-forward behavior for newly created versions

This implements the behavior discussed in #1469 while keeping full metadata sync responsibilities with the dedicated metadata commands.

I have yet to do a full end-to-end test of this, as I'm not quite ready to ship another release of my app, but I'd be happy to hold off merging this until I've done an end-to-end test if that's preferable.

  • Remove from Draft state once this has been fully test end-to-end

Validation

  • make format
  • make check-docs
  • make lint
  • ASC_BYPASS_KEYCHAIN=1 make test

Summary by CodeRabbit

  • New Features

    • Added --metadata-dir to publish appstore to apply version localization metadata from JSON files; applied after version creation and before build attachment.
    • Dry-run now shows an apply_metadata step in the publish plan.
  • Bug Fixes

    • Rejects empty/whitespace --metadata-dir with a clear usage error and stderr message.
  • Tests

    • Added end-to-end and unit tests covering metadata loading, error cases, dry-run planning, and step ordering.
    • Improved test environment isolation to filter extra inherited env vars.

@coderabbitai

coderabbitai Bot commented May 4, 2026

Copy link
Copy Markdown

Review Change Stack
No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: 25186db9-1112-4794-abfd-0cb6e7086f5d

📥 Commits

Reviewing files that changed from the base of the PR and between dda3722 and d9ba240.

📒 Files selected for processing (6)
  • cmd/exit_codes_test.go
  • internal/cli/publish/local_build.go
  • internal/cli/publish/publish.go
  • internal/cli/publish/publish_local_build_test.go
  • internal/cli/publish/version_metadata.go
  • internal/cli/publish/version_metadata_test.go
✅ Files skipped from review due to trivial changes (1)
  • internal/cli/publish/local_build.go
🚧 Files skipped from review as they are similar to previous changes (4)
  • internal/cli/publish/version_metadata_test.go
  • internal/cli/publish/publish.go
  • cmd/exit_codes_test.go
  • internal/cli/publish/version_metadata.go

📝 Walkthrough

Walkthrough

Adds --metadata-dir to asc publish appstore: loads locale JSONs under the version directory, validates and uploads version localizations, invokes the upload after ensuring/creating the App Store version and before attaching the build, and surfaces an apply_metadata step in dry-run plans. Tests and test-helper changes accompany the feature.

Changes

App Store Publish Metadata Support

Layer / File(s) Summary
Core Metadata Implementation
internal/cli/publish/version_metadata.go
New implementation to locate version-localization JSONs, parse per-locale values, and upload via shared.UploadVersionLocalizationsWithWarnings; computes metadata directory from en-US path.
CLI Flag & Execution Wiring
internal/cli/publish/publish.go, internal/cli/publish/local_build.go
Adds --metadata-dir flag with non-empty validation; introduces publishPlanStepApplyMetadata; threads applyMetadata into planned steps; calls applyPublishVersionMetadataFn after finding/creating the version and before attaching the build; adds indirection var applyPublishVersionMetadataFn.
Tests: Loader Unit Tests
internal/cli/publish/version_metadata_test.go
Adds tests verifying loading of version localization JSONs and error when no version files found.
Tests: Publish Integration & Dry-run
internal/cli/publish/publish_local_build_test.go
Adds tests that stub metadata application to assert apply_metadata executes between ensure_version and attach_build, and that dry-run plan includes apply_metadata in the expected order; test-hooks now snapshot/restore applyPublishVersionMetadataFn.
CLI Exit & Test Helper
cmd/exit_codes_test.go
Adds TestPublishAppStoreEmptyMetadataDirExitCode to assert usage exit when --metadata-dir is empty and extends isolatedCLITestEnv to filter additional inherited env vars (ASC_STRICT_AUTH, ASC_APP_ID).

Sequence Diagram

sequenceDiagram
  participant User as User / CLI
  participant Publish as Publish Command
  participant Metadata as Metadata Loader
  participant ASC as App Store Connect
  participant Build as Build Manager

  User->>Publish: publish appstore --metadata-dir=.../1.2.3
  Publish->>ASC: FindOrCreateAppStoreVersion
  ASC-->>Publish: VersionID
  Publish->>Metadata: applyPublishVersionMetadata(VersionID, Dir)
  Metadata->>Metadata: loadPublishVersionMetadataValues(en-US, fr-FR, ...)
  Metadata->>ASC: UploadVersionLocalizationsWithWarnings(locales)
  ASC-->>Metadata: results
  Metadata-->>Publish: results
  Publish->>Build: LookupBuild / UploadBuild
  Build-->>Publish: BuildID
  Publish->>ASC: AttachBuild(VersionID, BuildID)
  ASC-->>Publish: success
  Publish-->>User: ✓ Published with metadata
Loading

Estimated Code Review Effort

🎯 3 (Moderate) | ⏱️ ~25 minutes

Poem

🐰 I hopped through dirs of JSON light,
en-US, fr-FR, each locale bright,
Applied between ensure and attach,
A multilingual carrot batch!
Hooray — the app speaks every bite!

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 31.46% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (4 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title accurately and concisely describes the main change: adding a --metadata-dir option to the asc publish appstore command, which aligns with the core implementation across multiple files.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

@rudrankriyam
rudrankriyam marked this pull request as draft May 4, 2026 19:44

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (2)
internal/cli/publish/publish.go (1)

454-459: ⚠️ Potential issue | 🟠 Major | ⚡ Quick win

Reject explicitly empty --metadata-dir values.

Right now --metadata-dir= or a whitespace-only value is accepted, trimmed to "", and then treated as if the flag was never passed. That makes a changed user-facing flag a silent no-op, and the dry-run plan will also omit apply_metadata instead of failing fast.

Suggested fix
 			buildNumberValue := strings.TrimSpace(*buildNumber)
 			metadataDirValue := strings.TrimSpace(*metadataDir)
+			if setFlags["metadata-dir"] && metadataDirValue == "" {
+				return shared.UsageError("--metadata-dir requires a non-empty path")
+			}
 			localBuildMode := localBuild.localBuildMode()

As per coding guidelines, "Never silently ignore accepted flags; unsupported values must return an error" and "For every new or changed flag, add one valid-path test and one invalid-value test that asserts stderr and exit code 2".

Also applies to: 560-562

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@internal/cli/publish/publish.go` around lines 454 - 459, Currently an
explicitly passed empty or whitespace-only --metadata-dir is trimmed to "" and
treated like the flag was not passed; change the logic around metadataDir
handling so that if the metadataDir flag was provided but
strings.TrimSpace(*metadataDir) yields an empty string you return a user error
(exit code 2) instead of silently ignoring it. Locate the metadataDir usage near
collectSetFlags(), ipaPath, version, buildNumber and localBuild.localBuildMode()
and add a check after metadataDirValue := strings.TrimSpace(*metadataDir) to
detect the flag presence (the fs/flag API or the surrounding flag set handling)
and error on empty value; apply the same check to the similar block referenced
at lines ~560-562 so both code paths fail fast when --metadata-dir is explicitly
empty. Ensure tests are added: one valid-path and one invalid-value test
asserting stderr and exit code 2 per guidelines.
cmd/exit_codes_test.go (1)

468-507: ⚠️ Potential issue | 🟡 Minor | ⚡ Quick win

Add test for invalid/missing --metadata-dir path.

The --metadata-dir flag has a valid-path test (TestPublishAppStoreMetadataDirAppliesAfterEnsureVersionBeforeAttach in publish_local_build_test.go line 855), but lacks a test verifying behavior when the directory does not exist or is inaccessible. The error-handling code exists in internal/cli/metadata/push.go (lines 206–208, 245–247) but is not exercised by tests. Add a test that passes a non-existent path and asserts the expected error message in stderr.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@cmd/exit_codes_test.go` around lines 468 - 507, Add a new test modeled on
TestPublishAppStoreDryRunInvalidBooleanExitCode that builds the CLI binary and
runs the "publish appstore" command with "--metadata-dir" pointing at a
non-existent or inaccessible path; assert that the process exits non-zero
(compare to ExitUsage) and that stderr contains both "metadata-dir" and the
expected error substring produced by internal/cli/metadata/push.go (the error
handling around EnsureVersionBeforeAttach / push logic). Use the same pattern of
building the binary, setting runCmd.Env via isolatedCLITestEnv, checking
errors.As to *exec.ExitError, and validating exitErr.ExitCode() and stderr
contents.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@internal/cli/publish/publish.go`:
- Around line 405-406: The metadata-enabled publish flow can fail when
metadata.ExecutePush needs an explicit App Info ID but none is available; add a
CLI flag (e.g., "app-info-id") alongside metadataDir and submit flags, parse it
into a variable (appInfoID) and thread that value into the code paths that call
metadata.ExecutePush so it can be used when GetAppInfos returns multiple
candidates; update all publish invocations that touch metadata (the places that
call metadata.ExecutePush and related helpers referenced in this file, including
the other similar blocks noted) to pass appInfoID through to the ExecutePush
call and any intermediate helper functions so the metadata command's recovery
path is available during publish.

---

Outside diff comments:
In `@cmd/exit_codes_test.go`:
- Around line 468-507: Add a new test modeled on
TestPublishAppStoreDryRunInvalidBooleanExitCode that builds the CLI binary and
runs the "publish appstore" command with "--metadata-dir" pointing at a
non-existent or inaccessible path; assert that the process exits non-zero
(compare to ExitUsage) and that stderr contains both "metadata-dir" and the
expected error substring produced by internal/cli/metadata/push.go (the error
handling around EnsureVersionBeforeAttach / push logic). Use the same pattern of
building the binary, setting runCmd.Env via isolatedCLITestEnv, checking
errors.As to *exec.ExitError, and validating exitErr.ExitCode() and stderr
contents.

In `@internal/cli/publish/publish.go`:
- Around line 454-459: Currently an explicitly passed empty or whitespace-only
--metadata-dir is trimmed to "" and treated like the flag was not passed; change
the logic around metadataDir handling so that if the metadataDir flag was
provided but strings.TrimSpace(*metadataDir) yields an empty string you return a
user error (exit code 2) instead of silently ignoring it. Locate the metadataDir
usage near collectSetFlags(), ipaPath, version, buildNumber and
localBuild.localBuildMode() and add a check after metadataDirValue :=
strings.TrimSpace(*metadataDir) to detect the flag presence (the fs/flag API or
the surrounding flag set handling) and error on empty value; apply the same
check to the similar block referenced at lines ~560-562 so both code paths fail
fast when --metadata-dir is explicitly empty. Ensure tests are added: one
valid-path and one invalid-value test asserting stderr and exit code 2 per
guidelines.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: 2145feac-8cb6-410f-8fa2-83e353990d38

📥 Commits

Reviewing files that changed from the base of the PR and between c12d1e7 and a303629.

📒 Files selected for processing (76)
  • apps/studio/app_helpers.go
  • cmd/age_rating_run_test.go
  • cmd/exit_codes_test.go
  • internal/asc/beta_license_agreements_test.go
  • internal/asc/client_app_metadata_test.go
  • internal/asc/client_core.go
  • internal/asc/client_http.go
  • internal/asc/client_http_app_clips_test.go
  • internal/asc/client_http_test.go
  • internal/asc/client_http_webhooks_test.go
  • internal/asc/client_pass_type_ids_test.go
  • internal/asc/client_publish.go
  • internal/asc/customer_review_summarizations_test.go
  • internal/asc/pricing_test.go
  • internal/asc/sandbox.go
  • internal/asc/sandbox_test.go
  • internal/asc/table_render.go
  • internal/asc/upload_test.go
  • internal/auth/integration_test.go
  • internal/cli/analytics/analytics_instances.go
  • internal/cli/analytics/analytics_reports.go
  • internal/cli/analytics/analytics_requests.go
  • internal/cli/androidiosmapping/android_ios_mapping.go
  • internal/cli/apps/app_registry.go
  • internal/cli/apps/apps.go
  • internal/cli/auth/auth.go
  • internal/cli/builds/build_test_notes.go
  • internal/cli/builds/builds_commands.go
  • internal/cli/builds/builds_individual_testers.go
  • internal/cli/builds/builds_related.go
  • internal/cli/builds/builds_relationships.go
  • internal/cli/builds/builds_uploads.go
  • internal/cli/certificates/certificates.go
  • internal/cli/encryption/encryption.go
  • internal/cli/iap/setup.go
  • internal/cli/metadata/push.go
  • internal/cli/performance/performance_download.go
  • internal/cli/performance/performance_metrics.go
  • internal/cli/pricing/tiers.go
  • internal/cli/profiles/profiles.go
  • internal/cli/publish/local_build.go
  • internal/cli/publish/publish.go
  • internal/cli/publish/publish_local_build_test.go
  • internal/cli/reviews/review_attachments.go
  • internal/cli/reviews/review_items.go
  • internal/cli/reviews/review_submissions.go
  • internal/cli/reviews/reviews.go
  • internal/cli/reviews/reviews_summarizations.go
  • internal/cli/sandbox/sandbox_helpers.go
  • internal/cli/shared/build_wait.go
  • internal/cli/shared/command_builders.go
  • internal/cli/shared/test_notes.go
  • internal/cli/shared/tier_resolver.go
  • internal/cli/signing/signing_fetch.go
  • internal/cli/status/status.go
  • internal/cli/submit/submit.go
  • internal/cli/subscriptions/pricing_equalize.go
  • internal/cli/subscriptions/setup.go
  • internal/cli/testflight/beta_groups.go
  • internal/cli/testflight/beta_groups_relationships.go
  • internal/cli/testflight/beta_testers.go
  • internal/cli/testflight/beta_testers_related.go
  • internal/cli/testflight/beta_testers_relationships.go
  • internal/cli/testflight/command_wrappers.go
  • internal/cli/testflight/testflight_review.go
  • internal/cli/web/web_apps.go
  • internal/cli/web/web_auth.go
  • internal/cli/xcode/build_upload_lookup.go
  • internal/cli/xcode/xcode.go
  • internal/cli/xcodecloud/xcode_cloud_action_resources_helpers.go
  • internal/cli/xcodecloud/xcode_cloud_extras.go
  • internal/cli/xcodecloud/xcode_cloud_list_helpers.go
  • internal/cli/xcodecloud/xcode_cloud_workflows.go
  • internal/validation/legal_test.go
  • internal/web/auth.go
  • internal/xcode/xcode_test.go

Comment thread internal/cli/publish/publish.go Outdated
@rudrankriyam

Copy link
Copy Markdown
Collaborator

I have converted it to draft, and wait for you to do a end-to-end test for it; in the meanwhile, will sort the formatter so this PR is better reviewable!

@justinseanmartin
justinseanmartin force-pushed the jmartin/publish-with-metadata branch from baca54c to dda3722 Compare May 4, 2026 23:29
@justinseanmartin

Copy link
Copy Markdown
Contributor Author

@coderabbitai review

@coderabbitai

coderabbitai Bot commented May 4, 2026

Copy link
Copy Markdown
✅ Actions performed

Review triggered.

Note: CodeRabbit is an incremental review system and does not re-review already reviewed commits. This command is applicable only when automatic reviews are paused.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🧹 Nitpick comments (2)
internal/cli/publish/publish_local_build_test.go (1)

926-928: ⚡ Quick win

Capture and assert cmd.Exec errors explicitly in both new tests.

Both call sites currently ignore execution errors via capturePublishCommandOutput. Adding explicit runErr checks will prevent false positives from partial/leftover output paths.

Suggested change pattern
-	stdout, _ := capturePublishCommandOutput(t, func() error {
-		return cmd.Exec(context.Background(), nil)
-	})
+	var runErr error
+	stdout, _ := capturePublishCommandOutput(t, func() error {
+		runErr = cmd.Exec(context.Background(), nil)
+		return runErr
+	})
+	if runErr != nil {
+		t.Fatalf("Exec() error: %v", runErr)
+	}
@@
-	stdout, _ := capturePublishCommandOutput(t, func() error {
-		return cmd.Exec(context.Background(), nil)
-	})
+	var runErr error
+	stdout, _ := capturePublishCommandOutput(t, func() error {
+		runErr = cmd.Exec(context.Background(), nil)
+		return runErr
+	})
+	if runErr != nil {
+		t.Fatalf("Exec() error: %v", runErr)
+	}

Also applies to: 963-965

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@internal/cli/publish/publish_local_build_test.go` around lines 926 - 928, The
test currently swallows errors from cmd.Exec by calling
capturePublishCommandOutput(t, func() error { return cmd.Exec(...) }) and
ignoring the returned error; update the two failing test sites (where
capturePublishCommandOutput is called around the cmd.Exec invocation) to capture
the exec error into a variable (e.g., runErr := ...) and add an explicit
assertion that runErr is nil (or fail the test with t.Fatalf/t.Errorf including
runErr) immediately after capturing stdout so test failures surface actual Exec
errors instead of relying on output content alone.
internal/cli/publish/version_metadata_test.go (1)

60-63: ⚡ Quick win

Assert the failure reason, not just err != nil.

Right now this can pass on unrelated errors (permissions, path issues, parse issues). Tightening the assertion to the expected missing-files message makes the test regression-resistant.

Suggested test hardening
 import (
 	"os"
 	"path/filepath"
+	"strings"
 	"testing"
 )
@@
 	_, err := loadPublishVersionMetadataValues(dir, "1.2.3")
 	if err == nil {
 		t.Fatal("expected missing version metadata JSON files to fail")
 	}
+	if !strings.Contains(err.Error(), "no version metadata JSON files found") {
+		t.Fatalf("expected missing-files error, got %v", err)
+	}
 }
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@internal/cli/publish/version_metadata_test.go` around lines 60 - 63, Update
the test to assert the specific failure reason from
loadPublishVersionMetadataValues instead of only checking err != nil: call
loadPublishVersionMetadataValues(dir, "1.2.3"), require err != nil, then assert
the error text contains the expected missing-files message (e.g. use
strings.Contains(err.Error(), "missing version metadata") or compare against a
sentinel error if the package exposes one). Modify Test code around
loadPublishVersionMetadataValues to import "strings" (or use errors.Is with the
package's ErrMissingVersionMetadata) and replace the broad t.Fatal("expected
...") with a targeted assertion that verifies the error message/sentinel to
ensure the failure is due to missing JSON files.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Nitpick comments:
In `@internal/cli/publish/publish_local_build_test.go`:
- Around line 926-928: The test currently swallows errors from cmd.Exec by
calling capturePublishCommandOutput(t, func() error { return cmd.Exec(...) })
and ignoring the returned error; update the two failing test sites (where
capturePublishCommandOutput is called around the cmd.Exec invocation) to capture
the exec error into a variable (e.g., runErr := ...) and add an explicit
assertion that runErr is nil (or fail the test with t.Fatalf/t.Errorf including
runErr) immediately after capturing stdout so test failures surface actual Exec
errors instead of relying on output content alone.

In `@internal/cli/publish/version_metadata_test.go`:
- Around line 60-63: Update the test to assert the specific failure reason from
loadPublishVersionMetadataValues instead of only checking err != nil: call
loadPublishVersionMetadataValues(dir, "1.2.3"), require err != nil, then assert
the error text contains the expected missing-files message (e.g. use
strings.Contains(err.Error(), "missing version metadata") or compare against a
sentinel error if the package exposes one). Modify Test code around
loadPublishVersionMetadataValues to import "strings" (or use errors.Is with the
package's ErrMissingVersionMetadata) and replace the broad t.Fatal("expected
...") with a targeted assertion that verifies the error message/sentinel to
ensure the failure is due to missing JSON files.

ℹ️ Review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: 9eb514ad-c05b-484b-8f87-46acf832757a

📥 Commits

Reviewing files that changed from the base of the PR and between a303629 and dda3722.

📒 Files selected for processing (6)
  • cmd/exit_codes_test.go
  • internal/cli/publish/local_build.go
  • internal/cli/publish/publish.go
  • internal/cli/publish/publish_local_build_test.go
  • internal/cli/publish/version_metadata.go
  • internal/cli/publish/version_metadata_test.go
🚧 Files skipped from review as they are similar to previous changes (1)
  • internal/cli/publish/publish.go

@justinseanmartin
justinseanmartin force-pushed the jmartin/publish-with-metadata branch from dda3722 to 0e070b9 Compare May 5, 2026 16:05
@rudrankriyam rudrankriyam added enhancement New feature or request p2 Medium priority: useful fix with clear workaround or limited blast radius medium Moderate scope with some cross-file or design work labels May 7, 2026
@rudrankriyam

Copy link
Copy Markdown
Collaborator

@justinseanmartin I made some changes and I think I will merge for the next release soon

@rudrankriyam
rudrankriyam marked this pull request as ready for review May 8, 2026 00:03
@justinseanmartin

Copy link
Copy Markdown
Contributor Author

Thanks, appreciate it. I still haven't had time to do the end-to-end verification yet, I'm probably still a week or two away from doing my actual AppStore publish for the next release, but I'll test it out tonight and then abort the submission to at least verify it works as expected.

@rudrankriyam rudrankriyam left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Audited hard. Rebased onto latest main, verified metadata-dir validation and dry-run behavior, and full local guardrails plus GitHub checks are green.

@rudrankriyam
rudrankriyam merged commit 649a8cd into rorkai:main May 8, 2026
11 checks passed
@justinseanmartin
justinseanmartin deleted the jmartin/publish-with-metadata branch May 8, 2026 16:50
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

enhancement New feature or request medium Moderate scope with some cross-file or design work p2 Medium priority: useful fix with clear workaround or limited blast radius

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants