Skip to content

feat: add claude code parity and fix cross-sdk audit findings - #234

Merged
hyochan merged 14 commits into
mainfrom
feat/claude-parity-and-audit-fixes
Jul 20, 2026
Merged

hyochan merged 14 commits into
mainfrom
feat/claude-parity-and-audit-fixes

Conversation

@hyochan

@hyochan hyochan commented Jul 20, 2026 •

Copy link
Copy Markdown
Member

Summary

  • Bring Claude Code support to parity with Codex: dual-manifest plugins/openiap plugin, root marketplace (.claude-plugin/marketplace.json) + project-scoped .mcp.json, six .claude/skills/ adapters, and plugin/MCP documentation.
  • Fix findings from a full cross-package audit: an unauthenticated kit mutation (security), list-typed schema defaults in the GDScript codegen, and the documented invalid-API-key 400/403 status contract.
  • Close cross-SDK parity gaps: enforce documented platform guards in expo-iap, implement Android verifyPurchase in kmp-iap, and extend the CI parity audit with a google flavor handler wiring check.

Changes

Claude Code parity (plugins, marketplace, skills, docs) — e51f304, 14fcdae

  • plugins/openiap is now dual-manifest: .codex-plugin/plugin.json (Codex, MCP config at .codex-plugin/mcp.json) + .claude-plugin/plugin.json (Claude Code, inline MCP config), with the skills/ folder shared and agent-neutral.
  • Root .claude-plugin/marketplace.json publishes the plugin as a Claude Code marketplace; root .mcp.json registers the hosted IAPKit MCP endpoint (https://kit.openiap.dev/mcp) as a project-scoped server.
  • Six .claude/skills/ adapters (generate-doc, iapkit-e2e-martie, iapkit-e2e-petgu, opencollective-steward, openiap-workflows, review-self) point at the canonical .codex/skills/ bodies.
  • Docs: kit Claude-plugin page, MCP server guide updates, mcp-server README, and a PR preview recording committed under .github/pr-previews/ (attachment upload was blocked; linked below).

Security fix (packages/kit) — d3e8f93

  • markReceiptInvalid was a public Convex mutation with no authentication — any caller could invalidate receipts belonging to other tenants. It is now an internalMutation, callable only from server-side internal code.

Audit fixes (gql codegen, kit docs) — 4cbae29, 6104527

  • fix(gql): the GDScript plugin now emits list-typed schema defaults instead of dropping them.
  • docs(kit): invalid-API-key responses documented per the actual contract — 400 for malformed keys, 403 for unknown keys.

Cross-SDK parity (expo, kmp, CI) — 9d09b4e, 0d2c918, bb7f9bc

  • fix(expo): behavior change — platform-suffixed wrappers now enforce their documented platform guards. getStorefrontIOS (and other *IOS wrappers) previously succeeded silently on Android; they now throw per the documented contract.
  • feat(kmp): Android verifyPurchase implemented via the Play Developer API.
    • Follow-up a68733c → 0661489: the result mapping is now null-tolerant — openiap-google's reflective Gson parse leaves Google-omitted fields null despite non-null declarations, which made every real verification fail with an NPE-derived error; the result now round-trips through the generated fromJson defaults, with a regression test replicating the reflective parse.
  • ci: the SDK parity audit now verifies google flavor handler wiring, catching declared-but-not-wired store handlers.
    • Follow-up a68733c: the bundle parser masks Kotlin comments and string literals before its bracket/argument scans, so comments like // (optional) can no longer break the audit (review feedback).

IAPKit verified-state fixes (found by live Local-IAPKit E2E) — dfd8458, c7f6ddb

  • fix(kit): Google verification now consults the project's synced product catalog, so unconsumed catalog-known consumables record READY_TO_CONSUME instead of a PENDING_ACKNOWLEDGMENT the standard verify-then-finish client flow can never clear (mirrors the App Store mapping; unknown products keep prior behavior). Response-schema/docs notes updated.
  • fix(rn): the Android verifyPurchaseWithProvider bridge passed Kotlin enum constant names into spelling-sensitive mappers, degrading every multi-word IAPKit state (e.g. PENDING_ACKNOWLEDGMENT) to unknown in JS; it now uses rawValue like the iOS bridge.

Release notes — ddd48ff

  • Consolidated July 20 release entry in packages/docs for this train: expo-iap 4.6.0, react-native-iap 15.5.3, kmp-iap 2.6.0, godot-iap 2.5.2, plus the IAPKit service-side changes. Written in the assumed-published convention — the tag links go live when /release ships each package.

Chore — 739f0a3

  • Editor tsconfigs for expo-iap tests and the VS Code ESLint working-directory setting.

Preview

claude-parity-docs-preview.mp4

Test plan

  • bun audit:docs / bun audit:parity / bun run audit:release-state pass
  • packages/gql: 52 tests pass; regeneration produces no generated-file drift
  • packages/kit: tsc, eslint, 689 tests, smoke check pass
  • packages/docs: build passes
  • libraries/expo-iap: tsc, lint, 363 lib + 76 plugin + 109 example tests pass
  • libraries/react-native-iap: tsc, lint pass
  • scripts/agent: 57 tests pass
  • claude plugin validate passes
  • Hosted MCP tools/list matches the 13 documented iapkit_* tools
  • kmp-iap: :library:compilePlayDebugKotlinAndroid / :library:compileHorizonDebugKotlinAndroid / :library:compileAmazonDebugKotlinAndroid pass
  • kmp-iap: :library:build + unit tests on all 3 flavors pass, including the new VerifyPurchaseResultMappingTest
  • Live Local (IAPKit) receipt vertical: RN example on device, real sandbox purchase, local server 200/isValid: true, consume finished
  • kit: lint, prettier, tests (incl. 6 new mapping cases), smoke pass after the consumable-state change
  • react-native-iap: Android example compiles with the rawValue bridge fix

🤖 Generated with Claude Code

Summary by CodeRabbit

  • New Features
    • Added Claude Code support via the OpenIAP MCP server and updated marketplace/plugin metadata.
  • Bug Fixes
    • Android- and iOS-only APIs now fail deterministically with clear platform errors when used on the wrong platform.
    • Improved Google Play receipt/state handling using project catalog product type hints.
    • Updated Google Play verification to perform real verification, and aligned default in Godot in-app message categories to transactional.
  • Documentation
    • Expanded MCP/plugin guides and clarified Claude Code setup and project API key status-code meanings.
  • Tests
    • Added coverage for GraphQL enum-list defaults, JSON boundary mappings, and platform-guard behavior.

hyochan and others added 9 commits July 20, 2026 01:22
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_013CLqZZbW8qCoA1nWj2SxgV
@hyochan hyochan added 🎯 feature New feature 💨 ci Cloud integration labels Jul 20, 2026
@hyochan

hyochan commented Jul 20, 2026

Copy link
Copy Markdown
Member Author

/gemini review

@coderabbitai

coderabbitai Bot commented Jul 20, 2026 •

Copy link
Copy Markdown
Contributor

Review Change Stack

Note

Reviews paused

It looks like this branch is under active development. To avoid overwhelming you with review comments due to an influx of new commits, CodeRabbit has automatically paused this review. You can configure this behavior by changing the reviews.auto_review.auto_pause_after_reviewed_commits setting.

Use the following commands to manage reviews:

  • @coderabbitai resume to resume automatic reviews.
  • @coderabbitai review to trigger a single review.

Use the checkboxes below for quick actions:

  • ▶️ Resume reviews
  • 🔍 Trigger review
📝 Walkthrough

Walkthrough

This PR adds Claude Code and MCP marketplace integration, expands workflow and documentation guidance, enforces Expo platform guards, enables Android Google Play verification, updates Google receipt-state mapping and Godot defaults, and adds GDScript and Google flavor parity checks.

Changes

Claude Code and MCP integration

Layer / File(s) Summary
MCP configuration and plugin manifests
.claude-plugin/*, .mcp.json, plugins/openiap/*
Adds marketplace metadata, hosted MCP configuration, dual plugin manifests, and IAPKit API-key authentication guidance.
MCP server and client documentation
packages/mcp-server/*, packages/kit/public/*, packages/docs/public/*, AGENTS.md
Documents Claude Code support, MCP transports, tools, authentication, and API-key status semantics.
Claude plugin documentation route
packages/docs/src/pages/docs/guides/mcp-server.tsx, packages/kit/src/pages/docs/*
Adds Claude installation guidance, navigation, routing, page content, and sitemap coverage.

Mobile platform and purchase behavior

Layer / File(s) Summary
Expo platform enforcement and tests
libraries/expo-iap/src/modules/*, libraries/expo-iap/src/**/__tests__/*
Adds explicit Android and iOS platform guards, cross-platform rejection tests, and test TypeScript configurations.
Android Google Play verification
libraries/kmp-iap/library/src/androidMain/.../InAppPurchaseAndroid.kt, libraries/kmp-iap/library/src/androidUnitTest/*
Implements Android purchase verification through Google Play and validates JSON result mapping.
Catalog-aware Google receipt states
packages/kit/convex/purchases/*, packages/kit/server/api/v1/route-response-schemas.ts, packages/kit/src/pages/docs/sections/api.tsx
Uses catalog product types to classify Google consumables and updates purchase-state documentation.
Godot Android message defaults
libraries/godot-iap/addons/godot-iap/types.gd
Defaults Android in-app messages to the transactional category.

Code generation and SDK parity

Layer / File(s) Summary
Recursive GDScript schema defaults
packages/gql/codegen/plugins/gdscript.ts, packages/gql/src/codegen-defaults.test.ts
Adds recursive list default conversion and regression coverage for enum-list defaults.
Google flavor handler parity audit
scripts/audit-non-godot-parity.mjs, knowledge/internal/*, knowledge/_claude-context/context.md
Checks Google flavor handler wiring against the operation parity registry and documents the Android parity requirement.

Agent workflow governance

Layer / File(s) Summary
Claude skill adapters and workflow rules
.claude/skills/*, .claude/commands/commit.md, .codex/skills/openiap-workflows/SKILL.md, .claude/settings.json, .vscode/settings.json
Adds Claude workflow adapters, E2E and documentation skill instructions, internal workflow guards, and workspace configuration.
Repository compatibility and context guidance
AGENTS.md, knowledge/_claude-context/context.md, knowledge/internal/02-architecture.md
Updates package structure, Claude compatibility, MCP registration, and repository context guidance.

Convex mutation visibility

Layer / File(s) Summary
Internal receipt mutation contract
packages/kit/convex/purchases/mutation.ts, packages/kit/CONVENTION.md, .claude/guides/09-kit-package.md
Changes markReceiptInvalid to an internal mutation and documents its file-location exception.

Estimated code review effort: 4 (Complex) | ~60 minutes

Possibly related PRs

Suggested labels: 🤖 android, 🧪 test

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 27.27% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (4 passed)
Check name Status Explanation
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title accurately summarizes the main changes: Claude Code parity support plus cross-SDK audit fixes.
✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch feat/claude-parity-and-audit-fixes

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@gemini-code-assist gemini-code-assist Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Code Review

This pull request adds Claude Code compatibility, plugins, and documentation across the monorepo, and enforces platform guards in libraries/expo-iap to throw explicit platform errors. Additionally, it fixes a GDScript codegen regression for GraphQL enum-list defaults, converts markReceiptInvalid to an internal mutation for security, and updates the parity audit script to verify Android flavor handler wiring. The review feedback suggests adding an explicit fallback return to buildSchemaDefaultForType in the GDScript plugin to avoid implicit undefined returns, and stripping comments before matching argument names in the parity audit script to prevent false positives.

Important

The consumer version of Gemini Code Assist on GitHub is being sunset. Starting June 18, 2026, new organization installations will be blocked, and all code review activity will officially cease on July 17, 2026.
For more details on the timeline and next steps, please review the Help Documentation.

Comment on lines +154 to 164
if (type.kind === 'scalar') {
if (typeof defaultValue === 'string') {
return JSON.stringify(defaultValue);
}
if (
typeof field.defaultValue === 'number' ||
typeof field.defaultValue === 'boolean'
typeof defaultValue === 'number' ||
typeof defaultValue === 'boolean'
) {
return String(field.defaultValue);
return String(defaultValue);
}
}

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

medium

The buildSchemaDefaultForType function lacks an explicit fallback return statement. If the type kind is not 'list', 'enum', or 'scalar', or if a scalar default value is of an unexpected type, the function implicitly returns undefined. This can cause TypeScript compilation errors (under strictNullChecks or noImplicitReturns) and lead to malformed generated GDScript (e.g., empty or invalid array elements when joined). Adding an explicit return null; at the end of the function ensures unhandled cases are safely propagated as null.

Suggested change
if (type.kind === 'scalar') {
if (typeof defaultValue === 'string') {
return JSON.stringify(defaultValue);
}
if (
typeof field.defaultValue === 'number' ||
typeof field.defaultValue === 'boolean'
typeof defaultValue === 'number' ||
typeof defaultValue === 'boolean'
) {
return String(field.defaultValue);
return String(defaultValue);
}
}
if (type.kind === 'scalar') {
if (typeof defaultValue === 'string') {
return JSON.stringify(defaultValue);
}
if (
typeof defaultValue === 'number' ||
typeof defaultValue === 'boolean'
) {
return String(defaultValue);
}
}
return null;

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The explicit return null; fallback is already present at the end of buildSchemaDefaultForType — the suggestion matches the current code verbatim (see the if (type.kind === 'scalar') block followed by return null; at HEAD). Unhandled kinds and unexpected scalar default types already propagate as null, and the GQL tsc + tests pass on this branch.

Comment thread scripts/audit-non-godot-parity.mjs

@gemini-code-assist gemini-code-assist Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Code Review

This pull request introduces Claude Code compatibility, including plugins, MCP server configurations, and documentation updates. It also adds platform guards to Expo-IAP wrappers, fixes a GDScript codegen regression for list defaults, changes the markReceiptInvalid Convex mutation to internal-only for security, and introduces a Google flavor handler wiring check to the non-Godot parity audit script. Feedback highlights a potential compilation error in the KMP-IAP Android implementation due to type mismatches when delegating validateReceiptHandler to verifyPurchase, as well as a parsing vulnerability in the new audit script's bracket depth parser when handling string literals or comments.

Important

The consumer version of Gemini Code Assist on GitHub is being sunset. Starting June 18, 2026, new organization installations will be blocked, and all code review activity will officially cease on July 17, 2026.
For more details on the timeline and next steps, please review the Help Documentation.

Comment thread scripts/audit-non-godot-parity.mjs

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🧹 Nitpick comments (1)
scripts/audit-non-godot-parity.mjs (1)

870-878: 📐 Maintainability & Code Quality | 🔵 Trivial | 💤 Low value

Consider adjusting the arguments or messages for clearer audit failures.

Since expectSameSet hardcodes the words "parity registry" in its failure messages, passing the Kotlin bundle contents as the second argument (registryValues) results in inverted error messages. If the Kotlin file is missing an operation that exists in the registry, the script will output ... missing parity registry coverage: [operation], which suggests the registry needs updating rather than the Kotlin file.

Consider passing a tailored label or extracting the error message generation so that wiring failures explicitly instruct developers to update the OpenIapModule.kt bundle.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@scripts/audit-non-godot-parity.mjs` around lines 870 - 878, Adjust the wiring
audit around androidRelevantOperations and expectSameSet so failure messages
identify the Kotlin OpenIapModule.kt handler bundle as the source needing
updates, rather than hardcoding “parity registry” wording. Use a tailored label
or refactor the message-generation interface while preserving the existing set
comparison behavior for all other parity checks.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Nitpick comments:
In `@scripts/audit-non-godot-parity.mjs`:
- Around line 870-878: Adjust the wiring audit around androidRelevantOperations
and expectSameSet so failure messages identify the Kotlin OpenIapModule.kt
handler bundle as the source needing updates, rather than hardcoding “parity
registry” wording. Use a tailored label or refactor the message-generation
interface while preserving the existing set comparison behavior for all other
parity checks.

ℹ️ Review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: a9d4f2f3-974f-459e-a5b4-a6617304987d

📥 Commits

Reviewing files that changed from the base of the PR and between 27ca27e and 14fcdae.

⛔ Files ignored due to path filters (2)
  • .github/pr-previews/claude-parity-docs-preview.mp4 is excluded by !**/*.mp4
  • packages/gql/src/generated/types.gd is excluded by !**/generated/**
📒 Files selected for processing (50)
  • .claude-plugin/marketplace.json
  • .claude/commands/commit.md
  • .claude/guides/09-kit-package.md
  • .claude/settings.json
  • .claude/skills/generate-doc/SKILL.md
  • .claude/skills/iapkit-e2e-martie/SKILL.md
  • .claude/skills/iapkit-e2e-petgu/SKILL.md
  • .claude/skills/opencollective-steward/SKILL.md
  • .claude/skills/openiap-workflows/SKILL.md
  • .claude/skills/review-self/SKILL.md
  • .codex/skills/openiap-workflows/SKILL.md
  • .mcp.json
  • .vscode/settings.json
  • AGENTS.md
  • knowledge/_claude-context/context.md
  • knowledge/internal/02-architecture.md
  • knowledge/internal/04-platform-packages.md
  • libraries/expo-iap/plugin/src/__tests__/tsconfig.json
  • libraries/expo-iap/src/__tests__/tsconfig.json
  • libraries/expo-iap/src/modules/__tests__/android.test.ts
  • libraries/expo-iap/src/modules/__tests__/ios.test.ts
  • libraries/expo-iap/src/modules/__tests__/tsconfig.json
  • libraries/expo-iap/src/modules/android.ts
  • libraries/expo-iap/src/modules/ios.ts
  • libraries/expo-iap/src/utils/__tests__/tsconfig.json
  • libraries/godot-iap/addons/godot-iap/types.gd
  • libraries/kmp-iap/library/src/androidMain/kotlin/io/github/hyochan/kmpiap/InAppPurchaseAndroid.kt
  • packages/docs/public/llms-full.txt
  • packages/docs/src/pages/docs/guides/mcp-server.tsx
  • packages/gql/codegen/plugins/gdscript.ts
  • packages/gql/src/codegen-defaults.test.ts
  • packages/kit/CONVENTION.md
  • packages/kit/README.md
  • packages/kit/convex/purchases/mutation.ts
  • packages/kit/public/llms-full.txt
  • packages/kit/public/llms.txt
  • packages/kit/public/sitemap.xml
  • packages/kit/server/api/v1/routes.ts
  • packages/kit/src/pages/docs/nav.ts
  • packages/kit/src/pages/docs/routes.tsx
  • packages/kit/src/pages/docs/sections/ai-assistants.tsx
  • packages/kit/src/pages/docs/sections/api.tsx
  • packages/kit/src/pages/docs/sections/claude-plugin.tsx
  • packages/mcp-server/README.md
  • packages/mcp-server/package.json
  • plugins/openiap/.claude-plugin/plugin.json
  • plugins/openiap/.codex-plugin/mcp.json
  • plugins/openiap/.codex-plugin/plugin.json
  • plugins/openiap/skills/openiap/SKILL.md
  • scripts/audit-non-godot-parity.mjs
💤 Files with no reviewable changes (1)
  • .claude/settings.json

@hyochan hyochan changed the title feat: claude code plugin parity and audit fixes feat: add claude code parity and fix cross-sdk audit findings Jul 20, 2026
@hyochan hyochan added cross-platform Cross-platform (both Android & iOS) expo-iap expo-iap library kit IAPKit (receipt-validation SaaS) kmp-iap kmp-iap library ⬡ protocol 📖 documentation Improvements or additions to documentation 🛠 bugfix All kinds of bug fixes labels Jul 20, 2026
hyochan and others added 4 commits July 20, 2026 11:07
Kotlin comments and string literals containing brackets or commas (e.g.
`// (optional)` or `"a, b"`) inside a flavor handler bundle constructor
would break the bracket-depth walk and the top-level argument split in
parseHandlerBundleArgumentNames, producing spurious unbalanced-bundle or
missing-wiring audit failures. Mask their contents with spaces (indices
preserved) before scanning so only structural code characters count.

Addresses gemini-code-assist review threads on PR #234.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
openiap-google parses Play Developer API responses with reflective Gson,
which leaves declared-non-null fields null when Google omits them — and
real purchases.products.get / purchases.subscriptions.get responses never
contain the Amazon-RVS-shaped fields (parentProductId, productType,
receiptId, term, termSku). The direct constructor copy in verifyPurchase
then tripped Kotlin's parameter null checks, so every Google-verified
purchase surfaced as PurchaseVerificationFailed with a misleading
"Parameter specified as non-null is null" message, and validateReceipt
inherited the failure through its delegation.

Route the result through the JSON map boundary instead so the generated
fromJson applies its schema defaults, matching how the other wrappers
sanitize cross-artifact objects. Add a regression test that replicates
the reflective Gson parse of a realistic response and proves the mapping
absorbs the nulls.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
The Play Developer API cannot mark an inapp purchase as consumable, so
every unconsumed Google consumable was recorded as PENDING_ACKNOWLEDGMENT
at verify time — and since the standard client flow verifies before
finishTransaction, the purchases view showed consumables as "Pending
acknowledgment" forever while the App Store equivalent showed "Ready to
consume". Consult the project's synced product catalog during Google
verification and map unconsumed catalog-known consumables to
READY_TO_CONSUME, mirroring the App Store mapping; unknown products keep
the previous behavior. Update the response-schema and docs notes (the
old "App Store only" note was already stale for Amazon) and cover the
new mapping with unit tests.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
The Android verifyPurchaseWithProvider bridge passed Kotlin enum
constant names ("PendingAcknowledgment", "ReadyToConsume") into mappers
that only match separator-delimited spellings, so every multi-word
IAPKit purchase state degraded to UNKNOWN in JS while single-word states
passed through. Use rawValue ("pending-acknowledgment") like the iOS
bridge already does, for state, store, and provider alike.

Observed live: a Google consumable verify returned
state PENDING_ACKNOWLEDGMENT from the server but surfaced as
state: 'unknown' in the example app.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@hyochan hyochan added the react-native-iap react-native-iap library label Jul 20, 2026
Add the July 20 consolidated release entry for the PR #234 train,
grouped per package: expo-iap 4.6.0 (platform-guard behavior change),
react-native-iap 15.5.3 (android iapkit state bridge fix), kmp-iap 2.6.0
(android verifyPurchase), godot-iap 2.5.2 (in-app message default), and
the IAPKit service-side verified-state/hardening changes that deploy
with the dashboard. Links use the expected release tags per the
assumed-published release-note convention.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

🛠 bugfix All kinds of bug fixes 💨 ci Cloud integration cross-platform Cross-platform (both Android & iOS) 📖 documentation Improvements or additions to documentation expo-iap expo-iap library 🎯 feature New feature kit IAPKit (receipt-validation SaaS) kmp-iap kmp-iap library ⬡ protocol react-native-iap react-native-iap library

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant