Skip to content

4.0.2#11

Merged
Alexays merged 49 commits into
masterfrom
dev-4.0.0
Jul 8, 2026
Merged

4.0.2#11
Alexays merged 49 commits into
masterfrom
dev-4.0.0

Conversation

@Alexays

@Alexays Alexays commented Jun 18, 2026

Copy link
Copy Markdown
Contributor

PR unique consolidant toute la récupération de la branche dev + la migration native 4.0.0. Remplace les PRs précédentes (#8, #9, #10), fermées.

⚠️ À merger une fois le SDK natif app.screeb.sdk:survey / pod Screeb 4.0.0 publié. En attendant, maui-android est rouge (4.0.0 introuvable) — attendu.

Récupéré de dev

  • Svelte : SDK + exemple + workflow publish
  • Privacy helpers ScreebMaskText / ScreebNoCapture / ScreebId sur browser, react, vue, angular, flutter, React Native, et MAUI (ScreebView)
  • Tooling versions : sdk-versions.json + versions:sync/versions:check
  • Scripts : verify-release, report-sdk-sizes, build-local-ios-xcframework + scripts npm (ci:js, examples:*, docs:reference:*…)
  • Tests : MAUI (ScreebHooksTests, ScreebUtilsTests), Flutter (hooks + privacy widgets), typecheck RN
  • Apps d'exemple + configs divers
  • CI self-hosted : jobs Android natifs séparés, KMP avec skip-guard, flutter test, typecheck RN

Activation native 4.0.0

  • Bump survey/pod → 4.0.0 partout via versions:sync (versions:check ✅)
  • Binding hooks natif MAUI 4.0.0 (MakeHooks/onHookResult : HooksAndroid/HooksIOS/ApiDefinitions/…)
  • Transform Transforms/AndroidMetadata.xml activé
  • Dépendances Maven transitives MAUI étendues pour 4.0.0

Volontairement gardé à master (pas régressé)

Versions de wrappers publiées, URLs repo ScreebApp/sdk, custom endpoints du browser, tests browser — là où dev était en retard.

Vérifs

  • JS : build (7 projets) ✅ · lint ✅ · versions:check
  • Natif : maui-android 🔴 attendu jusqu'à publication 4.0.0 ; Flutter ✅ ; KMP skip-guard (s'auto-active à la publication)

Alexays and others added 25 commits July 2, 2026 17:38
- kmp: add handleDeepLink() to forward editor/inspector deep links to the
  native SDK (Android forwards, iOS no-op via standard UIApplication flow)
- flutter: force-enable accessibility semantics so the session-replay mirror
  can read the widget tree (best-effort, kept alive via SemanticsHandle)
- angular: make surveyStart distributionId/allowMultipleResponses optional
- maui: support local-dev binding via SCREEB_USE_LOCAL_SDK
- bump app.screeb.sdk:survey 4.0.0 -> 4.0.1 (flutter, kmp, reactnative, maui)

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
- overhaul example apps with per-feature action buttons and result output
  across react, vue, svelte, angular, ionic, flutter, expo, kmp, rn, maui
- wire deep-link forwarding to Screeb.handleDeepLink (native activities +
  new expo config plugin withScreebDeepLink, expo scheme + web-browser)
- expo: add reanimated/haptics/image/symbols deps, bump expo-router/status-bar
- reactnative: point babel/metro roots at packages/sdk-reactnative
- ignore Android NDK/CMake .cxx build output

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Alexays and others added 10 commits July 2, 2026 17:47
Three root causes, two of them latent behind the npm ci failure:

- JS/TS: sdk-svelte still pinned @screeb/sdk-browser ^0.6.1 while the
  workspace package and all sibling wrappers are at 0.7.0, so npm ci
  found the lock out of sync. Bump to ^0.7.0 and refresh the lock.
- versions:check: the 4.0.1 native bump (47a12de) updated the per-file
  versions but not the sdk-versions.json source of truth. Sync the
  manifest (android 4.0.1, reactNative 3.3.2), which also propagates the
  bump to setSecondarySDK calls and the android example.
- MAUI Android XA4242: survey:4.0.1 requires org.jetbrains.kotlin:
  kotlin-stdlib; Jdk8 alone maps to kotlin-stdlib-jdk8. Add the base
  Xamarin.Kotlin.StdLib package reference.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
CI runs npm 10.8.2 (node 20) and rejected the lock with
"Missing: picomatch@4.0.4". The lock had been regenerated locally with
npm 11, which dedupes differently and omitted the nested
picomatch@4.0.4 under svelte-check. Regenerate with the CI npm version.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Replaces the two loose Swift files with a buildable Xcode project
mirroring example-android: SPM dependency on ScreebApp/sdk-ios-public
(resolves on open, no pod install), programmatic UI with one button per
public API — identity, visitor properties, groups, events, screens,
survey, message, session replay start/stop, debug, close — same demo
channel/survey/message ids as the Android example, deep-link handling
in SceneDelegate. Verified end to end on simulator: builds against the
public 3.2.4 package, SDK boots and the demo channel's survey displays.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…E_LOCAL_SDK

Same convention as example-android's gradle property: SCREEB_USE_LOCAL_SDK=true
./use-sdk.sh flips the Swift package reference to the sibling ../../../sdk-ios
checkout; ./use-sdk.sh flips back to the published sdk-ios-public package.
Xcode has no environment-driven package resolution, so the script rewrites the
single package-reference block in place (idempotent, shared reference id —
nothing else in the project moves). Both directions verified by full builds;
switching back restores the committed pbxproj byte-exact.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Screeb.handleDeepLink was wired but dead code: without CFBundleURLTypes
iOS never routes any URL to the app. Registers screeb-<channelId> (same
convention as example-android's manifest) through a partial Info.plist
merged with the generated one, adds the cold-start path
(connectionOptions.urlContexts) alongside the existing warm-start
handler, and documents a simctl openurl test line. Verified: the built
app's merged Info.plist carries the scheme and simctl openurl routes
the editor deep link to the app from a cold start.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…veys bug

Adds expo-updates (checkAutomatically: NEVER + placeholder URL — no EAS
server needed) and a 'Reload JS (expo-updates)' button that exercises the
exact native relaunch path an applied OTA takes: the JS bundle restarts,
initSdk re-runs against the already-loaded native singleton, and on SDK
<= 4.0.1 the subsequent Screeb webview reload leaves its readiness gate
armed — every later command hits a mid-reload document and surveys never
display again. Fixed in 4.0.2 (native readiness-gate re-arm).

README documents the release-build repro steps (expo-updates is inert in
dev builds).

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

The bottom-anchored demo survey's hitbox swallowed taps on the reload
button; the OTA repro needs it tappable with a survey on screen.
Editor/survey/message deep links (screeb-<channel-id> scheme) could not be
forwarded to the SDK from RN or MAUI hosts — and on Expo managed workflow the
JS-level API is the only possible path (no AppDelegate access). Both wrappers
now expose handleDeepLink(url), wired to the native SDKs on iOS and Android.
…gates

- example-kmp: hand-written iosApp Xcode project (Compose framework build
  phase + local/packaged Screeb.xcframework staging), AccessibilitySyncOptions
  Always (required for the Compose iOS a11y tree, see the KMP docs), deep link
- example-maui: deep-link scheme via PartialAppManifest, OpenUrl forwarding,
  modern launch screen (was letterboxed 320x480)
- example-reactnative: deep-link scheme + AppDelegate forwarding, local-SDK
  and telemetry Podfile gates
- example-expo: deep links forwarded from JS (managed workflow), and
  +native-intent.ts keeps expo-router off Screeb URLs (Unmatched Route)
- example-flutter: telemetry Podfile gate
build-local-ios-xcframework.mjs: emit a recompilable swiftinterface
(preserve-types-as-written — the public class Screeb shadows the module),
optional SCREEB_TELEMETRY compilation, and clean up the ~200MB per-run
workdir. Gitignore the RN Pods dir, .xcode.env.local and stray workdirs.
READMEs default isDebugMode to false.
@Alexays Alexays changed the title 4.0.0 4.0.2 Jul 8, 2026
Alexays added 14 commits July 8, 2026 16:57
…s a no-op)

Editor/survey/message links passed to Screeb.handleDeepLink were silently
dropped on iOS — the actual was an empty stub. Wire it to the native
handleDeepLink through the cinterop binding.
Native SDKs and all mobile wrappers (react-native, flutter, kmp, maui) move
to 4.0.2 via sync-sdk-versions. Publish workflows fetched the iOS xcframework
release as v<version> while sdk-ios-public tags carry no prefix — fixed.
… lock with CI npm

handleDeepLink is exported to ObjC as handleDeepLinkWithUrl: — the Kotlin
binding uses the selector-derived name. package-lock regenerated with npm
10.8.2 (the CI version) so npm ci accepts it.
@Alexays Alexays merged commit c6bded5 into master Jul 8, 2026
7 checks passed
@Alexays Alexays deleted the dev-4.0.0 branch July 9, 2026 06:19
Alexays added a commit that referenced this pull request Jul 9, 2026
* feat(sdk-browser): add ScreebMaskText, ScreebNoCapture and ScreebId DOM helpers

* feat(*): recover Svelte SDK, example and publish workflow from dev

* feat(*): recover SDK version-sync tooling from dev

* fix(*): use npm install in CI to tolerate lockfile/npm version skew

* feat(*): expose ScreebMaskText/ScreebNoCapture/ScreebId in react, vue and angular

* chore(*): recover example apps and remaining npm scripts from dev

* feat(*): recover release/size/local-ios helper scripts from dev

* feat(*): recover ScreebView privacy helpers for MAUI from dev

* feat(*): recover privacy helpers/hooks for Flutter and React Native from dev

* ci(*): run flutter tests and react-native typecheck for recovered features

* fix(*): enable MAUI in csproj for ScreebView and drop 4.0.0-only binding transform

* chore(*): preserve 4.0.0-readiness (local native SDK build support, MAUI binding transform)

* test(*): recover MAUI hooks tests and nested-property util from dev

* feat(*): migrate wrappers to native SDK 4.0.0

* test(*): re-enable browser unit tests and make test scripts intentional everywhere

* chore(*): stop tracking generated docs, fix commitlint scopes, pin Node/editor config

* fix(*): correct READMEs, repo URLs, angular type exports; wire CI checks

* perf(*): target es2020 and minify SDK bundles with terser

* chore(*): deps hygiene (devDeps, eslint-config jest, tarballs, svelte ranges)

* ci(*): pin actions to commit SHA and use npm ci for reproducible installs

* ci(*): drop docs:reference:check from CI (needs sibling docs repo)

* fix(*): native robustness — MAUI privacy-marker crash, KMP cancellation, MAUI bool contract

* fix(*): handle list hook results in MAUI Android marshaller (match iOS)

* feat(*): deep-link API, 4.0.1 native bump, Flutter replay semantics

- kmp: add handleDeepLink() to forward editor/inspector deep links to the
  native SDK (Android forwards, iOS no-op via standard UIApplication flow)
- flutter: force-enable accessibility semantics so the session-replay mirror
  can read the widget tree (best-effort, kept alive via SemanticsHandle)
- angular: make surveyStart distributionId/allowMultipleResponses optional
- maui: support local-dev binding via SCREEB_USE_LOCAL_SDK
- bump app.screeb.sdk:survey 4.0.0 -> 4.0.1 (flutter, kmp, reactnative, maui)

* chore(*): interactive example demos, deep-link wiring, expo deps

- overhaul example apps with per-feature action buttons and result output
  across react, vue, svelte, angular, ionic, flutter, expo, kmp, rn, maui
- wire deep-link forwarding to Screeb.handleDeepLink (native activities +
  new expo config plugin withScreebDeepLink, expo scheme + web-browser)
- expo: add reanimated/haptics/image/symbols deps, bump expo-router/status-bar
- reactnative: point babel/metro roots at packages/sdk-reactnative
- ignore Android NDK/CMake .cxx build output

* fix(*): unblock red CI on 4.0.0 PR

Three root causes, two of them latent behind the npm ci failure:

- JS/TS: sdk-svelte still pinned @screeb/sdk-browser ^0.6.1 while the
  workspace package and all sibling wrappers are at 0.7.0, so npm ci
  found the lock out of sync. Bump to ^0.7.0 and refresh the lock.
- versions:check: the 4.0.1 native bump (47a12de) updated the per-file
  versions but not the sdk-versions.json source of truth. Sync the
  manifest (android 4.0.1, reactNative 3.3.2), which also propagates the
  bump to setSecondarySDK calls and the android example.
- MAUI Android XA4242: survey:4.0.1 requires org.jetbrains.kotlin:
  kotlin-stdlib; Jdk8 alone maps to kotlin-stdlib-jdk8. Add the base
  Xamarin.Kotlin.StdLib package reference.

* fix(*): sync package-lock with npm 10.8.2 (CI) for nested picomatch

CI runs npm 10.8.2 (node 20) and rejected the lock with
"Missing: picomatch@4.0.4". The lock had been regenerated locally with
npm 11, which dedupes differently and omitted the nested
picomatch@4.0.4 under svelte-check. Regenerate with the CI npm version.

* feat(example-ios): complete runnable Xcode project (was a stub)

Replaces the two loose Swift files with a buildable Xcode project
mirroring example-android: SPM dependency on ScreebApp/sdk-ios-public
(resolves on open, no pod install), programmatic UI with one button per
public API — identity, visitor properties, groups, events, screens,
survey, message, session replay start/stop, debug, close — same demo
channel/survey/message ids as the Android example, deep-link handling
in SceneDelegate. Verified end to end on simulator: builds against the
public 3.2.4 package, SDK boots and the demo channel's survey displays.

* feat(example-ios): switch to the local sdk-ios checkout via SCREEB_USE_LOCAL_SDK

Same convention as example-android's gradle property: SCREEB_USE_LOCAL_SDK=true
./use-sdk.sh flips the Swift package reference to the sibling ../../../sdk-ios
checkout; ./use-sdk.sh flips back to the published sdk-ios-public package.
Xcode has no environment-driven package resolution, so the script rewrites the
single package-reference block in place (idempotent, shared reference id —
nothing else in the project moves). Both directions verified by full builds;
switching back restores the committed pbxproj byte-exact.

* fix(example-ios): register the deep-link URL scheme

Screeb.handleDeepLink was wired but dead code: without CFBundleURLTypes
iOS never routes any URL to the app. Registers screeb-<channelId> (same
convention as example-android's manifest) through a partial Info.plist
merged with the generated one, adds the cold-start path
(connectionOptions.urlContexts) alongside the existing warm-start
handler, and documents a simctl openurl test line. Verified: the built
app's merged Info.plist carries the scheme and simctl openurl routes
the editor deep link to the app from a cold start.

* feat(example-expo): expo-updates repro for the post-OTA invisible-surveys bug

Adds expo-updates (checkAutomatically: NEVER + placeholder URL — no EAS
server needed) and a 'Reload JS (expo-updates)' button that exercises the
exact native relaunch path an applied OTA takes: the JS bundle restarts,
initSdk re-runs against the already-loaded native singleton, and on SDK
<= 4.0.1 the subsequent Screeb webview reload leaves its readiness gate
armed — every later command hits a mid-reload document and surveys never
display again. Fixed in 4.0.2 (native readiness-gate re-arm).

README documents the release-build repro steps (expo-updates is inert in
dev builds).

* fix(example-expo): keep the reload button reachable while a survey is displayed

The bottom-anchored demo survey's hitbox swallowed taps on the reload
button; the OTA repro needs it tappable with a survey on screen.

* feat(sdk-reactnative,sdk-maui): expose handleDeepLink in both wrappers

Editor/survey/message deep links (screeb-<channel-id> scheme) could not be
forwarded to the SDK from RN or MAUI hosts — and on Expo managed workflow the
JS-level API is the only possible path (no AppDelegate access). Both wrappers
now expose handleDeepLink(url), wired to the native SDKs on iOS and Android.

* feat(*): iOS example parity — KMP host app, deep links and local-SDK gates

- example-kmp: hand-written iosApp Xcode project (Compose framework build
  phase + local/packaged Screeb.xcframework staging), AccessibilitySyncOptions
  Always (required for the Compose iOS a11y tree, see the KMP docs), deep link
- example-maui: deep-link scheme via PartialAppManifest, OpenUrl forwarding,
  modern launch screen (was letterboxed 320x480)
- example-reactnative: deep-link scheme + AppDelegate forwarding, local-SDK
  and telemetry Podfile gates
- example-expo: deep links forwarded from JS (managed workflow), and
  +native-intent.ts keeps expo-router off Screeb URLs (Unmatched Route)
- example-flutter: telemetry Podfile gate

* chore(*): local iOS xcframework tooling + README debug-mode defaults

build-local-ios-xcframework.mjs: emit a recompilable swiftinterface
(preserve-types-as-written — the public class Screeb shadows the module),
optional SCREEB_TELEMETRY compilation, and clean up the ~200MB per-run
workdir. Gitignore the RN Pods dir, .xcode.env.local and stray workdirs.
READMEs default isDebugMode to false.

* fix(sdk-kmp): forward deep links to the native iOS SDK (the actual was a no-op)

Editor/survey/message links passed to Screeb.handleDeepLink were silently
dropped on iOS — the actual was an empty stub. Wire it to the native
handleDeepLink through the cinterop binding.

* chore(example-flutter): resolve the locally-published Android SDK when SCREEB_USE_LOCAL_SDK=true

* chore(*): pin the native Android SDK to 4.0.2 across wrappers

* chore(*): release 4.0.2 across every wrapper SDK

Native SDKs and all mobile wrappers (react-native, flutter, kmp, maui) move
to 4.0.2 via sync-sdk-versions. Publish workflows fetched the iOS xcframework
release as v<version> while sdk-ios-public tags carry no prefix — fixed.

* docs(sdk-flutter): changelog 4.0.2

* chore(sdk-maui): fix the iOS native LICENSE copyright holder and year

* chore(*): sync package-lock with the 4.0.2 wrapper bump

* ci(*): pin the .NET 9 SDK in the MAUI publish (runner defaults to .NET 10)

* fix(sdk-kmp): use the cinterop selector name for handleDeepLink; sync lock with CI npm

handleDeepLink is exported to ObjC as handleDeepLinkWithUrl: — the Kotlin
binding uses the selector-derived name. package-lock regenerated with npm
10.8.2 (the CI version) so npm ci accepts it.

* ci(*): the MAUI binding needs the maui-android/maui-ios workloads

* ci(*): restore the npm upgrade before publish — trusted publishing needs npm >= 11.5

* ci(*): authenticated xcframework download in the KMP publish (anonymous API is rate-limited)

* ci(sdk-kmp): publish via the Central Portal, legacy s01 endpoint returns 402

* fix(sdk-kmp): publish tasks depend on all sign tasks (shared javadoc asc)

---------
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