@getrheo/rheo-skill 1.0.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 +76 -0
- package/package.json +51 -0
- package/rheo/SKILL.md +32 -0
- package/rheo/rheo-best-practices/SKILL.md +46 -0
- package/rheo/rheo-best-practices/examples/react-native-install-snippet.md +23 -0
- package/rheo/rheo-best-practices/examples/swiftui-install-snippet.md +20 -0
- package/rheo/rheo-best-practices/references/implement-workflow.md +27 -0
- package/rheo/rheo-best-practices/references/integrations.md +51 -0
- package/rheo/rheo-best-practices/references/react-native-bare.md +36 -0
- package/rheo/rheo-best-practices/references/react-native-expo.md +49 -0
- package/rheo/rheo-best-practices/references/swiftui.md +52 -0
- package/rheo/rheo-best-practices/references/troubleshooting.md +57 -0
- package/rheo/rheo-flow-import/SKILL.md +68 -0
- package/rheo/rheo-flow-import/examples/branching-onboarding.manifest.json +155 -0
- package/rheo/rheo-flow-import/examples/flow-spec.example.json +56 -0
- package/rheo/rheo-flow-import/examples/linear-onboarding.manifest.json +104 -0
- package/rheo/rheo-flow-import/examples/revenuecat-paywall.manifest.json +154 -0
- package/rheo/rheo-flow-import/references/animation-import.md +79 -0
- package/rheo/rheo-flow-import/references/capabilities.md +107 -0
- package/rheo/rheo-flow-import/references/carousel-import.md +64 -0
- package/rheo/rheo-flow-import/references/flow-spec.md +214 -0
- package/rheo/rheo-flow-import/references/font-import.md +67 -0
- package/rheo/rheo-flow-import/references/import-workflow.md +240 -0
- package/rheo/rheo-flow-import/references/layer-schema-pitfalls.md +179 -0
- package/rheo/rheo-flow-import/references/localization-import.md +128 -0
- package/rheo/rheo-flow-import/references/manifest-agent-profile-fallback.md +74 -0
- package/rheo/rheo-flow-import/references/manifest-rules.md +197 -0
- package/rheo/rheo-flow-import/references/publish-gates.md +91 -0
- package/rheo/rheo-flow-import/references/react-native-source-patterns.md +99 -0
- package/rheo/rheo-flow-import/references/swiftui-source-patterns.md +99 -0
- package/rheo/rheo-flow-import/scripts/audit-import.mjs +4 -0
- package/rheo/rheo-flow-import/scripts/audit-publish-manifest.mjs +4 -0
- package/rheo/rheo-flow-import/scripts/fetch-profile.mjs +4 -0
- package/rheo/rheo-flow-import/scripts/lib/rheo-cli.mjs +12753 -0
- package/rheo/rheo-flow-import/scripts/normalize-manifest.mjs +4 -0
- package/rheo/rheo-flow-import/scripts/print-manifest-summary.mjs +4 -0
- package/rheo/rheo-flow-import/scripts/scaffold-manifest.mjs +4 -0
- package/rheo/rheo-flow-import/scripts/validate-manifest.mjs +4 -0
- package/src/index.ts +32 -0
package/README.md
ADDED
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
# @getrheo/rheo-skill
|
|
2
|
+
|
|
3
|
+
Source and build tooling for the **`rheo`** agent skill — a single, self-contained
|
|
4
|
+
skill with two sub-skills:
|
|
5
|
+
|
|
6
|
+
- **`rheo/rheo-best-practices`** — how to install and wire the Rheo SDK (React Native,
|
|
7
|
+
Expo, SwiftUI), integrations, auth, and implementation best practices. Pure
|
|
8
|
+
guidance, no scripts.
|
|
9
|
+
- **`rheo/rheo-flow-import`** — how to analyze an existing mobile flow and export it as
|
|
10
|
+
a compliant Rheo `FlowManifest`, plus self-contained `node` scripts (audit,
|
|
11
|
+
scaffold, validate, audit-publish, normalize, summary, profile).
|
|
12
|
+
|
|
13
|
+
## The deliverable is `rheo/`
|
|
14
|
+
|
|
15
|
+
The installable artifact is the [`rheo/`](rheo) directory. It is fully
|
|
16
|
+
self-contained: the rheo-flow-import scripts run with **plain `node`** and need **no
|
|
17
|
+
`pnpm install`**, because the validation/scaffold engine, `zod`, `@getrheo/contracts`,
|
|
18
|
+
and `@getrheo/flow-runtime` are bundled into
|
|
19
|
+
`rheo/rheo-flow-import/scripts/lib/rheo-cli.mjs` at build time.
|
|
20
|
+
|
|
21
|
+
```text
|
|
22
|
+
rheo/
|
|
23
|
+
├── SKILL.md # router → rheo-best-practices / rheo-flow-import
|
|
24
|
+
├── rheo-best-practices/
|
|
25
|
+
│ ├── SKILL.md
|
|
26
|
+
│ ├── references/ # install-* , integrations, implement-workflow, troubleshooting
|
|
27
|
+
│ └── examples/ # install snippets
|
|
28
|
+
└── rheo-flow-import/
|
|
29
|
+
├── SKILL.md
|
|
30
|
+
├── references/ # import-workflow, flow-spec, capabilities (generated), manifest-rules,
|
|
31
|
+
│ # layer-schema-pitfalls, publish-gates, *-source-patterns, carousel/font/i18n/animation
|
|
32
|
+
├── examples/ # valid manifests + flow-spec.example.json
|
|
33
|
+
└── scripts/
|
|
34
|
+
├── *.mjs # thin wrappers (import runCli from lib)
|
|
35
|
+
└── lib/rheo-cli.mjs # GENERATED self-contained bundle (committed)
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
## Source layout (this package)
|
|
39
|
+
|
|
40
|
+
- `src/` — TypeScript engine (CLI, audit analyzers, scaffold, publish gates,
|
|
41
|
+
validation, profile fetch). Source of truth for the bundle.
|
|
42
|
+
- `scripts/build-skill.ts` — esbuild bundler → `rheo/rheo-flow-import/scripts/lib/rheo-cli.mjs`.
|
|
43
|
+
- `src/capabilities/generateCapabilities.ts` — regenerates
|
|
44
|
+
`rheo/rheo-flow-import/references/capabilities.md` from `@getrheo/contracts`.
|
|
45
|
+
- `test/` — vitest suite (scaffold structure, publish gates, validation,
|
|
46
|
+
capabilities drift, bundle smoke test).
|
|
47
|
+
|
|
48
|
+
## Commands
|
|
49
|
+
|
|
50
|
+
```bash
|
|
51
|
+
pnpm --filter @getrheo/rheo-skill build # gen:capabilities + bundle (run before committing)
|
|
52
|
+
pnpm --filter @getrheo/rheo-skill gen:capabilities
|
|
53
|
+
pnpm --filter @getrheo/rheo-skill bundle
|
|
54
|
+
pnpm --filter @getrheo/rheo-skill test
|
|
55
|
+
pnpm --filter @getrheo/rheo-skill typecheck
|
|
56
|
+
pnpm --filter @getrheo/rheo-skill validate:examples
|
|
57
|
+
pnpm --filter @getrheo/rheo-skill validate:skill-format # agentskills.io frontmatter (skills-ref)
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
`validate:skill-format` installs the official [skills-ref](https://github.com/agentskills/agentskills/tree/main/skills-ref) validator into a local `.venv-skills-ref` (gitignored) and checks `rheo/`, `rheo/rheo-best-practices/`, and `rheo/rheo-flow-import/`. Requires Python 3.11+. Set `SKILLS_REF_SKIP=1` to skip (e.g. environments without Python). The same check runs in `pnpm test` via `test/skillFormat.test.ts`.
|
|
61
|
+
|
|
62
|
+
> Run `build` after any change under `src/` or to `@getrheo/contracts` /
|
|
63
|
+
> `@getrheo/flow-runtime`. When rheo-skill paths change, CI runs `build` and fails if
|
|
64
|
+
> `rheo-cli.mjs` or `capabilities.md` are not committed (`rheo-skill.yml`).
|
|
65
|
+
|
|
66
|
+
## Manifest profile
|
|
67
|
+
|
|
68
|
+
rheo-flow-import fetches the latest LLM-friendly Manifest Agent Profile from
|
|
69
|
+
`https://docs.getrheo.io/docs/md/developer-guide/agent-manifest-profile`, falling
|
|
70
|
+
back to `rheo/rheo-flow-import/references/manifest-agent-profile-fallback.md` offline.
|
|
71
|
+
|
|
72
|
+
## Compatibility
|
|
73
|
+
|
|
74
|
+
- Manifest schema version: `7`
|
|
75
|
+
- Supported SDK surfaces: React Native / Expo and SwiftUI
|
|
76
|
+
- Requires Node.js 20+
|
package/package.json
ADDED
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@getrheo/rheo-skill",
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"type": "module",
|
|
5
|
+
"description": "Source + build tooling for the self-contained `rheo` agent skill (rheo-best-practices + rheo-flow-import sub-skills).",
|
|
6
|
+
"main": "./src/index.ts",
|
|
7
|
+
"types": "./src/index.ts",
|
|
8
|
+
"exports": {
|
|
9
|
+
".": "./src/index.ts"
|
|
10
|
+
},
|
|
11
|
+
"dependencies": {
|
|
12
|
+
"@getrheo/contracts": "1.0.0",
|
|
13
|
+
"@getrheo/flow-runtime": "1.0.0"
|
|
14
|
+
},
|
|
15
|
+
"devDependencies": {
|
|
16
|
+
"@types/node": "^22.10.1",
|
|
17
|
+
"esbuild": "^0.24.0",
|
|
18
|
+
"tsx": "^4.19.2",
|
|
19
|
+
"typescript": "^5.6.3",
|
|
20
|
+
"vitest": "^3.2.6",
|
|
21
|
+
"@rheo/config": "0.1.0"
|
|
22
|
+
},
|
|
23
|
+
"files": [
|
|
24
|
+
"README.md",
|
|
25
|
+
"rheo"
|
|
26
|
+
],
|
|
27
|
+
"license": "MIT",
|
|
28
|
+
"repository": {
|
|
29
|
+
"type": "git",
|
|
30
|
+
"url": "git+https://github.com/madeinusmate/onboardly.git",
|
|
31
|
+
"directory": "packages/rheo-skill"
|
|
32
|
+
},
|
|
33
|
+
"publishConfig": {
|
|
34
|
+
"access": "public"
|
|
35
|
+
},
|
|
36
|
+
"scripts": {
|
|
37
|
+
"lint": "eslint .",
|
|
38
|
+
"typecheck": "tsc --noEmit",
|
|
39
|
+
"test": "vitest run",
|
|
40
|
+
"gen:capabilities": "tsx src/capabilities/generateCapabilities.ts",
|
|
41
|
+
"bundle": "tsx scripts/build-skill.ts",
|
|
42
|
+
"build": "pnpm gen:capabilities && pnpm bundle",
|
|
43
|
+
"audit": "tsx src/cli.ts audit",
|
|
44
|
+
"scaffold": "tsx src/cli.ts scaffold",
|
|
45
|
+
"validate": "tsx src/cli.ts validate",
|
|
46
|
+
"normalize": "tsx src/cli.ts normalize",
|
|
47
|
+
"summary": "tsx src/cli.ts summary",
|
|
48
|
+
"validate:examples": "tsx src/cli.ts validate rheo/rheo-flow-import/examples/linear-onboarding.manifest.json && tsx src/cli.ts validate rheo/rheo-flow-import/examples/branching-onboarding.manifest.json && tsx src/cli.ts validate rheo/rheo-flow-import/examples/revenuecat-paywall.manifest.json",
|
|
49
|
+
"validate:skill-format": "node scripts/validate-skill-format.mjs"
|
|
50
|
+
}
|
|
51
|
+
}
|
package/rheo/SKILL.md
ADDED
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
---
|
|
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.
|
|
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
|
+
metadata:
|
|
6
|
+
rheo-version: "1.0.0"
|
|
7
|
+
manifest-schema-version: "7"
|
|
8
|
+
---
|
|
9
|
+
|
|
10
|
+
# Rheo
|
|
11
|
+
|
|
12
|
+
Rheo is a headless flow engine: a hosted dashboard authors onboarding, paywall, post-purchase, and setup flows as a `FlowManifest`, and the Rheo SDK renders them natively inside a host app. This skill helps an agent do two distinct jobs. Pick the sub-skill that matches the request and read its `SKILL.md` before doing anything else.
|
|
13
|
+
|
|
14
|
+
## Routing
|
|
15
|
+
|
|
16
|
+
| The user wants to… | Use sub-skill | Read |
|
|
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) |
|
|
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
|
+
|
|
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.
|
|
22
|
+
|
|
23
|
+
## What each sub-skill is
|
|
24
|
+
|
|
25
|
+
- **rheo-best-practices** — pure guidance. How to detect the host stack, install the right flavor package (`@getrheo/react-native-expo`, `@getrheo/react-native-bare`, or `RheoSwiftUI`), wire the provider + runtime component, preserve a rollback path, and connect optional integrations and auth. No code is run.
|
|
26
|
+
- **rheo-flow-import** — guidance **plus** self-contained tooling. References for the manifest contract, source-reading patterns for React Native and SwiftUI, worked examples, and `node` scripts (`audit`, `scaffold`, `validate`, `audit-publish`, `normalize`, `summary`, `profile`) that run with no install step — the validation/scaffold engine and the Rheo contracts are bundled into the skill.
|
|
27
|
+
|
|
28
|
+
## Shared rules
|
|
29
|
+
|
|
30
|
+
- Never put secrets, API keys, tokens, or private backend URLs in a manifest or a committed snippet.
|
|
31
|
+
- The Rheo manifest contract is the source of truth. rheo-flow-import ships a generated capability cheat-sheet ([rheo-flow-import/references/capabilities.md](rheo-flow-import/references/capabilities.md)) and a Manifest Agent Profile fetch; trust those over memory.
|
|
32
|
+
- Only install packages or edit a host app's code when the user explicitly asks for implementation. Analysis and manifest generation never modify the host app.
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
---
|
|
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.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Rheo — Best Practices (SDK implementation)
|
|
7
|
+
|
|
8
|
+
Use this sub-skill when the user wants Rheo **running in their app**. The goal is a minimal, reversible integration that wraps the flow host, renders the Rheo runtime, and wires the callbacks the host owns — without hard-coding secrets or deleting the existing onboarding on the first pass.
|
|
9
|
+
|
|
10
|
+
## When to act
|
|
11
|
+
|
|
12
|
+
Only install packages or edit host code when the user explicitly asks for implementation. If they only ask "how would I add Rheo?", explain using these references and stop.
|
|
13
|
+
|
|
14
|
+
## Workflow
|
|
15
|
+
|
|
16
|
+
1. **Detect the host stack** and read the matching reference:
|
|
17
|
+
- React Native + Expo → [references/react-native-expo.md](references/react-native-expo.md)
|
|
18
|
+
- React Native bare (no `expo` dependency) → [references/react-native-bare.md](references/react-native-bare.md)
|
|
19
|
+
- SwiftUI → [references/swiftui.md](references/swiftui.md)
|
|
20
|
+
2. Read [references/implement-workflow.md](references/implement-workflow.md) for the shared, stack-agnostic steps (identity inputs, dashboard values, provider wrap, runtime swap, terminal callbacks, verification).
|
|
21
|
+
3. When the flow uses paywalls, attribution, auth, permissions, links, or in-app review, read [references/integrations.md](references/integrations.md) before wiring anything.
|
|
22
|
+
4. Use the install snippets in [examples/](examples) as a starting point, adapted to the project's package manager and conventions.
|
|
23
|
+
5. If something behaves unexpectedly, consult [references/troubleshooting.md](references/troubleshooting.md).
|
|
24
|
+
|
|
25
|
+
## Hard rules
|
|
26
|
+
|
|
27
|
+
- **One flavor per app.** Install **either** `@getrheo/react-native-expo` **or** `@getrheo/react-native-bare`, never both. SwiftUI uses the `RheoSwiftUI` SwiftPM products.
|
|
28
|
+
- **No secrets in code.** `publishableKey` and `channelId` come from env/config or placeholders the user fills in. Never commit real keys.
|
|
29
|
+
- **Production API:** SDK defaults use **`https://api.getrheo.io`** (`RHEO_DEFAULT_SDK_API_BASE_URL`). Omit `apiBaseUrl` / `apiBaseURL` in production unless self-hosting. Never pair **`ob_pk_live_*`** keys with localhost.
|
|
30
|
+
- **Pass the channel public id**, not a flow id, to `Flow` / `FlowView`.
|
|
31
|
+
- **Preserve the existing onboarding** as a fallback/rollback path (feature flag or route swap) unless the user explicitly asks to remove it.
|
|
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 external surface.
|
|
34
|
+
- **Do not add `request_app_review`** prompts unless the user explicitly asks; Apple discourages prompting from raw button taps.
|
|
35
|
+
- Run the **narrowest useful verification** (typecheck or a build of the touched module), not a full app build, unless asked.
|
|
36
|
+
|
|
37
|
+
## Final response
|
|
38
|
+
|
|
39
|
+
When you implement, report:
|
|
40
|
+
|
|
41
|
+
- Files changed.
|
|
42
|
+
- SDK surface wired (`RheoProvider` + `Flow`/`useFlow`, or `RheoProvider` + `FlowView`).
|
|
43
|
+
- Dashboard values still needing real values (`publishableKey`, `channelId`).
|
|
44
|
+
- Integrations/auth callbacks wired (or none).
|
|
45
|
+
- Whether the legacy onboarding was preserved as a fallback.
|
|
46
|
+
- Verification run, or why it was skipped.
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
# React Native / Expo Install Snippet
|
|
2
|
+
|
|
3
|
+
```bash
|
|
4
|
+
pnpm add @getrheo/react-native-expo
|
|
5
|
+
```
|
|
6
|
+
|
|
7
|
+
```tsx
|
|
8
|
+
import { Flow, RheoProvider } from '@getrheo/react-native-expo';
|
|
9
|
+
|
|
10
|
+
export const OnboardingHost = () => (
|
|
11
|
+
<RheoProvider
|
|
12
|
+
config={{
|
|
13
|
+
publishableKey: process.env.EXPO_PUBLIC_RHEO_PUBLISHABLE_KEY!,
|
|
14
|
+
// apiBaseUrl defaults to https://api.getrheo.io — omit in production
|
|
15
|
+
userId: 'stable-user-id',
|
|
16
|
+
sessionId: `sess_${Date.now()}`,
|
|
17
|
+
appVersion: '1.0.0',
|
|
18
|
+
}}
|
|
19
|
+
>
|
|
20
|
+
<Flow channelId={process.env.EXPO_PUBLIC_RHEO_ONBOARDING_CHANNEL_ID!} />
|
|
21
|
+
</RheoProvider>
|
|
22
|
+
);
|
|
23
|
+
```
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
# SwiftUI Install Snippet
|
|
2
|
+
|
|
3
|
+
```swift
|
|
4
|
+
import SwiftUI
|
|
5
|
+
import RheoSwiftUI
|
|
6
|
+
|
|
7
|
+
struct OnboardingHost: View {
|
|
8
|
+
var body: some View {
|
|
9
|
+
RheoProvider(
|
|
10
|
+
config: RheoConfig(
|
|
11
|
+
publishableKey: "ob_pk_test_xxx",
|
|
12
|
+
userId: "user_123",
|
|
13
|
+
sessionId: "sess_123"
|
|
14
|
+
)
|
|
15
|
+
) {
|
|
16
|
+
FlowView(channelId: "ch_test_xxx")
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
```
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
# Implementation Workflow
|
|
2
|
+
|
|
3
|
+
Use this when the user explicitly asks to install or wire Rheo in a host app.
|
|
4
|
+
|
|
5
|
+
## Shared Steps
|
|
6
|
+
|
|
7
|
+
1. Read local conventions, package manager, navigation structure, and current onboarding entry point.
|
|
8
|
+
2. Identify stable identity inputs: anonymous user id, backend user id, session id, app version, and locale.
|
|
9
|
+
3. Ask for missing Rheo dashboard values or use placeholders:
|
|
10
|
+
- publishable key
|
|
11
|
+
- channel id
|
|
12
|
+
- optional API base URL for non-production/dev
|
|
13
|
+
4. Install SDK dependencies using the project package manager.
|
|
14
|
+
5. Wrap the flow host in the Rheo provider.
|
|
15
|
+
6. Replace or gate the existing onboarding entry with the Rheo runtime component.
|
|
16
|
+
7. Preserve old onboarding as a fallback/rollback path unless explicitly told to remove it.
|
|
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.
|
|
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
|
+
11. Run the narrowest useful verification.
|
|
21
|
+
|
|
22
|
+
## Safety
|
|
23
|
+
|
|
24
|
+
- Do not hard-code secrets.
|
|
25
|
+
- Do not remove legacy onboarding on the first integration unless requested.
|
|
26
|
+
- Keep edits localized to the integration entry point and app config.
|
|
27
|
+
- Prefer reversible feature flags or route swaps for production apps.
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
# Integrations
|
|
2
|
+
|
|
3
|
+
## RevenueCat
|
|
4
|
+
|
|
5
|
+
Detect source calls such as `Purchases.configure`, `react-native-purchases`, `react-native-purchases-ui`, or existing paywall presentation code.
|
|
6
|
+
|
|
7
|
+
Manifest mapping:
|
|
8
|
+
|
|
9
|
+
- Create an external surface with `config.provider: "revenuecat"`.
|
|
10
|
+
- Preserve offering or placement identifiers when visible in source.
|
|
11
|
+
- Wire known outcomes:
|
|
12
|
+
- `purchase_completed`
|
|
13
|
+
- `restore_completed`
|
|
14
|
+
- `dismissed`
|
|
15
|
+
- `failed`
|
|
16
|
+
- Always wire `fallback`.
|
|
17
|
+
|
|
18
|
+
The host remains responsible for configuring RevenueCat. Rheo does not own purchase SDK secrets or receipt validation.
|
|
19
|
+
|
|
20
|
+
## AppsFlyer
|
|
21
|
+
|
|
22
|
+
Detect `react-native-appsflyer` or Swift attribution setup. Do not include AppsFlyer secrets in manifests.
|
|
23
|
+
|
|
24
|
+
**React Native:** built-in provider when `react-native-appsflyer` is installed (host still initializes the SDK).
|
|
25
|
+
|
|
26
|
+
**SwiftUI:** `import RheoSwiftUIAppsFlyer` and `FlowView(..., appsFlyerAttribution: .automatic)` when `AppsFlyerLib` is linked; manual `AppsFlyerAttributionProvider { observe in … }` for advanced hosts.
|
|
27
|
+
|
|
28
|
+
When source branches on acquisition/deep-link data, represent stable attributes through decision nodes and add the relevant keys to `sdkAttributeKeys`.
|
|
29
|
+
|
|
30
|
+
## Auth
|
|
31
|
+
|
|
32
|
+
OAuth and email/password UI can be represented in Rheo manifests, but the host owns authentication logic. When implementing, wire `onOAuthLogin` and `onEmailPasswordAuth` callbacks.
|
|
33
|
+
|
|
34
|
+
## Permissions
|
|
35
|
+
|
|
36
|
+
Native permission prompts can map to `request_os_permission` button actions. Verify the host app has native permission declarations before relying on those steps.
|
|
37
|
+
|
|
38
|
+
## In-app review
|
|
39
|
+
|
|
40
|
+
- Manifest: `action.kind: "request_app_review"` on a button (no extra fields).
|
|
41
|
+
- Requires **`screen.next.default`** on that screen.
|
|
42
|
+
- Submits inputs like **Continue**; advances only via default next (no branching).
|
|
43
|
+
- **React Native (Expo):** required peer `expo-store-review`.
|
|
44
|
+
- **React Native (bare):** required peer `react-native-in-app-review`.
|
|
45
|
+
- **SwiftUI:** built-in StoreKit; ~1.5s delay when a prompt may have shown (no dismiss callback on iOS).
|
|
46
|
+
- Analytics: `app_review_prompt_shown`, `app_review_prompt_dismissed`; capture key `app_review:{layerId}`.
|
|
47
|
+
- Do **not** add review buttons unless the user explicitly asks—Apple discourages spamming prompts from raw button taps. Prefer post-milestone screens.
|
|
48
|
+
|
|
49
|
+
## Links
|
|
50
|
+
|
|
51
|
+
Use `hyperlink` layers for static external links. Preserve obvious URL destinations; do not add tracking parameters.
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
# React Native (bare)
|
|
2
|
+
|
|
3
|
+
## Detect
|
|
4
|
+
|
|
5
|
+
`package.json` with `react-native` but no `expo` dependency; `android/` and `ios/` native projects.
|
|
6
|
+
|
|
7
|
+
## Install
|
|
8
|
+
|
|
9
|
+
```bash
|
|
10
|
+
pnpm add @getrheo/react-native-bare \
|
|
11
|
+
react react-native \
|
|
12
|
+
react-native-permissions react-native-gesture-handler react-native-reanimated \
|
|
13
|
+
react-native-linear-gradient react-native-svg lottie-react-native \
|
|
14
|
+
react-native-vector-icons @react-native-async-storage/async-storage \
|
|
15
|
+
react-native-safe-area-context react-native-in-app-review react-native-video
|
|
16
|
+
```
|
|
17
|
+
|
|
18
|
+
**Integrations (host only):** `react-native-appsflyer`, `react-native-purchases`, `react-native-purchases-ui` when needed.
|
|
19
|
+
|
|
20
|
+
## Minimal Runtime
|
|
21
|
+
|
|
22
|
+
```tsx
|
|
23
|
+
import { Flow, RheoProvider } from '@getrheo/react-native-bare';
|
|
24
|
+
|
|
25
|
+
export const OnboardingHost = () => (
|
|
26
|
+
<RheoProvider config={{ publishableKey: '…', userId: '…' }}>
|
|
27
|
+
<Flow channelId="ch_…" onFlowCompleted={() => {}} />
|
|
28
|
+
</RheoProvider>
|
|
29
|
+
);
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
## Notes
|
|
33
|
+
|
|
34
|
+
- Do **not** install `@getrheo/react-native-expo` in the same app.
|
|
35
|
+
- **Production:** default API is `https://api.getrheo.io`; omit `apiBaseUrl` unless self-hosting.
|
|
36
|
+
- Link native modules (permissions, video, reanimated babel plugin) per upstream docs.
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
# React Native / Expo
|
|
2
|
+
|
|
3
|
+
## Detect
|
|
4
|
+
|
|
5
|
+
Look for `package.json`, `app.json`, `app.config.*`, `expo-router`, `@react-navigation/*`, and existing onboarding route files.
|
|
6
|
+
|
|
7
|
+
## Install
|
|
8
|
+
|
|
9
|
+
```bash
|
|
10
|
+
pnpm add @getrheo/react-native-expo \
|
|
11
|
+
react react-native \
|
|
12
|
+
react-native-permissions react-native-gesture-handler react-native-reanimated \
|
|
13
|
+
react-native-linear-gradient react-native-svg lottie-react-native \
|
|
14
|
+
react-native-vector-icons @react-native-async-storage/async-storage \
|
|
15
|
+
react-native-safe-area-context expo-store-review expo-video
|
|
16
|
+
```
|
|
17
|
+
|
|
18
|
+
**Integrations (host only, not SDK peers):** `react-native-appsflyer`, `react-native-purchases`, `react-native-purchases-ui` when the flow uses attribution or RevenueCat paywalls.
|
|
19
|
+
|
|
20
|
+
## Minimal Runtime
|
|
21
|
+
|
|
22
|
+
```tsx
|
|
23
|
+
import { Flow, RheoProvider } from '@getrheo/react-native-expo';
|
|
24
|
+
|
|
25
|
+
export const OnboardingHost = () => (
|
|
26
|
+
<RheoProvider
|
|
27
|
+
config={{
|
|
28
|
+
publishableKey: process.env.EXPO_PUBLIC_RHEO_PUBLISHABLE_KEY!,
|
|
29
|
+
userId: 'stable-user-id',
|
|
30
|
+
sessionId: `sess_${Date.now()}`,
|
|
31
|
+
appVersion: '1.0.0',
|
|
32
|
+
}}
|
|
33
|
+
>
|
|
34
|
+
<Flow
|
|
35
|
+
channelId={process.env.EXPO_PUBLIC_RHEO_ONBOARDING_CHANNEL_ID!}
|
|
36
|
+
onFlowCompleted={() => {}}
|
|
37
|
+
onFlowAbandoned={() => {}}
|
|
38
|
+
/>
|
|
39
|
+
</RheoProvider>
|
|
40
|
+
);
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
## Notes
|
|
44
|
+
|
|
45
|
+
- Do **not** install `@getrheo/react-native-bare` in the same app.
|
|
46
|
+
- Pass channel public id, not flow id.
|
|
47
|
+
- **Production:** default API is `https://api.getrheo.io`; omit `apiBaseUrl` unless self-hosting. Never use localhost with `ob_pk_live_*` keys.
|
|
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.
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
# SwiftUI
|
|
2
|
+
|
|
3
|
+
## Detect
|
|
4
|
+
|
|
5
|
+
Look for `Package.swift`, `.xcodeproj`, `.xcworkspace`, SwiftUI `App`, `NavigationStack`, onboarding root views, and coordinators.
|
|
6
|
+
|
|
7
|
+
## Install
|
|
8
|
+
|
|
9
|
+
Add the SwiftPM product:
|
|
10
|
+
|
|
11
|
+
```swift
|
|
12
|
+
.product(name: "RheoSwiftUI", package: "RheoSwiftUI")
|
|
13
|
+
```
|
|
14
|
+
|
|
15
|
+
Optional products:
|
|
16
|
+
|
|
17
|
+
```swift
|
|
18
|
+
.product(name: "RheoSwiftUIRevenueCat", package: "RheoSwiftUI")
|
|
19
|
+
.product(name: "RheoSwiftUIAppsFlyer", package: "RheoSwiftUI")
|
|
20
|
+
```
|
|
21
|
+
|
|
22
|
+
## Minimal Runtime
|
|
23
|
+
|
|
24
|
+
```swift
|
|
25
|
+
import SwiftUI
|
|
26
|
+
import RheoSwiftUI
|
|
27
|
+
|
|
28
|
+
struct OnboardingHost: View {
|
|
29
|
+
var body: some View {
|
|
30
|
+
RheoProvider(
|
|
31
|
+
config: RheoConfig(
|
|
32
|
+
publishableKey: "ob_pk_test_xxx",
|
|
33
|
+
userId: "user_123",
|
|
34
|
+
sessionId: "sess_123"
|
|
35
|
+
)
|
|
36
|
+
) {
|
|
37
|
+
FlowView(channelId: "ch_test_xxx") { snapshot in
|
|
38
|
+
// Continue host navigation.
|
|
39
|
+
} onFlowAbandoned: { snapshot in
|
|
40
|
+
// Continue or restore host navigation.
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
## Notes
|
|
48
|
+
|
|
49
|
+
- Use `RheoSwiftUIRevenueCat` for RevenueCat external surface presenter helpers.
|
|
50
|
+
- Use `RheoSwiftUIAppsFlyer` for AppsFlyer attribution providers.
|
|
51
|
+
- Host apps must include Info.plist usage strings for authored permission prompts.
|
|
52
|
+
- Host apps must register branding fonts if relying on downloaded font families.
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
# Troubleshooting
|
|
2
|
+
|
|
3
|
+
## Manifest Fails Validation
|
|
4
|
+
|
|
5
|
+
Run:
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
node scripts/validate-manifest.mjs ./rheo-import.manifest.json
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
Fix the exact issue paths. Use normalization only for safe shape repairs.
|
|
12
|
+
|
|
13
|
+
## Dashboard Import Crashes With `Cannot read properties of undefined (reading 'forEach')`
|
|
14
|
+
|
|
15
|
+
This usually means a container layer is missing its `children` array — most often `back_button` in `regions.header` emitted as `{ "kind": "back_button" }` without nested label content.
|
|
16
|
+
|
|
17
|
+
Fix in the manifest:
|
|
18
|
+
|
|
19
|
+
1. Search for `"kind": "back_button"` (and `"kind": "button"`, `"kind": "hyperlink"`).
|
|
20
|
+
2. Ensure each has `"children": [ { "kind": "text", "text": { "default": "..." }, "style": { "color": "..." } } ]` (plus optional `icon` child).
|
|
21
|
+
3. Re-run `validate-manifest.mjs`, then rebuild the ZIP.
|
|
22
|
+
|
|
23
|
+
`normalize-manifest.mjs` does not repair missing `back_button.children`.
|
|
24
|
+
|
|
25
|
+
## API Returns `invalid seeded flow manifest` With `invalid_union`
|
|
26
|
+
|
|
27
|
+
Dashboard import passed asset upload but Zod rejected the manifest. Usually **dozens of issues** at repeating paths:
|
|
28
|
+
|
|
29
|
+
- `regions.header.children[0]` → invalid **`back_button`** (wrong/missing `variant`, bad ids, missing `children`, nested icon not `ionicons`, or spurious `action`)
|
|
30
|
+
- `regions.body.children[1]` → invalid **`single_choice`** (missing `optionBindings` / `branching` / `fieldKey`, or `"options"` instead of `children`)
|
|
31
|
+
|
|
32
|
+
Fix workflow:
|
|
33
|
+
|
|
34
|
+
1. Extract manifest: `unzip -p rheo-import.zip rheo-import.manifest.json > /tmp/manifest.json`
|
|
35
|
+
2. Run `node scripts/validate-manifest.mjs /tmp/manifest.json` and fix **every** path.
|
|
36
|
+
3. Compare failing layers to [layer-schema-pitfalls.md](layer-schema-pitfalls.md).
|
|
37
|
+
4. Re-run validate until exit 0, rebuild ZIP, re-import.
|
|
38
|
+
|
|
39
|
+
## Missing Fallback Edge
|
|
40
|
+
|
|
41
|
+
Every external surface needs `fallback`. RevenueCat outcomes that are not explicitly mapped fall through to this target.
|
|
42
|
+
|
|
43
|
+
## Integration Disabled
|
|
44
|
+
|
|
45
|
+
The manifest may validate locally but fail dashboard import if the target app has RevenueCat disabled or the workspace lacks integration entitlements.
|
|
46
|
+
|
|
47
|
+
## Wrong Environment
|
|
48
|
+
|
|
49
|
+
Publishable keys and channels are environment-scoped. Do not mix test keys with live channels.
|
|
50
|
+
|
|
51
|
+
## Custom Native UI
|
|
52
|
+
|
|
53
|
+
If the source flow uses behavior Rheo cannot render, approximate the screen with editable layers and mention the behavior for manual review. Do not invent unsupported layer kinds.
|
|
54
|
+
|
|
55
|
+
## Resolve Fallback Confusion
|
|
56
|
+
|
|
57
|
+
`Flow` fallback / `FlowView` fallback is for network or resolve failure. It is not the main mechanism for representing a production legacy onboarding flow in the builder.
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: rheo-flow-import
|
|
3
|
+
description: Analyze an existing mobile app flow (onboarding, paywall, post-purchase, setup) in a React Native, Expo, or SwiftUI codebase and export it as a compliant Rheo FlowManifest, then validate it against the dashboard publish gates. Use when a user asks to import, migrate, or convert an existing flow into Rheo, generate or scaffold a Rheo manifest, or validate/repair a Rheo manifest. Part of the `rheo` skill. Ships self-contained node scripts — no install step.
|
|
4
|
+
compatibility: Requires Node.js 20+. All scripts are self-contained (zod, @getrheo/contracts, and @getrheo/flow-runtime are bundled into scripts/lib/rheo-cli.mjs). Internet access fetches the latest Manifest Agent Profile; a bundled fallback works offline.
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# Rheo — Flow Import
|
|
8
|
+
|
|
9
|
+
Convert an existing app flow into a Rheo `FlowManifest` that imports and publishes in the dashboard with zero blockers. Prefer **source code as truth**; use screenshots/recordings only as supporting evidence unless the user says they are newer.
|
|
10
|
+
|
|
11
|
+
The recommended authoring path is **spec → scaffold → enrich → validate**: describe the flow as a compact [flow spec](references/flow-spec.md), run `scaffold-manifest.mjs` to get a schema-valid skeleton with correct ids/structure, then enrich styling and validate. Hand-authoring full manifest JSON is allowed but error-prone — the scaffold removes the mechanical mistakes (ids, `children` arrays, choice bindings, branching).
|
|
12
|
+
|
|
13
|
+
## Self-contained tooling
|
|
14
|
+
|
|
15
|
+
The scripts under [scripts/](scripts) run with **plain `node`** — no `pnpm install`, no workspace. The validation/scaffold engine and the Rheo contracts are bundled into `scripts/lib/rheo-cli.mjs`.
|
|
16
|
+
|
|
17
|
+
> **Run them from the target app's root, not from the skill folder.** The scripts are self-contained, so reference them by path. Pointing the audit at the skill folder only scans the skill's own examples and produces noise.
|
|
18
|
+
>
|
|
19
|
+
> ```bash
|
|
20
|
+
> RHEO=/abs/path/to/rheo/rheo-flow-import # this skill's rheo-flow-import directory
|
|
21
|
+
> cd <target-app> # the app you are importing
|
|
22
|
+
> node "$RHEO/scripts/audit-import.mjs" --entry app/onboarding.tsx --out rheo-import.audit.md
|
|
23
|
+
> ```
|
|
24
|
+
>
|
|
25
|
+
> The audit anchors to the **project root inferred from `--entry`** (the nearest enclosing `package.json` / `app.json` / `Package.swift`), or to `--root <appRoot>` when you pass it. `--entry` may be a **file** (traces its import graph) or a **directory** (scans that subtree only). Repeat `--entry` for multiple entry files. It hard-errors if any entry does not exist or if the root resolves inside the skill — and prints `audit_root` / `audit_entries` / `audit_scope` / `audit_scanned_files` so you can confirm it anchored to the real app. Outputs (`--out`, `--suggest-animations`) are written relative to the current directory.
|
|
26
|
+
|
|
27
|
+
| Script | Purpose |
|
|
28
|
+
|--------|---------|
|
|
29
|
+
| `node "$RHEO/scripts/audit-import.mjs" --entry <file\|dir> [--entry <file\|dir> ...] --out rheo-import.audit.md` | Crawl imports from entry file(s) or source subtree(s); write an evidence report. Add `--suggest-animations <path>.json` for motion. |
|
|
30
|
+
| `node "$RHEO/scripts/scaffold-manifest.mjs" <flow-spec.json> [--out <path>]` | Expand a flow spec ([references/flow-spec.md](references/flow-spec.md)) into a **schema-valid** manifest skeleton (correct ids, `children`, choice bindings, branching). |
|
|
31
|
+
| `node "$RHEO/scripts/validate-manifest.mjs" <manifest.json>` | Validate schema **and** dashboard publish gates. Must exit `0` before delivering. |
|
|
32
|
+
| `node "$RHEO/scripts/audit-publish-manifest.mjs" <manifest.json> [--out <path>]` | Write `rheo-import.publish-gates.md` (blocking issues + fixes). |
|
|
33
|
+
| `node "$RHEO/scripts/normalize-manifest.mjs" <manifest.json> [--out <path>] [--write]` | Safe legacy repairs only (legacy `button`/`hyperlink` labels) — **not** missing `back_button.children`. |
|
|
34
|
+
| `node "$RHEO/scripts/print-manifest-summary.mjs" <manifest.json>` | Print non-sensitive manifest metadata. |
|
|
35
|
+
| `node "$RHEO/scripts/fetch-profile.mjs" [--offline-profile]` | Report the Manifest Agent Profile source + version. |
|
|
36
|
+
|
|
37
|
+
All `<manifest.json>` / `<flow-spec.json>` paths and outputs resolve from the **current directory** (your app root), so the artifacts land in the app, not the skill.
|
|
38
|
+
|
|
39
|
+
## Workflow
|
|
40
|
+
|
|
41
|
+
1. **Read first:** [references/import-workflow.md](references/import-workflow.md), [references/capabilities.md](references/capabilities.md), [references/layer-schema-pitfalls.md](references/layer-schema-pitfalls.md). For source-reading by stack: [references/react-native-source-patterns.md](references/react-native-source-patterns.md) or [references/swiftui-source-patterns.md](references/swiftui-source-patterns.md).
|
|
42
|
+
2. **Set `$RHEO` and `cd` into the target app.** Point `$RHEO` at this skill's `rheo-flow-import` directory and run every script from the app root (see Self-contained tooling above). All scripts work from anywhere via the `$RHEO/scripts/...` path.
|
|
43
|
+
3. **Profile:** fetch the latest Manifest Agent Profile (`node "$RHEO/scripts/fetch-profile.mjs"`, or the raw docs URL `/docs/md/developer-guide/agent-manifest-profile`). Record the version. Falls back to [references/manifest-agent-profile-fallback.md](references/manifest-agent-profile-fallback.md) offline.
|
|
44
|
+
4. **Mandatory intake (blocking):** ask every question in the Mandatory Intake Questionnaire in [references/import-workflow.md](references/import-workflow.md) and record answers in chat. Do not skip because the repo looks obvious. If the user has not named an entry point, stop after Q1 and wait.
|
|
45
|
+
5. **Audit:** run `node "$RHEO/scripts/audit-import.mjs" --entry <flow-entry> [--entry <other-entry> ...] --out rheo-import.audit.md` (add `--suggest-animations` when intake Q6 is yes). **Confirm the printed `audit_root`/`audit_entries`/`audit_scope` point at the real app** before trusting the evidence. If the audit cannot run, explain why and produce the same sections manually.
|
|
46
|
+
6. **Author:** write a [flow spec](references/flow-spec.md) and run `scaffold-manifest.mjs`, then enrich theme/styles; or hand-author following [references/manifest-rules.md](references/manifest-rules.md). Apply carousel/font/localization/animation guidance from the dedicated references when the audit flags them.
|
|
47
|
+
7. **Validate (blocking):** run `node "$RHEO/scripts/validate-manifest.mjs" ./rheo-import.manifest.json` (exit `0`) **and** `node "$RHEO/scripts/audit-publish-manifest.mjs" ./rheo-import.manifest.json` — fix every blocking issue ([references/publish-gates.md](references/publish-gates.md)).
|
|
48
|
+
8. **Bundle:** if any traced screen references local images, Lottie JSON, video, or fonts, output `rheo-import.zip` (manifest + optional `rheo-import.assets.json` (media only) + optional `rheo-import.fonts.json` (fonts only) + files under `assets/`). Raw JSON only after an explicit asset audit finds nothing local.
|
|
49
|
+
|
|
50
|
+
## Hard rules (blocking)
|
|
51
|
+
|
|
52
|
+
- **Validate before zipping.** `node scripts/validate-manifest.mjs` must exit `0`. Do not discover schema errors after upload.
|
|
53
|
+
- **Don't write an ad-hoc scanner** before trying `scripts/audit-import.mjs`. If it can't run, explain why and audit manually with the same sections.
|
|
54
|
+
- **Layer ids:** every screen/layer/decision/surface id uses prefixes `scr_*`, `lyr_*`, `dec_*`, `surf_*`. UUID placeholders are **only** for `media.mediaAssetId` and font sidecars — never as layer ids or `optionBindings.rootLayerId`.
|
|
55
|
+
- **Container `children`:** every container layer **must** include a `children` array (or `slides` for `carousel`) — never omit the key. `button`, `back_button`, and `hyperlink` are containers: label copy goes in nested `text` children (optional leading `icon`). See [references/manifest-rules.md](references/manifest-rules.md#container-layers-required-children).
|
|
56
|
+
- **`back_button`:** header back chrome is `kind: "back_button"` with a required Rheo `variant` (`primary`|`secondary`|`ghost`|`destructive` — map source `outline`/`text`/`link`). **No `action`**. Nested `icon` uses `family: "ionicons"`.
|
|
57
|
+
- **Choice inputs:** `single_choice`/`multiple_choice` require `fieldKey` (snake_case), `children` (≥2 option stacks), `optionBindings` (one per option, `rootLayerId` = child stack `lyr_*` id), and `branching` (`{ "enabled": false, "conditions": [] }` when no branches). Never `"options"`/`"choices"`.
|
|
58
|
+
- **Styling:** when the audit reports colors, populate `manifest.theme` and layer `style` (including `style.color` on every text layer and nested button label). No black-and-white defaults when color evidence exists.
|
|
59
|
+
- **Gradients:** map `LinearGradient`/gradient stops to `screen.containerStyle.backgroundFill.color` as a `linear-gradient(...)` CSS string.
|
|
60
|
+
- **Carousels:** pager/carousel evidence (`infoSteps`, horizontal pager, `pagingEnabled`) → `kind: "carousel"`, one slide per page, swipe-only (no in-pager buttons). See [references/carousel-import.md](references/carousel-import.md).
|
|
61
|
+
- **Fonts:** custom fonts go in `rheo-import.fonts.json` under `assets/fonts/` and `manifest.theme.fontFamily`; **never** in `rheo-import.assets.json`. See [references/font-import.md](references/font-import.md).
|
|
62
|
+
- **Localization:** resolve **default-locale** strings into every `text.default` — never raw translation keys. Set `manifest.defaultLocale`. See [references/localization-import.md](references/localization-import.md).
|
|
63
|
+
- **Animations:** map motion from the audit only when intake Q6 is yes and the plan includes animations ([references/animation-import.md](references/animation-import.md)); otherwise omit all `animations`, `stagger`, `restingMotion`.
|
|
64
|
+
- **No secrets** in manifests.
|
|
65
|
+
|
|
66
|
+
## Final response
|
|
67
|
+
|
|
68
|
+
Report: manifest or ZIP path; audit report path (or why audit could not run); the recorded intake answers; Manifest Agent Profile version used (or bundled fallback); validation + publish-gate result (PASS or fixes applied); region/style/gradient/carousel/layout/font/localization/choice-state decisions from audit evidence; assets bundled (or `no local assets found`); and any unmappable native behavior the user should review in the Rheo builder. See [references/import-workflow.md](references/import-workflow.md#completion-gate) for the full completion gate.
|