Skip to content
Merged
2 changes: 1 addition & 1 deletion AGENTS.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,6 @@ Use the canonical Purchasely skills instead of duplicating SDK guidance in this
- Integration from scratch or step-by-step: @./skills/purchasely-integrate/SKILL.md
- Review an existing integration: @./skills/purchasely-review/SKILL.md
- Debug a runtime issue: @./skills/purchasely-debug/SKILL.md
- Migrate native iOS, native Android, or Flutter from SDK v5 to v6: @./skills/purchasely-migrate/SKILL.md
- Migrate native iOS, native Android, Flutter, React Native, or Cordova from SDK v5 to v6: @./skills/purchasely-migrate/SKILL.md

Platform-specific guides, concept references, and troubleshooting recipes live under `references/`. The skills link to the exact files they need; consult those references on demand rather than preloading or duplicating them here.
24 changes: 24 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,30 @@ All notable changes to this project are documented here. The format is based on

- `references/concepts/dynamic-offerings.md` — covers `setDynamicOffering` across platforms, server-side application at fetch time, one-plan-one-billing-type pitfall.
- `references/concepts/monthly-commitment.md` — covers Apple 12-month advance commitment (iOS 26.4+), `PLYBillingPlanType`, eligibility rules.
- `references/concepts/rendering-engine.md` — UIKit/Android Views rendering engines, image cache, Lottie bridge, known rendering bugs.
- `references/concepts/web-checkout.md` — Stripe payment links, `WEB_CHECKOUT_*` events.
- New debug known-issues: Lottie silent-nothing, stuck spinner after purchase cancel, Flutter `display()` hang, Indonesian locale pre-6.0.1, `PRESENTATION_VIEWED` eviction pre-rc.3, iPad campaign-close freeze, iOS 18.4/18.5 DEBUG image-cache bypass, video autoplay bug.
- New review checks: stale rc-era `interceptAction` import, Android `close()`-closes-all semantics, `oneSignalPlayerId` removal, `allowCampaigns` default flip.
- Android v6 additions documented: zero-code automatic deeplink handling, `themeMode()` at init, structured `PLYTransitionDimension`, bundled lint checks.
- Release process section in `CLAUDE.md`.

### Changed

- **SDK pins updated to GA** across all skills and references: native iOS **6.0.0** (SPM install now primary), Android **6.0.1**, Flutter **6.0.0** (stable on pub.dev), React Native **6.0.0-rc.3**, Cordova **6.0.0-rc.3**.
- Android toolchain updated (Kotlin 2.3.x).
- Action-interceptor guidance updated: returning success on purchase/restore in Observer mode auto-synchronizes — no manual `synchronize()` inside the interceptor.
- Expanded `references/concepts/monthly-commitment.md` — added Google Play native installment subscriptions, cross-platform scope (SDK 6.0+ on iOS/Flutter/RN/Cordova) for the Apple advance-commitment fields, `INSTALLMENT_PAID` / `INSTALLMENT_REFUNDED` webhooks, `commitment_*` attributes.

### Fixed

- React Native `allowDeeplink` default corrected (native default `true`, no RN exception).
- Removed-API names corrected per platform: iOS `showController` / `PLYUIControllerType` (`presentSubscriptions()` never existed on iOS); Android `subscriptionsFragment()`; `displaySubscriptionCancellationInstruction()` is removed, not a no-op.
- Android default dismiss handler name corrected (`setDefaultPresentationDismissHandler`).
- Native iOS requirement corrected to 13.4+ (inherited from 5.x).
- Flutter concept pages updated to `PLY`-prefixed Dart types.
- Dead anchor in `debug-mode.md`.
- Migrate-skill platform coverage now lists all 5 platforms in README, AGENTS.md, GEMINI.md, and the hooks intro.
- `gemini-extension.json` version aligned with the other manifests.

## [2.0.0-rc.6] — 2026-07-07

Expand Down
22 changes: 21 additions & 1 deletion CLAUDE.md
Original file line number Diff line number Diff line change
Expand Up @@ -8,11 +8,31 @@ Every PR that adds, changes, removes, or deprecates anything user-visible **must

1. Add the entry under the top-level `## [Unreleased]` section, in the appropriate sub-section: `Added`, `Changed`, `Removed`, `Deprecated`, `Fixed`, `Security`.
2. Keep entries short, factual, and user-facing. Example: `Added references/concepts/promotional-offers.md — covers Apple promo offers, Google developer-determined offers, offer codes` — not `Reworked the references directory`.
3. When cutting a release, rename `[Unreleased]` to `[X.Y.Z] — YYYY-MM-DD`, bump `version` in `.claude-plugin/plugin.json` + `package.json`, then add a fresh empty `[Unreleased]` section at the top.
3. When cutting a release, rename `[Unreleased]` to `[X.Y.Z] — YYYY-MM-DD` and add a fresh empty `[Unreleased]` section at the top — see **Release process** below for the full, authoritative list of manifests to bump.
4. Format follows [Keep a Changelog](https://keepachangelog.com/en/1.1.0/). Versioning follows [SemVer](https://semver.org/spec/v2.0.0.html).

**Rule of thumb:** if you wouldn't write the change in the release notes a client reads, you probably don't need a CHANGELOG entry. Otherwise, write one.

## Release process

Releases are cut **directly on `main`** — there is no release PR.

1. In `CHANGELOG.md`, rename `[Unreleased]` to `[X.Y.Z] — YYYY-MM-DD` and add a fresh empty `[Unreleased]` section above it.
2. Bump `version` in **every** manifest — this list is exhaustive; `gemini-extension.json` was missed in earlier releases and stayed at `1.1.0` until this PR caught it up:
Comment thread
kherembourg marked this conversation as resolved.
- `.claude-plugin/plugin.json`
- `.claude-plugin/marketplace.json`
- `.cursor-plugin/plugin.json`
- `.cursor-plugin/marketplace.json`
- `purchasely/.claude-plugin/plugin.json`
- `purchasely/.cursor-plugin/plugin.json`
- `purchasely/.codex-plugin/plugin.json`
- `package.json`
- `gemini-extension.json`
3. Commit directly on `main`: `chore(release): X.Y.Z`.
4. Tag and release: `git tag X.Y.Z && gh release create X.Y.Z`. Tags are **bare SemVer, no `v` prefix** (confirmed via `git tag --sort=-creatordate`, e.g. `2.0.0-rc.6`, `2.0.0-rc.5`, …) — keep using that format.
5. **Versioning**: never bump a major version without explicit sign-off from the user; default to a minor (or patch) bump.
6. If the release changed a `name:` or `description:` field in any `SKILL.md` frontmatter, trigger the agentskill.sh re-scan described below.

## Wrapper pattern: name and scope

The "wrapper" pattern (a single dedicated class that owns every call into the Purchasely SDK) is a **recommendation**, not a requirement. The Purchasely SDK is fully usable when called directly from ViewModels, UI code, or anywhere else.
Expand Down
2 changes: 1 addition & 1 deletion CONTRIBUTING.md
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,7 @@ Thanks for helping make Purchasely easier to integrate. This guide covers how to

- Keep examples **runnable**. If a snippet references an API, the API must exist in the current public SDK.
- Use **placeholders** (`YOUR_API_KEY`, `PLACEMENT_ID`) — never commit real keys.
- Prefer **direct SDK calls** in examples (`Purchasely.fetchPresentation(...)`). The wrapper pattern is recommended but optional — see `CLAUDE.md` for the full rule.
- Prefer **direct SDK calls** in examples (`Purchasely.setUserAttribute(...)`). The wrapper pattern is recommended but optional — see `CLAUDE.md` for the full rule.
- One concept per file when possible; cross-link with relative paths.
- Markdown headings: `##` for sections, `###` for subsections; no `#` (reserved for the document title).

Expand Down
2 changes: 1 addition & 1 deletion GEMINI.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ Use the canonical Purchasely skills instead of duplicating SDK guidance in this
- Integration from scratch or step-by-step: @./skills/purchasely-integrate/SKILL.md
- Review an existing integration: @./skills/purchasely-review/SKILL.md
- Debug a runtime issue: @./skills/purchasely-debug/SKILL.md
- Migrate native iOS, native Android, or Flutter from SDK v5 to v6: @./skills/purchasely-migrate/SKILL.md
- Migrate native iOS, native Android, Flutter, React Native, or Cordova from SDK v5 to v6: @./skills/purchasely-migrate/SKILL.md

## References

Expand Down
25 changes: 17 additions & 8 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -155,7 +155,7 @@ Tools that read the repository-level `AGENTS.md` should use this repository dire
| `/purchasely:integrate` | Step-by-step SDK integration from scratch — installation, initialization, paywall display, action interceptor, user management |
| `/purchasely:review` | Automated checklist review of your existing integration — finds bugs, deprecated APIs, and missing best practices |
| `/purchasely:debug` | Diagnostic trees for common issues — blank paywalls, frozen UI, purchase failures, deeplink problems |
| `/purchasely:migrate` | Upgrade an existing native iOS, native Android, or Flutter integration from SDK v5 to v6 |
| `/purchasely:migrate` | Upgrade an existing native iOS, native Android, Flutter, React Native, or Cordova integration from SDK v5 to v6 |

## Usage Examples

Expand Down Expand Up @@ -265,18 +265,18 @@ Purchasely-AI-Plugin/
| `/purchasely:integrate` | Slash command + matching `purchasely-integrate` skill | The command launches the skill; the skill is also auto-invoked when Claude detects an SDK integration task |
| `/purchasely:review` | Slash command + matching `purchasely-review` skill | Same as above |
| `/purchasely:debug` | Slash command + matching `purchasely-debug` skill | Same as above |
| `/purchasely:migrate` | Slash command + matching `purchasely-migrate` skill | Migrates native iOS, native Android, Flutter, and React Native integrations from SDK v5 to v6 |
| `/purchasely:migrate` | Slash command + matching `purchasely-migrate` skill | Migrates native iOS, native Android, Flutter, React Native, and Cordova integrations from SDK v5 to v6 |
| Natural Purchasely SDK question | Portable `purchasely-sdk-expert` skill + Claude Code `purchasely-sdk-expert` agent when available | No slash command needed — ask normally and the expert guidance can be used directly for free-form Purchasely SDK Q&A |

## Supported Platforms

| Platform | SDK line | Init | Paywalls | Interceptor | Deeplinks | User Mgmt |
|----------|----------|------|----------|-------------|-----------|-----------|
| iOS (Swift / Obj-C) | v6 (`6.0.0-rc.1`) | `Purchasely.apiKey(...).runningMode(...).start()` | `PLYPresentationBuilder...build().preload()` → `display(from:)` | per-action `interceptAction` returning `PLYInterceptResult` | `handleDeeplink` / `allowDeeplink` | `userLogin` / `userLogout` |
| Android (Kotlin / Java) | v6 (`6.0.0-rc.1`) | `Purchasely { ... }` or `Purchasely.Builder(...)` | `PLYPresentation { ... }.preload()` → `display(context)` | per-action `interceptAction` returning `PLYInterceptResult` | auto-intercept + `handleDeeplink` / `allowDeeplink` | `userLogin` / `userLogout` |
| Flutter | v6 (`6.0.0-rc.1`) | `PurchaselyBuilder.apiKey(...).start()` | `PresentationBuilder...build()` → `preload()` / `display(...)` | per-action `interceptAction` returning `InterceptResult` | `handleDeeplink` / `allowDeeplink` | `userLogin` / `userLogout` |
| React Native | v6 (`6.0.0-rc.2`) | `Purchasely.builder(...).runningMode(...).start()` | `Purchasely.presentation.placement(...).build()` → `preload()` / `display(transition?)` | per-action `interceptAction` returning `'success' \| 'failed' \| 'notHandled'` | `handleDeeplink` / `allowDeeplink` | `userLogin` / `userLogout` |
| Cordova | v6 (`6.0.0-rc.1`) | `Purchasely.start(options, success, error)` | `fetchPresentationForPlacement` + `presentPresentation` (display-mode arg) | per-action `interceptAction` returning `InterceptResult` | `handleDeeplink` / `allowDeeplink` | `userLogin` / `userLogout` |
| iOS (Swift / Obj-C) | v6 (`6.0.0`, GA) | `Purchasely.apiKey(...).runningMode(...).start()` | `PLYPresentationBuilder...build().preload()` → `display(from:)` | per-action `interceptAction` returning `PLYInterceptResult` | `handleDeeplink` / `allowDeeplink` | `userLogin` / `userLogout` |
| Android (Kotlin / Java) | v6 (`6.0.1`, GA) | `Purchasely { ... }` or `Purchasely.Builder(...)` | `PLYPresentation { ... }.preload()` → `display(context)` | per-action `interceptAction` returning `PLYInterceptResult` | auto-intercept + `handleDeeplink` / `allowDeeplink` | `userLogin` / `userLogout` |
| Flutter | v6 (`6.0.0`, stable on pub.dev) | `PurchaselyBuilder.apiKey(...).start()` | `PresentationBuilder...build()` → `preload()` / `display(...)` | per-action `interceptAction` returning `InterceptResult` | `handleDeeplink` / `allowDeeplink` | `userLogin` / `userLogout` |
| React Native | v6 (`6.0.0-rc.3`) | `Purchasely.builder(...).runningMode(...).start()` | `Purchasely.presentation.placement(...).build()` → `preload()` / `display(transition?)` | per-action `interceptAction` returning `'success' \| 'failed' \| 'notHandled'` | `handleDeeplink` / `allowDeeplink` | `userLogin` / `userLogout` |
| Cordova | v6 (`6.0.0-rc.3`) | `Purchasely.start(options, success, error)` | `fetchPresentationForPlacement` + `presentPresentation` (display-mode arg) | per-action `interceptAction` returning `InterceptResult` | `handleDeeplink` / `allowDeeplink` | `userLogin` / `userLogout` |

## Requirements

Expand Down Expand Up @@ -318,7 +318,16 @@ When a new SDK version is released:
1. **Update `purchasely/references/sdk-versions.md`** — single source of truth for pinned versions.
2. Update version references in `purchasely/skills/purchasely-integrate/SKILL.md` and each platform's `purchasely/references/<platform>/`.
3. Update `purchasely/references/` with new/changed APIs.
4. Bump `version` in `.claude-plugin/plugin.json`, `purchasely/.claude-plugin/plugin.json`, `purchasely/.codex-plugin/plugin.json`, and `package.json`.
4. Bump `version` in **every** manifest:
- `.claude-plugin/plugin.json`
- `.claude-plugin/marketplace.json`
- `.cursor-plugin/plugin.json`
- `.cursor-plugin/marketplace.json`
- `purchasely/.claude-plugin/plugin.json`
- `purchasely/.cursor-plugin/plugin.json`
- `purchasely/.codex-plugin/plugin.json`
- `package.json`
- `gemini-extension.json`
5. Add an entry to [CHANGELOG.md](CHANGELOG.md).
6. Tag and release.

Expand Down
2 changes: 1 addition & 1 deletion gemini-extension.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "purchasely",
"description": "Purchasely SDK integration assistant — guides implementation, reviews code, and debugs issues across iOS, Android, React Native, Flutter, and Cordova.",
"version": "1.1.0",
"version": "2.0.0-rc.6",
"contextFileName": "GEMINI.md"
}
2 changes: 1 addition & 1 deletion purchasely/commands/migrate.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
---
description: "Migrate an existing Purchasely SDK integration to a newer SDK major version"
argument-hint: "[platform: android|ios] [from:5.x] [to:6.0.0-rc.1]"
argument-hint: "[platform: android|ios|flutter|react-native|cordova] [from:5.x] [to:6.x]"
---

# Purchasely SDK Migration
Expand Down
2 changes: 1 addition & 1 deletion purchasely/hooks/intro.md
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ This project is using the **Purchasely AI Plugin**. You have access to five auto
- **`purchasely-integrate`** — step-by-step SDK integration: install, `Purchasely.start(...)`, paywall display, action interceptor, user login/logout, Restore, Manage Subscription, plus campaigns / promo offers / analytics.
- **`purchasely-review`** — checklist review that audits an existing integration for missing interceptor completions, deprecated APIs, identity ordering, `PrivacyInfo.xcprivacy`, Google Play Billing v8, log-level gating, and more.
- **`purchasely-debug`** — diagnostic flow for blank paywalls, frozen UI, purchase failures, and deeplinks. Includes SDK debug logging, `PLYError` decoding, and the screen-issue-report escalation template.
- **`purchasely-migrate`** — v5 → v6 migration for native iOS, native Android, and Flutter integrations.
- **`purchasely-migrate`** — v5 → v6 migration for native iOS, native Android, Flutter, React Native, and Cordova integrations.

## Expert agent

Expand Down
Loading
Loading