Skip to content

chore: release v0.2.0 - #20

Merged
tkgstrator merged 6 commits into
masterfrom
develop
Aug 1, 2026
Merged

tkgstrator merged 6 commits into
masterfrom
develop

Conversation

@tkgstrator

Copy link
Copy Markdown
Contributor

What

Promotes develop to master as v0.2.0.

Contents

Added

  • tools/deploy.sh — TrollStore IPA deploy: scp to the device,
    trollstorehelper install, relaunch. Keeps TrollStore Lite
    auto-discovery and ssh-255 tolerance out of consumer Makefiles.
  • tools/port_recipe.py — re-resolves a recipe's SITES table against
    a new target's dump index, rewriting the RVA and prologue columns while
    preserving row order. That order is load-bearing: cave payloads are
    allocated in declaration order while the dispatcher indexes by hook id,
    so the two only agree when position equals id.
  • tools/verify_offsets.py — diffs il2cpp field offsets between two
    dump.cs files. Prologue checks catch a moved method, but nothing
    catches a moved field, and a class that gains a member above the one a
    hook reads silently shifts every offset below it.

Fixed

  • build_patched_ipa names its output after the input IPA.
  • Falls back to the main executable when a framework is absent.

Test plan

  • uv run pytest — 89 passed
  • uv run ruff check tools tests — clean
  • port_recipe / verify_offsets exercised end-to-end producing the
    KIOU 1.1.0 recipe now merged in KIOU-Hook

🤖 Generated with Claude Code

tkgstrator and others added 6 commits June 25, 2026 03:19
Pin height=180 alongside width (icon is square) so the header reserves
space before the image loads, matching the Chinlan README.

Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
* fix(build_patched_ipa): name output after the input IPA

The default output name was derived from the consumer dylib basename
(e.g. KiouEngineBridge-patched.ipa), which loses the target app
identity and version. Derive it from the input IPA instead so
Kiou-1.0.1.ipa yields Kiou-1.0.1-patched.ipa — easier to tell apart
when sideloading multiple versions.

--output still overrides the default; only the auto-name changes.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

* fix(build_patched_ipa): strip .ipa case-insensitively

Per review: the literal .ipa suffix was only matched lowercase, so an
input named Foo.IPA produced Foo.IPA-patched.ipa. Use the bash glob
pattern [Ii][Pp][Aa] so any casing is stripped.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
build_patched_ipa.sh assumed the hook target lived at
`Payload/<name>.app/Frameworks/<FRAMEWORK>.framework/<FRAMEWORK>`,
which works for Unity-style consumers (KiouEditor, KiouKifExporter)
whose hook sites are in UnityFramework but breaks for pure Swift /
Objective-C apps whose hook sites live directly in the CFBundle
executable.

When --framework points at a Mach-O that doesn't exist under
Frameworks/ but does exist at the .app root, treat it as the main
executable instead. Existing Unity consumers see no behaviour change
(their framework path exists, so the fallback branch is never taken).

PiyoShot (targeting PiyoShogi.app/PiyoShogi) is the first consumer of
the new path.

Co-authored-by: Claude Opus 4.7 <noreply@anthropic.com>
* feat(tools): add TrollStore deploy script

Shipping a patched IPA to a device was a manual scp + ssh dance, and two device-specific gotchas kept biting: trollstorehelper cannot read /tmp (error 166), and its location differs between TrollStore and TrollStore Lite installs.

deploy.sh stages into /var/mobile/Documents with a chown to mobile, auto-discovers the helper while filtering out stale PersistenceHelper leftovers, kills the running process so the new binary actually dyld_loads, and tolerates the ssh exit 255 that a mid-install SpringBoard restart produces.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

* feat(tools): add recipe porting and field-offset diff tooling

port_recipe re-resolves a recipe's SITES table against a new target's
dump index, rewriting the RVA and prologue columns while preserving row
order. That order is load-bearing: cave payloads are allocated in
declaration order while the dispatcher indexes by hook id, so the two
only agree when position equals id.

verify_offsets diffs il2cpp field offsets between two dump.cs files.
Prologue checks catch a moved method, but nothing catches a moved field
— a class that gains a member above the one a hook reads silently
shifts every offset below it.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>

---------

Co-authored-by: tkgstrator <tkgstrator@users.noreply.github.com>
Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Minor bump: this release adds the TrollStore deploy script, port_recipe
and verify_offsets, plus the main-executable fallback when a framework is
absent. All new capability, no breaking change.

Co-authored-by: tkgstrator <tkgstrator@users.noreply.github.com>
Co-authored-by: Claude Opus 4.7 <noreply@anthropic.com>
@tkgstrator
tkgstrator merged commit 03632e5 into master Aug 1, 2026
4 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant