Skip to content

Add app pricing comparison, global keyword list, more mcp tools#8

Open
akshaynexus wants to merge 9 commits into
hubab1:mainfrom
akshaynexus:main
Open

Add app pricing comparison, global keyword list, more mcp tools#8
akshaynexus wants to merge 9 commits into
hubab1:mainfrom
akshaynexus:main

Conversation

@akshaynexus

Copy link
Copy Markdown

TODO : Write pr desciption detailing features/changes added

NOTE: This works but is inefficient and buggy specially the global keyword list

wip to fix these issues right now

akshaynexus and others added 9 commits July 11, 2026 00:20
- New pricing comparison feature: AppPricingSnapshot model, AppPricingPersistence, AppPricingView, and per-storefront price fetching with USD/tax-adjusted comparisons
- Migrate SwiftData schema to OpenASOSchemaV2
- Expand MCP server with workspace/app resources, global keyword CRUD, keyword track mutations, pricing comparison, ranking and rating history tools
- Add rankingDifficulty metrics source, batched storefront popularity fetching, and reworked ranking refresh coordination

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
- Fetch storefront reviews with a 6-wide task group instead of a serial per-country loop
- Run keywords and ratings/reviews refreshes concurrently; overlap ratings and reviews fetch legs
- Keep the ranking fetch window saturated during persistence flushes
- Dedup daily stale-track refreshes by query key so shared keywords are fetched once
- Batch keyword popularity persistence into one write per storefront batch; raise storefront concurrency to 4; retry transient rate-limit/network errors with backoff; fetch >100-term chunks in parallel
- Debounce keyword search and split heavy row materialization from in-memory filters in AppKeywordsView
- Cache reusable-keyword JSON, hoist count grouping out of the sort comparator, and batch KeywordQuery resolution in AddKeywordsSheet
- Move ranking-list sheet enrichment joins into a single background read
- Merge redundant background reads in MCP refreshKeywordMetrics
- Update tests for schema V2 migration plan and concurrent chunk ordering

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…ng to apps

- Global keywords are now plain reusable terms (no per-country/device copies); legacy per-storefront entries collapse to unique terms on load
- Applying global keywords in Add Keywords fans them out across the currently selected countries and device
- Remove ensureGlobalKeywordTracks so refreshes never silently add global keywords to an app; they are only added explicitly
- Manage Keyword Lists edits global terms without country/device pickers
- Simplify MCP global keyword tools (list/add/update) to term-only

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
- New Apply to Apps sheet on the Global keyword list: adds every global keyword to all tracked apps for chosen countries and device
- Replace mode removes keywords in the selected countries/device that are not in the global list (clears their ranking history), enabling a clean reset of legacy US-only tracks
- Keyword queries resolved with one batch fetch shared across apps

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
- Extract the global keyword list editor into a shared GlobalKeywordListEditorView
- New sidebar footer entry opens the global list manager directly, without going through an app
- Per-app Keyword Lists sheet embeds the same editor on its Global tab; its local scope logic is now local-only

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…market insights

- Global keyword add/edit/delete/reset (UI and MCP) now reconciles every tracked app's keyword tracks automatically across all bundled storefronts; sync-created tracks carry a marker note so manual keywords are never touched
- New tracks get rankings and metrics fetched in the background through one deduplicated coordinator pass (shared keyword+market queries fetched once, not per app), with sidebar progress
- Remove the manual Apply to Apps sheet, now obsolete
- New Market Insights sheet in the keywords toolbar: per keyword, best and worst ranking market, spread, average rank, and ranked-market coverage
- New MCP tool list_keyword_market_rankings exposing the same best/worst market data per keyword; global keyword mutation results now include a sync summary

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
SwiftData traps with "Couldn't find \TrackedApp.name" when a FetchDescriptor
or @query sorts on TrackedApp.name, which is computed rather than a schema
field. Sort GlobalKeywordSync's app fetch and GlobalKeywordsSheet's query by
appStoreID instead, and add a GlobalKeywordSync regression test covering
cross-storefront insert and removal through the background store.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…etch

The sync's ranking fetch ran on the main-context coordinator while
user-triggered app refreshes persisted the same unique-keyed crawls on the
background context; CoreData's merge policy throws on the resulting to-many
union merge (NSMergePolicy _mergeToManyUnionRelationships) and aborts.

Route the post-sync fetch through the AppDetailRefreshService queue as one
combined request instead: all persistence stays serialized on the background
store, shared keyword+market queries across apps are fetched once, and the
sidebar shows a single "Global keywords" progress card.

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

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant