Release 1.1.0
Foundation overhaul — make the skill a real, tested, installable Python package
This release is internal foundation work. There are no agent-contract changes:
the four slash commands (/aso-full-audit, /aso-optimize, /aso-prelaunch,
/aso-competitor), the outputs/[app-name]/ folder layout, and every legacy
file path inside app-store-optimization/ and .claude/skills/aso/ continue
to work unchanged.
Added
aso_skill/Python package — canonical home for the eight analytic
modules (scorer.py,metadata.py,keywords.py,competitors.py,
ab_test.py,localization.py,reviews.py,checklist.py) plus
itunes.pyanditunes_cache.py. Public API is re-exported from
aso_skill/__init__.py. Now properlypip install-able.asoCLI — new console script (pip install -e .exposesaso).
Subcommands:score,optimize,validate,keywords,ab-test,
checklist,itunes {search,app}. Reads JSON from--inputor stdin,
writes JSON to--outputor stdout. Exit codes: 0 ok, 1 validation
failure, 2 usage error.__main__blocks on all analytic modules sopython3 aso_scorer.py < input.jsonworks — this fixes the previously-broken agent contract at
aso-strategist.md:932.pytestsuite (tests/, 50 tests, runs in <3s, stdlib-only) covering
the scorer math, character-limit validation, A/B significance, CLI
subprocess invocation, golden-output structural assertions, iTunes cache
behaviour, and a date-regression guard.- iTunes file cache (
aso_skill/itunes_cache.py) — 24h TTL by default,
per-URL keying withsha1short hash, stale-fallback on network failure,
cache dir under$XDG_CACHE_HOME/aso-skill/itunes/. Bypass via
ASO_ITUNES_NO_CACHE=1; clear viaaso itunes --clear-cache. scripts/materialize_compat.py— Windows / ZIP fallback that replaces
the backward-compat symlinks with real file copies when the filesystem
doesn't support them.
Changed
pyproject.toml— bumped to 1.1.0, added[project.scripts],
[project.optional-dependencies] test,[tool.setuptools.packages.find],
[tool.pytest.ini_options]. Fixed the silent ruff isort
known-first-partytypo (was the hyphenated name, which ruff ignored).python-quality.yml— now lintsaso_skill scripts tests(the new
canonical paths) and runspytest tests/across the existing 3.8–3.13
matrix. Character-limit check rewritten against the dict-form constants..claude/skills/aso/— converted from a hand-maintained copy (which
had silently drifted fromapp-store-optimization/) into a directory
symlink. Drift is now structurally impossible.- Legacy hyphenated paths (
app-store-optimization/aso_scorer.pyand
the seven sibling .py files pluslib/itunes_api.py) are now symlinks
intoaso_skill/. Agents thatcd app-store-optimization && python3 <module>.pykeep working without modification.
Fixed
- Hardcoded reference date in
aso-strategist.md(lines 27, 237, 1097)
andaso-prelaunch.md:66— replaced with instructions to compute the
current date viadate -u +%Y-%m-%dat run time. Previously every
generated timeline after Nov 2025 referenced past dates. - Drift between
.claude/skills/aso/andapp-store-optimization/—
every analytic file had diverged (different sizes, different content).
Symlinking ends the drift permanently. - Broken agent contract —
aso-strategist.md:932invoked
python3 aso_scorer.py < /tmp/aso_input.jsonagainst a module without
any__main__block. New main blocks make this command work.
Migration / breaking changes
- None for end users. Every existing path keeps working. ZIP installs,
cp -r app-store-optimization ~/.claude/skills/, agent prompts, and
/aso-*slash commands all continue to function. - For contributors: new code should go in
aso_skill/, not
app-store-optimization/(which is now a symlink farm).