Skip to content

cn1:metadata-push goal + App Store submission developer-guide chapter#5353

Open
shai-almog wants to merge 7 commits into
masterfrom
feature/metadata-as-code
Open

cn1:metadata-push goal + App Store submission developer-guide chapter#5353
shai-almog wants to merge 7 commits into
masterfrom
feature/metadata-as-code

Conversation

@shai-almog

@shai-almog shai-almog commented Jul 9, 2026

Copy link
Copy Markdown
Collaborator

Client-side tooling + docs for the build cloud's automated app-store submission (server side: BuildCloud feature/submission-hardening).

cn1:metadata-push goal

Lets developers manage store release metadata as code. It reads a cn1-metadata/{apple,google}/<locale>/*.txt + screenshots/<type>/*.png folder (one file per listing field), builds the descriptor, authenticates with the cached Codename One login token (same account the build uses), and PUTs it — plus uploads screenshots — to the build cloud, which applies it to App Store Connect / Google Play at submission time.

mvn cn1:metadata-push                 # both stores from cn1-metadata/
mvn cn1:metadata-push -Dstore=apple
  • Neutral text file names map to each store's fields (subtitle.txt → App Store subtitle / Google short description); unset files leave the store's value unchanged.
  • Bundle id defaults to codename1.packageName.
  • Auth reuses the plugin's cached JWT; the server endpoint (/appsec/7.0/metadata) is secured by the same bearer chain the build API uses.
  • Pure JDK-8 HttpURLConnection + hand-rolled JSON/multipart (no new plugin deps).

cn1:metadata-init scaffold

mvn cn1:metadata-init scaffolds the cn1-metadata folder (empty field-file template + screenshots folder + README), idempotently, so developers don't hand-create the layout.

Developer guide + website

  • docs/developer-guide/App-Store-Submission.asciidoc (new, registered after the macOS chapter): end-to-end submission flow (console submit, beta vs production, Mac App Store, review status), credentials, and the metadata-as-code workflow (scaffold, folder layout, cn1:metadata-push, apply timing, transient screenshots). No pricing/plan content (that lives on the pricing page).
  • Pricing page: automated-submission feature bullets per tier + an FAQ clarifying that manual submission is always unlimited and free; the limits apply only to the optional automated feature.

🤖 Generated with Claude Code

shai-almog and others added 3 commits July 9, 2026 22:34
…pter

Metadata-as-code client tooling for the Codename One build cloud's automated
app-store submission.

- MetadataPushMojo (goal cn1:metadata-push): reads a cn1-metadata/{apple,google}/
  <locale>/*.txt + screenshots/<type>/*.png folder, builds the store listing
  descriptor, authenticates with the cached Codename One login token, and PUTs it
  (plus uploads screenshots) to the build cloud, which applies it to App Store
  Connect / Google Play at submission. Store text files map to each store's fields;
  unset files are left unchanged. -Dstore=apple|google|both, -DmetadataDir,
  -Dpackage overrides; bundle id defaults to codename1.packageName.
- docs/developer-guide: new App-Store-Submission.asciidoc chapter covering the
  end-to-end submission flow (console single-click submit, beta vs production,
  Mac App Store, review status), credentials, plan tiers/quotas, and the
  metadata-as-code workflow (folder layout, cn1:metadata-push, apply timing,
  transient screenshots, benefits vs manual). Registered after the macOS chapter.

Server side: BuildCloud feature/submission-hardening (machine bearer-JWT endpoint
under /appsec/7.0/metadata).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…int)

The developer-guide snippet validator requires every [source,LANG] block to be
include-backed from docs/demos. The illustrative mvn command block is not a
demo-backed snippet, so use a plain [source] listing (no language) -- the same
form the metadata folder-layout block in this chapter already uses.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
The developer guide describes how the feature works, not commercial terms:
remove the paid-feature paragraph and the plans/quotas table, and the remaining
plan-tier clauses (notification gating, metadata update quota, 'plan limits').
Also drop fastlane references from the chapter and the mojo javadoc.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@github-actions

github-actions Bot commented Jul 9, 2026

Copy link
Copy Markdown
Contributor

Cloudflare Preview

- MetadataInitMojo (goal cn1:metadata-init): scaffolds cn1-metadata/ with an empty
  template of per-locale field files, a screenshots folder, and a README. Idempotent
  (creates only what's missing). Documented in the App Store Submission guide chapter.
- Pricing page: automated-submission feature bullets per tier (Basic beta + metadata
  as code; Pro production + review tracking + 50/mo; Enterprise unlimited + zero-touch).
- Pricing FAQ: clarify that manual submission is always unlimited and free on any
  plan; the limits apply only to the optional automated submission feature.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@github-actions

github-actions Bot commented Jul 9, 2026

Copy link
Copy Markdown
Contributor

Developer Guide build artifacts are available for download from this workflow run:

Developer Guide quality checks:

  • AsciiDoc linter: No issues found (report)
  • Vale: No alerts found (report)
  • Paragraph capitalization: No paragraph capitalization issues (report)
  • LanguageTool: No grammar matches (report)
  • Image references: No unused images detected (report)

@github-actions

github-actions Bot commented Jul 9, 2026

Copy link
Copy Markdown
Contributor

✅ Continuous Quality Report

Test & Coverage

Static Analysis

  • SpotBugs [Report archive]
    • ByteCodeTranslator: 0 findings (no issues)
    • android: 0 findings (no issues)
    • codenameone-maven-plugin: 0 findings (no issues)
    • core-unittests: 0 findings (no issues)
    • ios: 0 findings (no issues)
  • PMD: 0 findings (no issues) [Report archive]
  • Checkstyle: 0 findings (no issues) [Report archive]

Generated automatically by the PR CI workflow.

@shai-almog

shai-almog commented Jul 9, 2026

Copy link
Copy Markdown
Collaborator Author

Compared 144 screenshots: 144 matched.

Native Android coverage

  • 📊 Line coverage: 10.07% (10256/101865 lines covered) [HTML preview] (artifact android-coverage-report, jacocoAndroidReport/html/index.html)
    • Other counters: instruction 8.91% (50416/565997), branch 4.41% (2273/51534), complexity 4.45% (2424/54493), method 6.76% (1910/28265), class 10.87% (437/4020)
    • Lowest covered classes
      • kotlin.collections.kotlin.collections.ArraysKt___ArraysKt – 0.00% (0/6327 lines covered)
      • kotlin.collections.unsigned.kotlin.collections.unsigned.UArraysKt___UArraysKt – 0.00% (0/2384 lines covered)
      • org.jacoco.agent.rt.internal_b6258fc.asm.org.jacoco.agent.rt.internal_b6258fc.asm.ClassReader – 0.00% (0/1519 lines covered)
      • kotlin.collections.kotlin.collections.CollectionsKt___CollectionsKt – 0.00% (0/1148 lines covered)
      • org.jacoco.agent.rt.internal_b6258fc.asm.org.jacoco.agent.rt.internal_b6258fc.asm.MethodWriter – 0.00% (0/923 lines covered)
      • kotlin.sequences.kotlin.sequences.SequencesKt___SequencesKt – 0.00% (0/730 lines covered)
      • com.google.common.cache.com.google.common.cache.LocalCache$Segment – 0.00% (0/726 lines covered)
      • kotlin.text.kotlin.text.StringsKt___StringsKt – 0.00% (0/623 lines covered)
      • org.jacoco.agent.rt.internal_b6258fc.asm.org.jacoco.agent.rt.internal_b6258fc.asm.Frame – 0.00% (0/564 lines covered)
      • kotlin.collections.kotlin.collections.ArraysKt___ArraysJvmKt – 0.00% (0/495 lines covered)

✅ Native Android screenshot tests passed.

Native Android coverage

  • 📊 Line coverage: 10.07% (10256/101865 lines covered) [HTML preview] (artifact android-coverage-report, jacocoAndroidReport/html/index.html)
    • Other counters: instruction 8.91% (50416/565997), branch 4.41% (2273/51534), complexity 4.45% (2424/54493), method 6.76% (1910/28265), class 10.87% (437/4020)
    • Lowest covered classes
      • kotlin.collections.kotlin.collections.ArraysKt___ArraysKt – 0.00% (0/6327 lines covered)
      • kotlin.collections.unsigned.kotlin.collections.unsigned.UArraysKt___UArraysKt – 0.00% (0/2384 lines covered)
      • org.jacoco.agent.rt.internal_b6258fc.asm.org.jacoco.agent.rt.internal_b6258fc.asm.ClassReader – 0.00% (0/1519 lines covered)
      • kotlin.collections.kotlin.collections.CollectionsKt___CollectionsKt – 0.00% (0/1148 lines covered)
      • org.jacoco.agent.rt.internal_b6258fc.asm.org.jacoco.agent.rt.internal_b6258fc.asm.MethodWriter – 0.00% (0/923 lines covered)
      • kotlin.sequences.kotlin.sequences.SequencesKt___SequencesKt – 0.00% (0/730 lines covered)
      • com.google.common.cache.com.google.common.cache.LocalCache$Segment – 0.00% (0/726 lines covered)
      • kotlin.text.kotlin.text.StringsKt___StringsKt – 0.00% (0/623 lines covered)
      • org.jacoco.agent.rt.internal_b6258fc.asm.org.jacoco.agent.rt.internal_b6258fc.asm.Frame – 0.00% (0/564 lines covered)
      • kotlin.collections.kotlin.collections.ArraysKt___ArraysJvmKt – 0.00% (0/495 lines covered)

Benchmark Results

Detailed Performance Metrics

Metric Duration
SIMD kernel backend scalar fallback (no native SIMD)
SIMD int-add (64K x300) java 158ms / native 194ms = 0.8x speedup
SIMD float-mul (64K x300) java 234ms / native 168ms = 1.3x speedup
SIMD kernel correctness PASS (native result == scalar reference)
Base64 payload size 8192 bytes
Base64 benchmark iterations 6000
Base64 SIMD byte path gated to scalar (CPU autovectorizes scalar; explicit SIMD not beneficial here)
Base64 CN1 encode 267.000 ms
Base64 CN1 decode 236.000 ms
Base64 native encode 896.000 ms
Base64 encode ratio (CN1/native) 0.298x (70.2% faster)
Base64 native decode 1570.000 ms
Base64 decode ratio (CN1/native) 0.150x (85.0% faster)
Image encode benchmark status skipped (SIMD unsupported)

@shai-almog

shai-almog commented Jul 9, 2026

Copy link
Copy Markdown
Collaborator Author

Compared 135 screenshots: 135 matched.
✅ JavaScript-port screenshot tests passed.

Use contractions (Microsoft.Contractions), drop 'and so on' and the flagged
adverbs, use American 'afterward', and avoid non-dictionary words (diffable/
revertable) and a false-positive 'the what's-new'. Verified locally: Vale 0/0/0,
LanguageTool 0 matches, snippet validator clean.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@shai-almog

shai-almog commented Jul 9, 2026

Copy link
Copy Markdown
Collaborator Author

Compared 142 screenshots: 142 matched.
✅ Native Mac screenshot tests passed.

Benchmark Results

  • VM Translation Time: 0 seconds
  • Compilation Time: 141 seconds

Detailed Performance Metrics

Metric Duration
SIMD kernel backend SSE2 (x64) / NEON (arm64) native kernels
SIMD int-add (64K x300) java 69ms / native 3ms = 23.0x speedup
SIMD float-mul (64K x300) java 76ms / native 3ms = 25.3x speedup
SIMD kernel correctness PASS (native result == scalar reference)
Base64 payload size 8192 bytes
Base64 benchmark iterations 6000
Base64 SIMD byte path active (NEON-accelerated)
Base64 CN1 encode 420.000 ms
Base64 CN1 decode 237.000 ms
Base64 native encode 13577.000 ms
Base64 encode ratio (CN1/native) 0.031x (96.9% faster)
Base64 native decode 12766.000 ms
Base64 decode ratio (CN1/native) 0.019x (98.1% faster)
Base64 SIMD encode 61.000 ms
Base64 encode ratio (SIMD/CN1) 0.145x (85.5% faster)
Base64 SIMD decode 54.000 ms
Base64 decode ratio (SIMD/CN1) 0.228x (77.2% faster)
Base64 encode ratio (SIMD/native) 0.004x (99.6% faster)
Base64 decode ratio (SIMD/native) 0.004x (99.6% faster)
Image encode benchmark iterations 100
Image createMask (SIMD off) 455.000 ms
Image createMask (SIMD on) 455.000 ms
Image createMask ratio (SIMD on/off) 1.000x (0.0% slower)
Image applyMask (SIMD off) 395.000 ms
Image applyMask (SIMD on) 379.000 ms
Image applyMask ratio (SIMD on/off) 0.959x (4.1% faster)
Image modifyAlpha (SIMD off) 228.000 ms
Image modifyAlpha (SIMD on) 293.000 ms
Image modifyAlpha ratio (SIMD on/off) 1.285x (28.5% slower)
Image modifyAlpha removeColor (SIMD off) 387.000 ms
Image modifyAlpha removeColor (SIMD on) 489.000 ms
Image modifyAlpha removeColor ratio (SIMD on/off) 1.264x (26.4% slower)

@shai-almog

shai-almog commented Jul 9, 2026

Copy link
Copy Markdown
Collaborator Author

Compared 216 screenshots: 216 matched.
✅ Native Apple Watch (watchOS, Core Graphics) screenshot tests passed.

@shai-almog

shai-almog commented Jul 9, 2026

Copy link
Copy Markdown
Collaborator Author

Compared 139 screenshots: 139 matched.
✅ Native Apple TV (tvOS, Metal) screenshot tests passed.

@shai-almog

shai-almog commented Jul 9, 2026

Copy link
Copy Markdown
Collaborator Author

Compared 143 screenshots: 143 matched.
✅ Native iOS Metal screenshot tests passed.

Benchmark Results

  • VM Translation Time: 0 seconds
  • Compilation Time: 296 seconds

Build and Run Timing

Metric Duration
Simulator Boot 68000 ms
Simulator Boot (Run) 1000 ms
App Install 13000 ms
App Launch 3000 ms
Test Execution 491000 ms

Detailed Performance Metrics

Metric Duration
SIMD kernel backend SSE2 (x64) / NEON (arm64) native kernels
SIMD int-add (64K x300) java 251ms / native 7ms = 35.8x speedup
SIMD float-mul (64K x300) java 222ms / native 4ms = 55.5x speedup
SIMD kernel correctness PASS (native result == scalar reference)
Base64 payload size 8192 bytes
Base64 benchmark iterations 6000
Base64 SIMD byte path active (NEON-accelerated)
Base64 CN1 encode 682.000 ms
Base64 CN1 decode 513.000 ms
Base64 native encode 1416.000 ms
Base64 encode ratio (CN1/native) 0.482x (51.8% faster)
Base64 native decode 1198.000 ms
Base64 decode ratio (CN1/native) 0.428x (57.2% faster)
Base64 SIMD encode 107.000 ms
Base64 encode ratio (SIMD/CN1) 0.157x (84.3% faster)
Base64 SIMD decode 84.000 ms
Base64 decode ratio (SIMD/CN1) 0.164x (83.6% faster)
Base64 encode ratio (SIMD/native) 0.076x (92.4% faster)
Base64 decode ratio (SIMD/native) 0.070x (93.0% faster)
Image encode benchmark iterations 100
Image createMask (SIMD off) 61.000 ms
Image createMask (SIMD on) 252.000 ms
Image createMask ratio (SIMD on/off) 4.131x (313.1% slower)
Image applyMask (SIMD off) 879.000 ms
Image applyMask (SIMD on) 490.000 ms
Image applyMask ratio (SIMD on/off) 0.557x (44.3% faster)
Image modifyAlpha (SIMD off) 348.000 ms
Image modifyAlpha (SIMD on) 478.000 ms
Image modifyAlpha ratio (SIMD on/off) 1.374x (37.4% slower)
Image modifyAlpha removeColor (SIMD off) 280.000 ms
Image modifyAlpha removeColor (SIMD on) 255.000 ms
Image modifyAlpha removeColor ratio (SIMD on/off) 0.911x (8.9% faster)

@shai-almog

shai-almog commented Jul 9, 2026

Copy link
Copy Markdown
Collaborator Author

Compared 137 screenshots: 137 matched.
✅ Native iOS screenshot tests passed.

Benchmark Results

  • VM Translation Time: 0 seconds
  • Compilation Time: 278 seconds

Build and Run Timing

Metric Duration
Simulator Boot 99000 ms
Simulator Boot (Run) 2000 ms
App Install 29000 ms
App Launch 4000 ms
Test Execution 543000 ms

Detailed Performance Metrics

Metric Duration
SIMD kernel backend SSE2 (x64) / NEON (arm64) native kernels
SIMD int-add (64K x300) java 60ms / native 5ms = 12.0x speedup
SIMD float-mul (64K x300) java 75ms / native 4ms = 18.7x speedup
SIMD kernel correctness PASS (native result == scalar reference)
Base64 payload size 8192 bytes
Base64 benchmark iterations 6000
Base64 SIMD byte path active (NEON-accelerated)
Base64 CN1 encode 568.000 ms
Base64 CN1 decode 248.000 ms
Base64 native encode 606.000 ms
Base64 encode ratio (CN1/native) 0.937x (6.3% faster)
Base64 native decode 314.000 ms
Base64 decode ratio (CN1/native) 0.790x (21.0% faster)
Base64 SIMD encode 67.000 ms
Base64 encode ratio (SIMD/CN1) 0.118x (88.2% faster)
Base64 SIMD decode 130.000 ms
Base64 decode ratio (SIMD/CN1) 0.524x (47.6% faster)
Base64 encode ratio (SIMD/native) 0.111x (88.9% faster)
Base64 decode ratio (SIMD/native) 0.414x (58.6% faster)
Image encode benchmark iterations 100
Image createMask (SIMD off) 29.000 ms
Image createMask (SIMD on) 3.000 ms
Image createMask ratio (SIMD on/off) 0.103x (89.7% faster)
Image applyMask (SIMD off) 67.000 ms
Image applyMask (SIMD on) 40.000 ms
Image applyMask ratio (SIMD on/off) 0.597x (40.3% faster)
Image modifyAlpha (SIMD off) 79.000 ms
Image modifyAlpha (SIMD on) 50.000 ms
Image modifyAlpha ratio (SIMD on/off) 0.633x (36.7% faster)
Image modifyAlpha removeColor (SIMD off) 157.000 ms
Image modifyAlpha removeColor (SIMD on) 112.000 ms
Image modifyAlpha removeColor ratio (SIMD on/off) 0.713x (28.7% faster)

shai-almog and others added 2 commits July 10, 2026 05:48
…e Android

Broaden the submission chapter into "App Store Submission and Deployment": one
place to reach users on the App Store, Mac App Store, Google Play, Huawei
AppGallery, and Android markets beyond Google Play.

- Document Huawei AppGallery submission (credentials, the console button,
  beta-draft vs production-review).
- New "Reaching Android users beyond Google Play" section: per-store
  distribution-channel packages with the channel id readable via a Codename One
  API (no third-party SDK), each signed with the app's key. Google Play always
  receives the standard, unmodified AAB, so channel packaging never touches the
  Play artifact and can't be challenged by Google.
- Pricing card: multi-store / reach-beyond-Google-Play bullet.

Verified: Vale 0/0/0, LanguageTool 0 matches, snippet validator clean.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Completes the client tier of multi-store Android distribution: the Android port
reads the channel id the build server's channel packages stamp into the APK
Signing Block (BuildDaemon ApkChannelWriter) and exposes it via
Display.getProperty("DistributionChannel") -- so apps report their install source
with no third-party channel SDK.

- AndroidImplementation.getProperty: new "DistributionChannel"/"cn1.channel" keys.
- Reader mirrors the daemon writer's signing-block walk (same CN1 channel pair id),
  reads once from the running APK (getApplicationInfo().sourceDir) and caches it;
  returns the default (empty) for a normal Google Play build.
- Guide: document the concrete API call.

Doc gates green (Vale 0/0/0, LanguageTool 0, snippets clean). Server: BuildCloud
#89; daemon writer: BuildDaemon #149.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant