@getrheo/rheo-skill 2.5.0 → 2.6.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -1
- package/package.json +3 -3
- package/rheo/SKILL.md +3 -3
- package/rheo/rheo-best-practices/SKILL.md +2 -2
- package/rheo/rheo-best-practices/references/implement-workflow.md +1 -1
- package/rheo/rheo-best-practices/references/integrations.md +16 -3
- package/rheo/rheo-best-practices/references/react-native-bare.md +1 -1
- package/rheo/rheo-best-practices/references/react-native-expo.md +2 -2
- package/rheo/rheo-best-practices/references/swiftui.md +2 -0
- package/rheo/rheo-best-practices/references/troubleshooting.md +2 -2
- package/rheo/rheo-flow-import/references/capabilities.md +9 -1
- package/rheo/rheo-flow-import/references/flow-spec.md +11 -1
- package/rheo/rheo-flow-import/references/import-workflow.md +1 -1
- package/rheo/rheo-flow-import/references/manifest-agent-profile-fallback.md +1 -1
- package/rheo/rheo-flow-import/references/manifest-rules.md +1 -1
- package/rheo/rheo-flow-import/references/publish-gates.md +2 -2
- package/rheo/rheo-flow-import/references/react-native-source-patterns.md +3 -1
- package/rheo/rheo-flow-import/references/swiftui-source-patterns.md +2 -0
- package/rheo/rheo-flow-import/scripts/lib/rheo-cli.mjs +1243 -25
package/README.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# @getrheo/rheo-skill
|
|
2
2
|
|
|
3
|
-
Current release: **`2.
|
|
3
|
+
Current release: **`2.6.0`** on npm (`PLATFORM_SDK_VERSION` in `scripts/publish-package-registry.mjs`). Public source: [getrheo/rheo-skill](https://github.com/getrheo/rheo-skill) (mirrored from this private monorepo via `pnpm extract:oss-repos`).
|
|
4
4
|
|
|
5
5
|
Source and build tooling for the **`rheo`** agent skill — a single, self-contained
|
|
6
6
|
skill with two sub-skills:
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@getrheo/rheo-skill",
|
|
3
|
-
"version": "2.
|
|
3
|
+
"version": "2.6.0",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"description": "Rheo agent skill — SDK install guidance and flow manifest import tooling.",
|
|
6
6
|
"main": "./src/index.ts",
|
|
@@ -9,8 +9,8 @@
|
|
|
9
9
|
".": "./src/index.ts"
|
|
10
10
|
},
|
|
11
11
|
"dependencies": {
|
|
12
|
-
"@getrheo/contracts": "2.
|
|
13
|
-
"@getrheo/flow-runtime": "2.
|
|
12
|
+
"@getrheo/contracts": "2.6.0",
|
|
13
|
+
"@getrheo/flow-runtime": "2.6.0",
|
|
14
14
|
"zod": "^3.23.8"
|
|
15
15
|
},
|
|
16
16
|
"devDependencies": {
|
package/rheo/SKILL.md
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: rheo
|
|
3
|
-
description: Work with Rheo, the headless onboarding/paywall flow engine for mobile apps. Use when a user wants to install or wire the Rheo SDK (React Native, Expo, or SwiftUI), follow Rheo SDK best practices, configure integrations (RevenueCat, AppsFlyer), wire auth/permissions/terminal callbacks, OR import/migrate an existing mobile flow into a compliant Rheo FlowManifest and validate it. Routes to the `rheo-best-practices` and `rheo-flow-import` sub-skills.
|
|
3
|
+
description: Work with Rheo, the headless onboarding/paywall flow engine for mobile apps. Use when a user wants to install or wire the Rheo SDK (React Native, Expo, or SwiftUI), follow Rheo SDK best practices, configure integrations (RevenueCat, Superwall, AppsFlyer), wire auth/permissions/terminal callbacks, OR import/migrate an existing mobile flow into a compliant Rheo FlowManifest and validate it. Routes to the `rheo-best-practices` and `rheo-flow-import` sub-skills.
|
|
4
4
|
compatibility: Requires Node.js 20+. rheo-flow-import scripts are fully self-contained (no install step). Internet access fetches the latest Manifest Agent Profile; a bundled fallback works offline.
|
|
5
5
|
metadata:
|
|
6
|
-
rheo-version: "2.
|
|
6
|
+
rheo-version: "2.6.0"
|
|
7
7
|
manifest-schema-version: "7"
|
|
8
8
|
---
|
|
9
9
|
|
|
@@ -15,7 +15,7 @@ Rheo is a headless flow engine: a hosted dashboard authors onboarding, paywall,
|
|
|
15
15
|
|
|
16
16
|
| The user wants to… | Use sub-skill | Read |
|
|
17
17
|
|--------------------|---------------|------|
|
|
18
|
-
| Install the Rheo SDK, wire `Flow`/`FlowView`, follow SDK best practices, configure RevenueCat / AppsFlyer / auth / permissions / terminal callbacks, or implement Rheo in an existing app | **rheo-best-practices** | [rheo-best-practices/SKILL.md](rheo-best-practices/SKILL.md) |
|
|
18
|
+
| Install the Rheo SDK, wire `Flow`/`FlowView`, follow SDK best practices, configure RevenueCat / Superwall / AppsFlyer / auth / permissions / terminal callbacks, or implement Rheo in an existing app | **rheo-best-practices** | [rheo-best-practices/SKILL.md](rheo-best-practices/SKILL.md) |
|
|
19
19
|
| Analyze an existing mobile onboarding/paywall/setup flow and export it as a compliant Rheo `FlowManifest` (or validate/repair a manifest) | **rheo-flow-import** | [rheo-flow-import/SKILL.md](rheo-flow-import/SKILL.md) |
|
|
20
20
|
|
|
21
21
|
If a request spans both (e.g. "import my onboarding **and** wire the SDK"), run **rheo-flow-import** to produce the manifest first, then **rheo-best-practices** to implement the SDK — they are independent and can be done in sequence.
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: rheo-best-practices
|
|
3
|
-
description: Install and wire the Rheo SDK in a host app and follow Rheo implementation best practices. Use when a user asks to install Rheo, add @getrheo/react-native-expo or @getrheo/react-native-bare or RheoSwiftUI, wrap a flow host in RheoProvider, render Flow/FlowView, wire terminal callbacks, configure RevenueCat or AppsFlyer integrations, wire OAuth or email/password auth callbacks, request OS permissions, or add in-app review. Part of the `rheo` skill.
|
|
3
|
+
description: Install and wire the Rheo SDK in a host app and follow Rheo implementation best practices. Use when a user asks to install Rheo, add @getrheo/react-native-expo or @getrheo/react-native-bare or RheoSwiftUI, wrap a flow host in RheoProvider, render Flow/FlowView, wire terminal callbacks, configure RevenueCat, Superwall, or AppsFlyer integrations, wire OAuth or email/password auth callbacks, request OS permissions, or add in-app review. Part of the `rheo` skill.
|
|
4
4
|
---
|
|
5
5
|
|
|
6
6
|
# Rheo — Best Practices (SDK implementation)
|
|
@@ -30,7 +30,7 @@ Only install packages or edit host code when the user explicitly asks for implem
|
|
|
30
30
|
- **Pass the channel public id**, not a flow id, to `Flow` / `FlowView`.
|
|
31
31
|
- **Preserve the existing onboarding** as a fallback/rollback path (feature flag or route swap) unless the user explicitly asks to remove it.
|
|
32
32
|
- **Read local conventions first** (package manager, navigation, env handling) and keep edits localized to the integration entry point and app config.
|
|
33
|
-
- **RevenueCat and AppsFlyer are host integrations**, not SDK peers — the host configures and owns those SDKs and their secrets. Wire `fallback` for every Integration / External Surface Node.
|
|
33
|
+
- **RevenueCat, Superwall, and AppsFlyer are host integrations**, not SDK peers — the host configures and owns those SDKs and their secrets. Wire `fallback` for every Integration / External Surface Node.
|
|
34
34
|
- **External Surface Nodes** need a host `externalSurfaces` registry keyed by Host key (`config.hostKey` or `surf_*` id; callbacks `onComplete` / `onBack` / `onDismiss`). No App settings toggle.
|
|
35
35
|
- **Do not add `request_app_review`** prompts unless the user explicitly asks; Apple discourages prompting from raw button taps.
|
|
36
36
|
- Run the **narrowest useful verification** (typecheck or a build of the touched module), not a full app build, unless asked.
|
|
@@ -15,7 +15,7 @@ Use this when the user explicitly asks to install or wire Rheo in a host app.
|
|
|
15
15
|
6. Replace or gate the existing onboarding entry with the Rheo runtime component.
|
|
16
16
|
7. Preserve old onboarding as a fallback/rollback path unless explicitly told to remove it.
|
|
17
17
|
8. Wire terminal callbacks to continue host navigation.
|
|
18
|
-
9. Install **`@getrheo/react-native-expo`** or **`@getrheo/react-native-bare`** with all required peers (see platform reference). Wire optional auth, RevenueCat, AppsFlyer (host packages only), and resolve fallback when used.
|
|
18
|
+
9. Install **`@getrheo/react-native-expo`** or **`@getrheo/react-native-bare`** with all required peers (see platform reference). Wire optional auth, RevenueCat, Superwall, AppsFlyer (host packages only), and resolve fallback when used.
|
|
19
19
|
10. When `request_app_review` is present, tell the user TestFlight/production may not show prompts every tap and builder preview always advances as `not_shown`.
|
|
20
20
|
11. Run the narrowest useful verification.
|
|
21
21
|
|
|
@@ -4,7 +4,7 @@ In the flow builder, partner paywalls and host UI are **two add-menu nodes** tha
|
|
|
4
4
|
|
|
5
5
|
| Builder node | Manifest `config.provider` | App settings toggle |
|
|
6
6
|
| --- | --- | --- |
|
|
7
|
-
| **Integration Node** | `revenuecat` (and future partners) | Required |
|
|
7
|
+
| **Integration Node** | `revenuecat`, `superwall` (and future partners) | Required |
|
|
8
8
|
| **External Surface Node** | `headless` | None (host registry) |
|
|
9
9
|
|
|
10
10
|
## RevenueCat (Integration Node)
|
|
@@ -24,9 +24,22 @@ Manifest mapping:
|
|
|
24
24
|
|
|
25
25
|
The host remains responsible for configuring RevenueCat. Rheo does not own purchase SDK secrets or receipt validation.
|
|
26
26
|
|
|
27
|
+
## Superwall (Integration Node)
|
|
28
|
+
|
|
29
|
+
Detect source calls such as `Superwall.configure`, `SuperwallProvider`, `expo-superwall`, `@superwall/react-native-superwall`, or `register(placement:)` / `registerPlacement`.
|
|
30
|
+
|
|
31
|
+
Manifest mapping:
|
|
32
|
+
|
|
33
|
+
- Create an **Integration Node** with `config.provider: "superwall"`.
|
|
34
|
+
- Preserve the placement id from the Superwall dashboard / source.
|
|
35
|
+
- Wire the same IAP outcomes as RevenueCat (`purchase_completed`, `restore_completed`, `purchase_cancelled`, `dismissed`, `failed`).
|
|
36
|
+
- Always wire `fallback`.
|
|
37
|
+
|
|
38
|
+
The host remains responsible for configuring Superwall. Rheo registers the placement and maps dismiss / skip / error callbacks to normalized outcomes. Skip / holdout / already-entitled paths map to `dismissed`.
|
|
39
|
+
|
|
27
40
|
## External Surface Node (headless host UI)
|
|
28
41
|
|
|
29
|
-
Use when a source screen is owned by the host (custom native UI, third-party screen Rheo does not ship) rather than a Rheo layer tree or
|
|
42
|
+
Use when a source screen is owned by the host (custom native UI, third-party screen Rheo does not ship) rather than a Rheo layer tree or a partner paywall.
|
|
30
43
|
|
|
31
44
|
Manifest mapping:
|
|
32
45
|
|
|
@@ -53,7 +66,7 @@ Host wiring (required for success):
|
|
|
53
66
|
|
|
54
67
|
SwiftUI / Flutter: pass the same map on `FlowView` as `externalSurfaces` (builders receive `onComplete` / `onBack` / `onDismiss`). Docs: product Developer Guide → Headless external surfaces.
|
|
55
68
|
|
|
56
|
-
Do **not** use an External Surface Node to wrap RevenueCat when you need `iap_purchase` commerce events — use an Integration Node with `provider: "revenuecat"`.
|
|
69
|
+
Do **not** use an External Surface Node to wrap RevenueCat or Superwall when you need `iap_purchase` commerce events — use an Integration Node with `provider: "revenuecat"` or `provider: "superwall"`.
|
|
57
70
|
|
|
58
71
|
## AppsFlyer
|
|
59
72
|
|
|
@@ -15,7 +15,7 @@ pnpm add @getrheo/react-native-bare \
|
|
|
15
15
|
react-native-safe-area-context react-native-in-app-review react-native-video
|
|
16
16
|
```
|
|
17
17
|
|
|
18
|
-
**Integrations (host only):** `react-native-appsflyer`, `react-native-purchases`, `react-native-purchases-ui` when needed. External Surface Nodes use `Flow` `externalSurfaces` (no extra native peer).
|
|
18
|
+
**Integrations (host only):** `react-native-appsflyer`, `react-native-purchases`, `react-native-purchases-ui`, `@superwall/react-native-superwall` when needed. External Surface Nodes use `Flow` `externalSurfaces` (no extra native peer).
|
|
19
19
|
|
|
20
20
|
## Minimal Runtime
|
|
21
21
|
|
|
@@ -15,7 +15,7 @@ pnpm add @getrheo/react-native-expo \
|
|
|
15
15
|
react-native-safe-area-context expo-store-review expo-video
|
|
16
16
|
```
|
|
17
17
|
|
|
18
|
-
**Integrations (host only, not SDK peers):** `react-native-appsflyer`, `react-native-purchases`, `react-native-purchases-ui` when the flow uses attribution or
|
|
18
|
+
**Integrations (host only, not SDK peers):** `react-native-appsflyer`, `react-native-purchases`, `react-native-purchases-ui`, `expo-superwall` / `@superwall/react-native-superwall` when the flow uses attribution, RevenueCat, or Superwall Integration Nodes. External Surface Nodes use `Flow` / `useFlow` `externalSurfaces` (no extra native peer).
|
|
19
19
|
|
|
20
20
|
## Minimal Runtime
|
|
21
21
|
|
|
@@ -46,4 +46,4 @@ export const OnboardingHost = () => (
|
|
|
46
46
|
- Pass channel public id, not flow id.
|
|
47
47
|
- **Production:** default API is `https://api.getrheo.io`; omit `apiBaseUrl` unless self-hosting. Never use localhost with `ob_pk_live_*` keys.
|
|
48
48
|
- Built-in OS permissions need `react-native-permissions` native setup (Expo plugin + Info.plist).
|
|
49
|
-
- Expo Go cannot run native RevenueCat UI; use a dev client.
|
|
49
|
+
- Expo Go cannot run native RevenueCat or Superwall UI; use a dev client.
|
|
@@ -16,6 +16,7 @@ Optional products:
|
|
|
16
16
|
|
|
17
17
|
```swift
|
|
18
18
|
.product(name: "RheoSwiftUIRevenueCat", package: "RheoSwiftUI")
|
|
19
|
+
.product(name: "RheoSwiftUISuperwall", package: "RheoSwiftUI")
|
|
19
20
|
.product(name: "RheoSwiftUIAppsFlyer", package: "RheoSwiftUI")
|
|
20
21
|
```
|
|
21
22
|
|
|
@@ -47,6 +48,7 @@ struct OnboardingHost: View {
|
|
|
47
48
|
## Notes
|
|
48
49
|
|
|
49
50
|
- Use `RheoSwiftUIRevenueCat` for RevenueCat Integration Node presenter helpers.
|
|
51
|
+
- Use `RheoSwiftUISuperwall` for Superwall Integration Node presenter helpers.
|
|
50
52
|
- External Surface Nodes: pass `externalSurfaces: [surfId: { ctx in AnyView(...) }]` on `FlowView` (`ctx.onComplete` / `onBack` / `onDismiss`).
|
|
51
53
|
- Use `RheoSwiftUIAppsFlyer` for AppsFlyer attribution providers.
|
|
52
54
|
- Host apps must include Info.plist usage strings for authored permission prompts.
|
|
@@ -38,11 +38,11 @@ Fix workflow:
|
|
|
38
38
|
|
|
39
39
|
## Missing Fallback Edge
|
|
40
40
|
|
|
41
|
-
Every Integration / External Surface Node needs `fallback`. Outcomes that are not explicitly mapped (RevenueCat purchase outcomes or headless `completed` / `back` / `dismissed`) fall through to this target.
|
|
41
|
+
Every Integration / External Surface Node needs `fallback`. Outcomes that are not explicitly mapped (RevenueCat / Superwall purchase outcomes or headless `completed` / `back` / `dismissed`) fall through to this target.
|
|
42
42
|
|
|
43
43
|
## Integration Disabled
|
|
44
44
|
|
|
45
|
-
The manifest may validate locally but fail dashboard import if the target app has RevenueCat disabled or the workspace lacks integration entitlements.
|
|
45
|
+
The manifest may validate locally but fail dashboard import if the target app has RevenueCat / Superwall disabled or the workspace lacks integration entitlements.
|
|
46
46
|
|
|
47
47
|
## Wrong Environment
|
|
48
48
|
|
|
@@ -27,6 +27,12 @@ Every layer `kind` accepted by the manifest:
|
|
|
27
27
|
- `text_input`
|
|
28
28
|
- `scale_input`
|
|
29
29
|
- `wheel_picker`
|
|
30
|
+
- `date_time_input`
|
|
31
|
+
- `number_stepper`
|
|
32
|
+
- `number_stepper_button`
|
|
33
|
+
- `number_stepper_value`
|
|
34
|
+
- `phone_input`
|
|
35
|
+
- `address_input`
|
|
30
36
|
- `oauth_provider`
|
|
31
37
|
- `oauth_login`
|
|
32
38
|
- `email_password_auth`
|
|
@@ -113,8 +119,10 @@ Valid `permissionKey` values for `request_os_permission`:
|
|
|
113
119
|
|
|
114
120
|
## External surface outcomes
|
|
115
121
|
|
|
116
|
-
Builder add-menu kinds share `externalSurfaceNodes`: **Integration Node** (partner providers such as RevenueCat) and **External Surface Node** (`provider: "headless"`). Every node needs a `fallback` jump target.
|
|
122
|
+
Builder add-menu kinds share `externalSurfaceNodes`: **Integration Node** (partner providers such as RevenueCat / Superwall) and **External Surface Node** (`provider: "headless"`). Every node needs a `fallback` jump target.
|
|
117
123
|
|
|
118
124
|
**Integration Node / RevenueCat** (`provider: "revenuecat"`): `purchase_completed`, `purchase_cancelled`, `dismissed`, `failed`, `restore_completed`.
|
|
119
125
|
|
|
126
|
+
**Integration Node / Superwall** (`provider: "superwall"`): `purchase_completed`, `purchase_cancelled`, `dismissed`, `failed`, `restore_completed`.
|
|
127
|
+
|
|
120
128
|
**External Surface Node / Headless** (`provider: "headless"`): `completed`, `back`, `dismissed`, `failed`. Host apps register UI via `externalSurfaces[hostKey]` (`config.hostKey` or node id) with `onComplete` / `onBack` / `onDismiss`.
|
|
@@ -200,7 +200,7 @@ instead of a plain footer CTA ([carousel-import.md](carousel-import.md)).
|
|
|
200
200
|
|
|
201
201
|
`decisions` accepts full `@getrheo/contracts` `DecisionNode` objects (the scaffold
|
|
202
202
|
passes them through). External surfaces use `externalSurfaces` (builder:
|
|
203
|
-
**Integration Node** for `revenuecat`, **External Surface Node** for `headless`):
|
|
203
|
+
**Integration Node** for `revenuecat` / `superwall`, **External Surface Node** for `headless`):
|
|
204
204
|
|
|
205
205
|
```jsonc
|
|
206
206
|
{
|
|
@@ -213,6 +213,16 @@ passes them through). External surfaces use `externalSurfaces` (builder:
|
|
|
213
213
|
}
|
|
214
214
|
```
|
|
215
215
|
|
|
216
|
+
```jsonc
|
|
217
|
+
{
|
|
218
|
+
"id": "surf_sw_paywall",
|
|
219
|
+
"provider": "superwall",
|
|
220
|
+
"placementId": "campaign_trigger",
|
|
221
|
+
"outcomes": { "purchase_completed": "scr_done", "restore_completed": "scr_done", "dismissed": "scr_offer2" },
|
|
222
|
+
"fallback": "scr_offer2" // required — Integration Node; placementId optional (uses app defaultPlacementId)
|
|
223
|
+
}
|
|
224
|
+
```
|
|
225
|
+
|
|
216
226
|
```jsonc
|
|
217
227
|
{
|
|
218
228
|
"id": "surf_custom_step",
|
|
@@ -109,7 +109,7 @@ If the user has not named an entry point, stop after question 1 and wait for an
|
|
|
109
109
|
18. Generate `rheo-import.manifest.json`:
|
|
110
110
|
- Emit a complete graph with explicit `next.default` edges.
|
|
111
111
|
- Use decision nodes for clear branches.
|
|
112
|
-
- Use RevenueCat
|
|
112
|
+
- Use RevenueCat / Superwall **Integration Nodes** for detected partner paywalls (`provider: "revenuecat"` or `"superwall"`).
|
|
113
113
|
- Prefer fidelity when the user chose visual fidelity: carousels, gradients, shadows, and centered stacks.
|
|
114
114
|
- **Layer ids:** `scr_*` / `lyr_*` only on screens and layers; UUID placeholders **only** for `media.mediaAssetId` and font sidecars ([layer-schema-pitfalls.md](layer-schema-pitfalls.md#layer-ids-vs-media-placeholder-uuids)).
|
|
115
115
|
- **Container layers:** every `button`, `back_button`, `hyperlink`, `stack`, choice input, and auth layer must include its `children` (or `slides`) array ([manifest-rules.md](manifest-rules.md#container-layers-required-children)).
|
|
@@ -67,7 +67,7 @@ Use only: `stack`, `text`, `image`, `lottie`, `video`, `icon`, `button`, `back_b
|
|
|
67
67
|
- Black-and-white fallback is acceptable only when the audit finds no style/token evidence and the user confirms no theme source.
|
|
68
68
|
- Use at most one input layer kind per **active path** (`single_choice`, `multiple_choice`, `text_input`, `scale_input`, `wheel_picker`) — one per screen unless sibling `conditional` branches split the path.
|
|
69
69
|
- Non-reserved `sdk.*` decision keys must be listed in `sdkAttributeKeys`.
|
|
70
|
-
- RevenueCat **Integration Nodes** and headless **External Surface Nodes** both live in `externalSurfaceNodes` and always need `fallback`.
|
|
70
|
+
- RevenueCat / Superwall **Integration Nodes** and headless **External Surface Nodes** both live in `externalSurfaceNodes` and always need `fallback`.
|
|
71
71
|
- Emit complete graph edges for imported flows.
|
|
72
72
|
- Use placeholder UUID media ids and `rheo-import.assets.json`; never put file paths directly in `mediaAssetId`.
|
|
73
73
|
- Do not silently drop media layers. If a traced asset cannot be copied, report the missing file and do not call the import complete.
|
|
@@ -197,7 +197,7 @@ Use `conditional` when the source renders different content on **one** screen ba
|
|
|
197
197
|
|
|
198
198
|
In the builder UI these are two add-menu kinds sharing `externalSurfaceNodes`:
|
|
199
199
|
|
|
200
|
-
- **Integration Node** — RevenueCat paywalls become nodes with provider `revenuecat`.
|
|
200
|
+
- **Integration Node** — RevenueCat / Superwall paywalls become nodes with provider `revenuecat` or `superwall`.
|
|
201
201
|
- **External Surface Node** — Host-owned custom screens become nodes with provider `headless` (stable `surf_*` id; optional `config.hostKey` for the host `externalSurfaces` registry).
|
|
202
202
|
- Every node needs a `fallback`.
|
|
203
203
|
- Map paywall outcomes to `purchase_completed`, `restore_completed`, `dismissed`, and `failed`.
|
|
@@ -45,9 +45,9 @@ These mirror `apps/web/src/features/builder/validateFlow.ts` and API `preflightP
|
|
|
45
45
|
|
|
46
46
|
### Integrations (default: enabled)
|
|
47
47
|
|
|
48
|
-
- External surfaces need `config.provider` (not `unspecified`). Integration Nodes use partner providers such as `revenuecat`; External Surface Nodes use `headless`.
|
|
48
|
+
- External surfaces need `config.provider` (not `unspecified`). Integration Nodes use partner providers such as `revenuecat` or `superwall`; External Surface Nodes use `headless`.
|
|
49
49
|
- Every external surface needs `fallback`.
|
|
50
|
-
- RevenueCat surfaces require
|
|
50
|
+
- RevenueCat / Superwall surfaces require the matching integration enabled (import assumes enabled).
|
|
51
51
|
- External Surface Nodes (`provider: "headless"`) do not require an App settings toggle; the host must supply `externalSurfaces`.
|
|
52
52
|
|
|
53
53
|
### Canvas editor gates (default: all enabled)
|
|
@@ -84,10 +84,12 @@ Paging is swipe by default; map the pager's own next button to a `button` with
|
|
|
84
84
|
|
|
85
85
|
- `react-native-purchases` / `react-native-purchases-ui` / `Purchases.configure`
|
|
86
86
|
/ a `<Paywall>` → a RevenueCat **Integration Node** (`provider: "revenuecat"`,
|
|
87
|
+
required `fallback`). `expo-superwall` / `@superwall/react-native-superwall` /
|
|
88
|
+
`registerPlacement` → a Superwall **Integration Node** (`provider: "superwall"`,
|
|
87
89
|
required `fallback`). Host-owned custom screens → an **External Surface Node**
|
|
88
90
|
(`provider: "headless"`). See [integrations](../../rheo-best-practices/references/integrations.md).
|
|
89
91
|
- `react-native-appsflyer` → represent stable attribution branches via decision
|
|
90
|
-
nodes; add keys to `sdkAttributeKeys`. Never include AppsFlyer/RevenueCat secrets.
|
|
92
|
+
nodes; add keys to `sdkAttributeKeys`. Never include AppsFlyer/RevenueCat/Superwall secrets.
|
|
91
93
|
- OAuth / email-password screens → `oauth_login` / `email_password_auth` (host
|
|
92
94
|
owns the actual auth logic).
|
|
93
95
|
- `react-native-permissions` prompts → a `request_os_permission` button action.
|
|
@@ -81,6 +81,8 @@ page. Paging is swipe by default; an explicit Next button becomes a `button` wit
|
|
|
81
81
|
|
|
82
82
|
- RevenueCat (`Purchases.configure`, `RevenueCatUI` `PaywallView`, `.presentPaywall`)
|
|
83
83
|
→ a RevenueCat **Integration Node** (`provider: "revenuecat"`, required
|
|
84
|
+
`fallback`). Superwall (`Superwall.configure`, `register(placement:)`)
|
|
85
|
+
→ a Superwall **Integration Node** (`provider: "superwall"`, required
|
|
84
86
|
`fallback`). Host-owned custom screens → an **External Surface Node**
|
|
85
87
|
(`provider: "headless"`). See [integrations](../../rheo-best-practices/references/integrations.md).
|
|
86
88
|
- AppsFlyer (`AppsFlyerLib`) → represent stable attribution branches via decision
|