Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
81 commits
Select commit Hold shift + click to select a range
d0fce82
feat(gql): add webhook event spec for ASN v2 / RTDN normalization
hyochan Apr 30, 2026
ca597d7
feat(kit): ingest Apple ASN v2 + Google RTDN webhooks (Phase 1 PR #2)
hyochan Apr 30, 2026
d718ccc
feat: stream webhook events to all 5 SDKs (Phase 1 PRs #3-#8)
hyochan Apr 30, 2026
5ba6f2a
feat(kit): add subscription state, paywalls, products, MCP server (on…
hyochan Apr 30, 2026
99e6292
feat: ASC/Play push-sync, Convex realtime SSE, KMP transports, dashbo…
hyochan Apr 30, 2026
ea23a03
fix(kit): wrap Platform / Type / Layout selects with ChevronDown so t…
hyochan May 1, 2026
dc2bfaf
feat(kit): unified /v1/webhooks/{apiKey} + Horizon polling reconciler…
hyochan May 1, 2026
2b40899
fix(webhooks): address PR #123 review — RTDN code mappings + Apple pr…
hyochan May 1, 2026
ccafe0e
fix(ci): drop webhook Subscription/Query from spec, fix KMP/Dart pars…
hyochan May 1, 2026
8068adb
chore: pin bun@1.3.13 + extend pre-commit gate to flutter / kmp
hyochan May 1, 2026
9dd9fce
fix(ci): bump CI bun to 1.3.13 + auto-fix no-unnecessary-type-assertion
hyochan May 1, 2026
c4b5eac
fix(kit): add mcp-server to Dockerfile workspace COPY list
hyochan May 1, 2026
f08f816
fix(kit): copy kit's local node_modules into builder stage so vite re…
hyochan May 1, 2026
a094600
fix(webhooks): address PR #124 review (IOS suffix, ConvexError, BigIn…
hyochan May 1, 2026
84b1b5e
feat(kit): file downloads + Configure-now links + drop meaningless Di…
hyochan May 1, 2026
7c37c3b
fix(kit,sdk): address PR #124 review threads (round 4)
hyochan May 1, 2026
35177ad
fix(kit-api): normalize headers via Headers ctor (PR #124 review)
hyochan May 1, 2026
35a3558
refactor(kit/settings): consolidate iOS/Android config into per-platf…
hyochan May 1, 2026
1d02519
fix(kit/settings): show 'Configuration Required' for missing iOS or A…
hyochan May 1, 2026
984dc9d
fix(kit,sdk): address PR #124 review threads (round 7) + CI sync drift
hyochan May 1, 2026
e04dab3
fix(kit/products): include push-ready subscriptions in iOS draft filter
hyochan May 1, 2026
e2b204a
fix(kit,sdk): address PR #124 review threads (round 9)
hyochan May 1, 2026
b521009
fix(kit/products): Android sync price/currency consistency + iOS 401 …
hyochan May 1, 2026
c76e59d
feat(kit): separate App Store Connect API key slot for push-sync
hyochan May 1, 2026
b6d6c8c
fix(kit/products): ASC push-sync falls back to Server API slot
hyochan May 1, 2026
cbd00b9
feat(kit): two-key iOS guidance + Android one-time products via new m…
hyochan May 1, 2026
40af6b8
feat(kit/settings): reorganize iOS .p8 sections + bump body text + dr…
hyochan May 1, 2026
0c1f5e1
fix(kit): inline-only .p8 setup guides, sidebar scroll containment, A…
hyochan May 1, 2026
f266d5f
feat(kit): paywall live preview + product hierarchy + ASC pagination …
hyochan May 2, 2026
e3a7a1b
fix: address PR #124 review threads on SDK transports + mcp probes
hyochan May 2, 2026
eac9266
fix: address PR #124 round-2 review threads on kit queries + naming
hyochan May 2, 2026
d264d1e
fix: address PR #124 round-3 review threads
hyochan May 2, 2026
8b6323a
fix: address PR #124 round-4 review threads
hyochan May 2, 2026
f529652
fix: address PR #124 round-5 review threads
hyochan May 2, 2026
d0fa24c
fix: address PR #124 round-6 review threads
hyochan May 2, 2026
27feff2
fix: address PR #124 round-7 review threads
hyochan May 2, 2026
4f87fda
fix: address PR #124 round-8 review threads
hyochan May 2, 2026
6d1c7a5
fix: address PR #124 round-9 review threads + gql codegen drift
hyochan May 2, 2026
5567d7e
fix: address PR #124 round-10 review threads
hyochan May 2, 2026
811ce3c
fix: address PR #124 round-11 review thread
hyochan May 2, 2026
32d385d
fix: address PR #124 round-12 review threads
hyochan May 2, 2026
95beb14
fix: address PR #124 round-13 review threads
hyochan May 2, 2026
4e9bb5b
refactor(kit/asc): inline second credentials site through resolveAscC…
hyochan May 2, 2026
8fd379c
feat(kit)!: drop hosted paywalls feature
hyochan May 2, 2026
07155e1
docs(webhooks): document operator setup + browser-empty caveat
hyochan May 2, 2026
d38b9c9
fix(kit): address PR #124 round-15 review threads
hyochan May 2, 2026
87c4af3
fix(kit,flutter): address remaining PR #124 round-15 review threads
hyochan May 2, 2026
058822d
fix(kit,sdk): address PR #124 round-16 review threads
hyochan May 2, 2026
7e09463
fix(kit,kmp): address PR #124 round-17 review threads
hyochan May 2, 2026
f9a1fbd
fix(kit,sdk): address PR #124 round-18 review threads
hyochan May 2, 2026
e2f872f
fix(kit): address final disputed PR #124 review threads
hyochan May 2, 2026
e6132cd
fix(kit): bound subscriptionStats scans (PR #124 round-20 review)
hyochan May 2, 2026
3a4db5b
fix(kit,kmp): bound budgets + WHATWG SSE consistency (PR #124 round-21)
hyochan May 2, 2026
c5fcc20
fix(kit): scheduler-based cron + bounded scans (PR #124 round-22)
hyochan May 2, 2026
dd232aa
fix(kit,kmp,godot): address PR #124 round-23 review threads
hyochan May 2, 2026
da30bd3
fix(kit,husky): address PR #124 round-24 review threads
hyochan May 2, 2026
6fd39c4
fix(kit,sdk): address PR #124 round-25 review threads
hyochan May 2, 2026
413370e
fix(kit,kmp,flutter): address PR #124 round-26 review threads
hyochan May 3, 2026
c45be5a
fix(kit): address PR #124 round-27 review threads
hyochan May 3, 2026
4189668
docs(comments): inline-link PR #NNN references to github URLs
hyochan May 3, 2026
bbf9d3f
refactor(kit-api): rename Kit* exports to IAPKit* for brand consistency
hyochan May 3, 2026
9ab9202
Revert "refactor(kit-api): rename Kit* exports to IAPKit* for brand c…
hyochan May 3, 2026
0362f2f
docs(subscription): link subscription-flow examples on each page; bro…
hyochan May 3, 2026
6fa071d
feat(flutter-example): add IAPKit verification option to subscription…
hyochan May 3, 2026
dcb7a7a
feat(expo-iap-example): add webhook stream demo screen
hyochan May 3, 2026
4ed7843
fix(kit,flutter): address PR #124 round-28 review threads
hyochan May 3, 2026
0cdd716
fix(kit): address PR #124 round-28 Gemini findings (5 of 8)
hyochan May 3, 2026
a0b3968
fix(expo-iap-example): drop Buffer + format webhook timestamps
hyochan May 3, 2026
b997ca7
fix(kit/horizon): self-paginating reconciler eliminates PER_STATE_CAP…
hyochan May 3, 2026
7bcbbaa
fix(kit): land remaining PR #124 round-28 architectural pushbacks
hyochan May 3, 2026
a553b2d
fix(kit): address PR #124 round-29 Gemini findings (3/3) + skill rule
hyochan May 3, 2026
1fc0549
fix(kit,sdk): address PR #124 round-29 Gemini follow-up findings (4/4)
hyochan May 3, 2026
3dd7437
fix(kit,examples): address PR #124 round-30 review threads (7 of 9)
hyochan May 3, 2026
b8d2eea
fix(kit,kmp): address PR #124 round-31 Gemini findings (3/3)
hyochan May 3, 2026
c453f95
fix(kit): address PR #124 round-32 Gemini findings (2/2)
hyochan May 3, 2026
26497ed
fix(kit): address PR #124 round-33 Gemini findings (2/2)
hyochan May 3, 2026
68b6e25
fix(kit,godot): address PR #124 round-34 Gemini findings (3/3)
hyochan May 3, 2026
9061813
fix(kit): address PR #124 round-35 Gemini findings (4/4)
hyochan May 3, 2026
a5b773a
fix(kit,sdk,examples): address PR #124 round-36 CodeRabbit review (8/8)
hyochan May 3, 2026
542b9a1
fix(expo-iap-example): extract base64EncodeUtf8 helper for webhook test
hyochan May 3, 2026
96aca3b
fix(kit): harden webhook stream delivery
hyochan May 3, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions .claude/commands/review-pr.md
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,10 @@ See [CLAUDE.md](../../CLAUDE.md) and [knowledge/internal/](../../knowledge/inter

**NEVER respond with "will address in a follow-up" or "will fix later".** Fix ALL review comments NOW in the current PR. Every comment must be addressed with a code fix and committed before replying. No exceptions.

**This rule applies to architectural / refactor / "out of scope" findings too.** Phrases like "tracked as a follow-up", "is its own refactor", "belongs in a dedicated PR", "real architectural change", "future enhancement", or "tracking as follow-up rather than landing in this PR" are NOT acceptable replies — they are deferrals dressed up. If the reviewer flagged a real correctness or operational gap, implement the fix in this PR, however much code it takes. Pagination, schema additions, new validators, API rewrites, scheduler-chained mutations — all in scope. Push back ONLY when the finding is wrong on the merits (e.g. a stylistic preference contradicting an existing schema convention), and back the pushback with concrete repo evidence.

If you are tempted to write "tracking as follow-up", stop and implement the fix instead.

For each comment:
1. **Read the code** mentioned in the comment
2. **Fix it** immediately
Expand Down
10 changes: 5 additions & 5 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -64,7 +64,7 @@ jobs:
- name: Setup Bun
uses: oven-sh/setup-bun@v2
with:
bun-version: 1.3.0
bun-version: 1.3.13

- name: Install dependencies
run: |
Expand Down Expand Up @@ -129,7 +129,7 @@ jobs:
- name: Setup Bun
uses: oven-sh/setup-bun@v2
with:
bun-version: 1.3.0
bun-version: 1.3.13

- name: Install dependencies
run: |
Expand Down Expand Up @@ -173,7 +173,7 @@ jobs:
- name: Setup Bun
uses: oven-sh/setup-bun@v2
with:
bun-version: 1.3.0
bun-version: 1.3.13

- name: Install dependencies
run: |
Expand Down Expand Up @@ -209,7 +209,7 @@ jobs:
- name: Setup Bun
uses: oven-sh/setup-bun@v2
with:
bun-version: 1.3.0
bun-version: 1.3.13

- name: Install dependencies
run: |
Expand Down Expand Up @@ -249,7 +249,7 @@ jobs:
- name: Setup Bun
uses: oven-sh/setup-bun@v2
with:
bun-version: 1.3.0
bun-version: 1.3.13

- name: Install dependencies
working-directory: scripts/agent
Expand Down
2 changes: 1 addition & 1 deletion .github/workflows/dependabot-bun-lockfile.yml
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,7 @@ jobs:
- name: Setup Bun
uses: oven-sh/setup-bun@v2
with:
bun-version: 1.3.0
bun-version: 1.3.13

- name: Run bun install
id: install
Expand Down
4 changes: 2 additions & 2 deletions .github/workflows/deploy-kit.yml
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,7 @@ jobs:
- name: Setup Bun
uses: oven-sh/setup-bun@v2
with:
bun-version: 1.3.0
bun-version: 1.3.13

- name: Install dependencies (workspace root)
working-directory: ${{ github.workspace }}
Expand Down Expand Up @@ -138,7 +138,7 @@ jobs:
if: ${{ env.KIT_CONVEX_DEPLOY_KEY != '' }}
uses: oven-sh/setup-bun@v2
with:
bun-version: 1.3.0
bun-version: 1.3.13

- name: Deploy Convex functions
if: ${{ env.KIT_CONVEX_DEPLOY_KEY != '' }}
Expand Down
21 changes: 21 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,27 @@ coverage/
.env.local
.env.*.local

# IAPKit credential files downloaded from prod for local testing.
# Apple .p8 keys + Google service-account JSONs must never be
# committed — they'd grant attackers App Store Server API / Play
# Developer API access on the corresponding project.
*.p8
**/service-account*.json
# Catch-all for Google Cloud project keys downloaded as
# `<project-id>-<hash>.json` (the default name from the GCP console).
# Replaces the per-project `martie-c0b27-*.json` pattern that only
# helped one developer's local setup. We cover the two real formats
# the IAM console produces:
# 1. `<project-id>-<5-hex suffix>-<12-hex key id>.json`
# (project IDs with the GCP-auto-generated 5-char uniqueness suffix)
# 2. `<project-id>-<12-hex key id>.json`
# (project IDs the operator named themselves, no GCP suffix)
# Pinning the trailing key-id to exactly 12 hex chars keeps legitimate
# config files (`tsconfig-base.json`, `eslint-config.json`, etc.) out
# of the match while still catching every key the console emits.
**/*-[0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f]-[0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f].json
**/*-[0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f].json

# Temp
tmp/
temp/
Expand Down
70 changes: 70 additions & 0 deletions .husky/pre-commit
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,47 @@ set -e
REPO_ROOT="$(cd "$(dirname "$0")/.." && pwd)"
cd "$REPO_ROOT"

# Bun version pin guard. CI's Docker image uses the version declared in
# `package.json`'s `packageManager` field (currently bun@1.3.13). bun
# lockfiles are not stable across major-minor versions — a lockfile
# generated by an older local bun will pass `--frozen-lockfile` here
# but fail in Docker. Before doing anything else, refuse to commit
# from a mismatched bun.
#
# The guard must be fail-closed: if `node` isn't on PATH or the
# package.json read fails, do not silently bypass — the whole point of
# the gate is preventing lockfile drift, and a stealth bypass defeats it.
#
# Use `bun -e` instead of `node -p`. Bun is the project's required
# runtime (the gate's whole purpose is to enforce a pinned bun
# version), so requiring node here just to parse the JSON would add a
# second mandatory toolchain. `bun -e` reads JSON via the same
# require() shim Node does and exits with the parse error if the file
# is malformed, matching the previous failure mode without the extra
# dep.
if ! command -v bun >/dev/null 2>&1; then
echo "❌ pre-commit gate: \`bun\` not on PATH — required to read packageManager pin from package.json."
echo " install bun (https://bun.sh) and re-commit."
exit 1
fi
EXPECTED_BUN="$(bun -e "console.log(require('./package.json').packageManager.split('@')[1])")"
if [ -z "$EXPECTED_BUN" ]; then
echo "❌ pre-commit gate: could not read \`packageManager\` from package.json."
echo " the bun version pin is missing or malformed — fix package.json before committing."
exit 1
fi
ACTUAL_BUN="$(bun --version 2>/dev/null || echo unknown)"
if [ "$EXPECTED_BUN" != "$ACTUAL_BUN" ]; then
echo "❌ bun version mismatch:"
echo " package.json packageManager: bun@$EXPECTED_BUN"
echo " local bun --version: $ACTUAL_BUN"
echo " run \`bun upgrade\` (or install bun@$EXPECTED_BUN) and re-commit."
echo " (Lockfiles drift across bun versions — CI's Docker uses"
echo " the pinned version and will fail with"
echo " 'lockfile had changes, but lockfile is frozen' otherwise.)"
exit 1
fi

# Paths-aware kit pre-commit gate. Only runs when staged changes touch
# packages/kit/**, so unrelated edits to apple/google/gql/docs/libraries
# aren't blocked.
Expand Down Expand Up @@ -57,6 +98,35 @@ if git diff --cached --name-only --diff-filter=ACMR | grep -q '^packages/kit/';
bun run --filter @hyodotdev/openiap-kit smoke:server
fi

# Paths-aware Flutter analyze. Triggers on any libraries/flutter_inapp_purchase
# edit. Catches the `ambiguous_export` class of failure that took out
# CI on PR #124 — locally `flutter analyze` runs in <2s with a warm
# pub cache.
if git diff --cached --name-only --diff-filter=ACMR \
| grep -qE '^libraries/flutter_inapp_purchase/(lib|test)/'; then
if command -v flutter >/dev/null 2>&1; then
echo "🐦 flutter-touched commit — running flutter analyze…"
(cd libraries/flutter_inapp_purchase && flutter analyze)
else
echo "⚠️ flutter not on PATH — skipping flutter analyze (CI will catch any issues)."
fi
fi

# Paths-aware KMP compile check. Uses the existing `:library:compileDebugKotlinAndroid`
# task because that's the same target CI runs. With a warm gradle daemon
# this finishes in 5-10s; first run after `./gradlew --stop` can take 30-40s.
# Catches the redeclaration / interface-method-missing class of failure
# that hit PR #124.
if git diff --cached --name-only --diff-filter=ACMR \
| grep -qE '^(libraries/kmp-iap/library/src|packages/gql/src/)' ; then
if [ -x libraries/kmp-iap/gradlew ]; then
echo "🎯 kmp/gql-touched commit — running ./gradlew :library:compileDebugKotlinAndroid…"
(cd libraries/kmp-iap && ./gradlew :library:compileDebugKotlinAndroid -q)
else
echo "⚠️ libraries/kmp-iap/gradlew not executable — skipping KMP compile."
fi
fi

# Paths-aware docs typecheck. The kit integration brought React 19 into
# the workspace alongside docs's React 18, which previously caused
# @types/react hoisting to break docs's tsc only in CI. Both are now on
Expand Down
Loading
Loading