{"id":"88366bd6-cc38-40d1-9005-5c5e98a40956","shortId":"2C5RGG","kind":"skill","title":"asc-whats-new-writer","tagline":"Generate engaging, localized App Store release notes (What's New) from git log, bullet points, or free text using canonical metadata under `./metadata`. Optionally pairs with promotional text updates.","description":"# asc What's New Writer\n\nGenerate engaging, localized release notes from flexible input. Optionally pair with promotional text updates.\n\n## Preconditions\n\n- Metadata pulled locally into canonical files via `asc metadata pull --app \"APP_ID\" --version \"1.2.3\" --dir \"./metadata\"`. OR: user provides keywords manually.\n- Auth configured for upload (`asc auth login` or `ASC_*` env vars).\n- The **primary locale** is `en-US` unless the user specifies otherwise.\n\n## Before You Start\n\n1. Read `references/release_notes_guidelines.md` for tone, structure, and examples.\n2. Identify the **latest version directory** under `metadata/version/` (highest semver). Use this for all metadata reads.\n3. Enumerate **existing locales** by listing the JSON files in that version directory.\n\n## Phase 1: Gather Input\n\nAccept one of three input modes (auto-detect):\n\n### Git Log\n\nParse commits since the last tag:\n\n```bash\n# Find latest tag\ngit describe --tags --abbrev=0\n\n# List commits since that tag\ngit log $(git describe --tags --abbrev=0)..HEAD --oneline --no-merges\n```\n\nFilter out noise: merge commits, dependency bumps, CI changes, formatting-only commits. Extract user-facing changes.\n\n### Bullet Points\n\nUser provides rough bullets like:\n- \"improved search\"\n- \"fixed crash on launch\"\n- \"added sleep timer\"\n\n### Free Text\n\nUser describes changes conversationally:\n> \"We made search faster, fixed that annoying crash when you open the app, and added a sleep timer feature\"\n\nThe skill extracts and structures the changes from the text.\n\n### No Input Provided\n\nPrompt the user: \"What changed in this release? You can paste git log output, bullet points, or just describe the changes.\"\n\n## Phase 2: Draft Notes (Primary Locale)\n\n### Step 1: Classify Changes\n\nGroup changes into sections per the guidelines:\n- **New** — new features or capabilities\n- **Improved** — enhancements to existing features\n- **Fixed** — bug fixes users would notice\n\nOmit empty sections. If all changes are fixes, only show \"Fixed.\"\n\n### Step 2: Write Benefit-Focused Copy\n\nFollow the tone rules from `references/release_notes_guidelines.md`:\n- Describe user impact, not implementation details\n- Use direct address (\"you\") and action verbs\n- Be specific — mention concrete improvements\n\n### Step 3: Front-Load the Hook\n\nThe first ~170 characters are the only visible part before \"more.\" Lead with the single most impactful change in a complete, compelling sentence.\n\n### Step 4: Echo Keywords for Conversion\n\n1. Read `keywords` from `metadata/version/{latest}/{primary-locale}.json`\n   - These canonical files are also what `asc metadata keywords ...` reads and writes.\n2. If the field is empty or missing, skip this step\n3. Identify keywords relevant to the changes being described\n4. Weave them naturally into the notes — never force or stuff\n\n### Step 5: Respect Character Limits\n\n- Keep total length between 500-1500 characters in the primary locale\n- This leaves room for localized expansions (some languages expand 30-40%)\n- Hard limit: 4,000 characters\n\n### Step 6: Optionally Draft Promotional Text\n\nIf the user wants it, draft a 170-char promotional text that:\n- Summarizes the update's theme in one punchy line\n- Can reference seasonal events\n- Is updatable without a new submission\n\n### Present Draft\n\nShow the draft to the user with character count. Wait for approval before localizing.\n\n## Phase 3: Localize\n\nTranslate the approved notes to all existing locales.\n\n### Translation Rules\n\n- Use formal register and formal \"you\" forms (Russian: вы, German: Sie, French: vous, Spanish: usted, Dutch: u, Italian: Lei)\n- Adapt tone to local market — playful English may need adjustment for formal markets (ja, de-DE)\n- Do NOT literally translate idioms — adapt them to local equivalents\n- A playful tone in English may need to be more respectful or formal in other cultures\n\n### Locale-Specific Keyword Echo\n\nFor each locale:\n1. Read `keywords` from `metadata/version/{latest}/{locale}.json`\n2. Echo locale-specific keywords naturally in the translated notes\n3. If keywords field is empty, skip echo for that locale\n\n### Validate\n\n- All translations must be ≤ 4,000 characters\n- Promotional text must be ≤ 170 characters per locale\n- If a translation exceeds the limit, shorten it — never truncate mid-sentence\n\n## Phase 4: Review & Upload\n\n### Step 1: Present Summary\n\nShow a table of all locales with their notes and character counts:\n\n```\n| Locale | What's New (first 80 chars...) | Chars | Promo Text | Chars |\n|--------|-------------------------------|-------|------------|-------|\n| en-US  | Search just got faster — ...   | 847   | New sleep… | 142   |\n| ar-SA  | البحث أصبح أسرع — ...           | 923   | نوم جديد…  | 138   |\n| ...    | ...                           | ...   | ...        | ...   |\n```\n\n### Step 2: Wait for Approval\n\nDo not upload without user confirmation.\n\n### Step 3: Upload\n\nUpload via `asc` (verify exact syntax with `asc --help`):\n\n```bash\n# Individual locale direct update\nasc apps info edit --app \"APP_ID\" --version-id \"VERSION_ID\" --locale \"en-US\" --whats-new \"Your release notes here\"\n\n# Bulk canonical-metadata push after writing ./metadata/version/<version>/<locale>.json\nasc metadata push --app \"APP_ID\" --version \"1.2.3\" --dir \"./metadata\" --dry-run\nasc metadata push --app \"APP_ID\" --version \"1.2.3\" --dir \"./metadata\"\n```\n\nIf promotional text was drafted, either include `--promotional-text \"...\"` in the direct update command or write `promotionalText` into the canonical JSON before `asc metadata push`.\n\n### Step 4: Handle Failures\n\nOn partial upload failure:\n- Report which locales succeeded and which failed\n- Offer to retry failed locales\n\n## Metadata File Paths\n\n- **Keywords:** `metadata/version/{latest-version}/{locale}.json` → `keywords` field\n- **Current What's New:** `metadata/version/{latest-version}/{locale}.json` → `whatsNew` field\n- **Latest version:** highest semver directory under `metadata/version/`\n- The canonical `./metadata` tree is what `asc metadata pull`, `asc metadata push`, and `asc metadata keywords ...` operate on.\n- Follows the same metadata resolution conventions as `asc-aso-audit`\n\n## Notes\n\n- What's New is **not indexed** for App Store search — write for humans, not algorithms.\n- Promotional text is the only metadata field updatable without a new submission.\n- The 170-char visible window is the most important part of your release notes.\n- Each app update triggers algorithm re-evaluation — the act of updating matters, even if the text doesn't affect ranking.\n- Ideal update cadence: every 2-4 weeks.\n- For full metadata translation (all fields), use `asc-localize-metadata` instead.\n- For keyword research and optimization, use `asc-aso-audit` first.\n- If the local keyword field is stale before drafting, refresh it with `asc metadata pull` or inspect planned keyword changes with `asc metadata keywords diff`.","tags":["asc","whats","new","writer","app","store","connect","cli","skills","rorkai","agent-skills","ai-skills"],"capabilities":["skill","source-rorkai","skill-asc-whats-new-writer","topic-agent-skills","topic-ai-skills","topic-app-store-connect","topic-apple","topic-asc","topic-automation","topic-cicd","topic-cli","topic-devops","topic-ios","topic-macos","topic-testflight"],"categories":["app-store-connect-cli-skills"],"synonyms":[],"warnings":[],"endpointUrl":"https://skills.sh/rorkai/app-store-connect-cli-skills/asc-whats-new-writer","protocol":"skill","transport":"skills-sh","auth":{"type":"none","details":{"cli":"npx skills add rorkai/app-store-connect-cli-skills","source_repo":"https://github.com/rorkai/app-store-connect-cli-skills","install_from":"skills.sh"}},"qualityScore":"0.700","qualityRationale":"deterministic score 0.70 from registry signals: · indexed on github topic:agent-skills · 776 github stars · SKILL.md body (6,869 chars)","verified":false,"liveness":"unknown","lastLivenessCheck":null,"agentReviews":{"count":0,"score_avg":null,"cost_usd_avg":null,"success_rate":null,"latency_p50_ms":null,"narrative_summary":null,"summary_updated_at":null},"enrichmentModel":"deterministic:skill-github:v1","enrichmentVersion":1,"enrichedAt":"2026-05-02T18:53:03.322Z","embedding":null,"createdAt":"2026-04-18T21:56:55.860Z","updatedAt":"2026-05-02T18:53:03.322Z","lastSeenAt":"2026-05-02T18:53:03.322Z","tsv":"'-1500':454 '-4':980 '-40':470 '/metadata':28,71,792,805,885 '/metadata/version':781 '0':169,181 '000':474,648 '1':103,141,287,391,612,676 '1.2.3':69,790,803 '138':722 '142':712 '170':364,489,654,941 '2':111,281,325,413,620,724,979 '3':127,356,424,530,631,735 '30':469 '4':386,433,473,647,672,833 '5':445 '500':453 '6':477 '80':696 '847':709 '923':719 'abbrev':168,180 'accept':144 'act':963 'action':348 'ad':218,241 'adapt':561,583 'address':345 'adjust':570 'affect':973 'algorithm':927,958 'also':405 'annoy':233 'app':9,65,66,239,752,755,756,786,787,799,800,920,955 'approv':526,534,727 'ar':714 'ar-sa':713 'asc':2,35,62,81,85,407,739,744,751,783,796,829,889,892,896,909,990,1001,1017,1026 'asc-aso-audit':908,1000 'asc-localize-metadata':989 'asc-whats-new-writ':1 'aso':910,1002 'audit':911,1003 'auth':77,82 'auto':151 'auto-detect':150 'bash':161,746 'benefit':328 'benefit-focus':327 'bug':308 'bulk':774 'bullet':19,205,210,273 'bump':193 'cadenc':977 'canon':25,59,402,776,826,884 'canonical-metadata':775 'capabl':301 'chang':195,204,225,252,263,279,289,291,318,379,430,1024 'char':490,697,698,701,942 'charact':365,447,455,475,522,649,655,689 'ci':194 'classifi':288 'command':820 'commit':156,171,191,199 'compel':383 'complet':382 'concret':353 'configur':78 'confirm':733 'convent':906 'convers':226,390 'copi':330 'count':523,690 'crash':215,234 'cultur':603 'current':864 'de':576,577 'de-d':575 'depend':192 'describ':166,178,224,277,337,432 'detail':342 'detect':152 'diff':1029 'dir':70,791,804 'direct':344,749,818 'directori':116,139,880 'doesn':971 'draft':282,479,487,514,517,810,1013 'dri':794 'dry-run':793 'dutch':557 'echo':387,608,621,638 'edit':754 'either':811 'empti':314,418,636 'en':93,703,765 'en-us':92,702,764 'engag':7,41 'english':567,592 'enhanc':303 'enumer':128 'env':86 'equival':587 'evalu':961 'even':967 'event':506 'everi':978 'exact':741 'exampl':110 'exceed':661 'exist':129,305,538 'expand':468 'expans':465 'extract':200,248 'face':203 'fail':846,850 'failur':835,839 'faster':230,708 'featur':245,299,306 'field':416,634,863,875,934,987,1009 'file':60,135,403,853 'filter':187 'find':162 'first':363,695,1004 'fix':214,231,307,309,320,323 'flexibl':46 'focus':329 'follow':331,901 'forc':441 'form':548 'formal':543,546,572,600 'format':197 'formatting-on':196 'free':22,221 'french':553 'front':358 'front-load':357 'full':983 'gather':142 'generat':6,40 'german':551 'git':17,153,165,175,177,270 'got':707 'group':290 'guidelin':296 'handl':834 'hard':471 'head':182 'help':745 'highest':119,878 'hook':361 'human':925 'id':67,757,760,762,788,801 'ideal':975 'identifi':112,425 'idiom':582 'impact':339,378 'implement':341 'import':948 'improv':212,302,354 'includ':812 'index':918 'individu':747 'info':753 'input':47,143,148,257 'inspect':1021 'instead':993 'italian':559 'ja':574 'json':134,400,619,782,827,861,873 'keep':449 'keyword':75,388,393,409,426,607,614,625,633,855,862,898,995,1008,1023,1028 'languag':467 'last':159 'latest':114,163,396,617,858,870,876 'latest-vers':857,869 'launch':217 'lead':373 'leav':461 'lei':560 'length':451 'like':211 'limit':448,472,663 'line':502 'list':132,170 'liter':580 'load':359 'local':8,42,57,90,130,285,399,459,464,528,531,539,564,586,605,611,618,623,641,657,684,691,748,763,842,851,860,872,991,1007 'locale-specif':604,622 'log':18,154,176,271 'login':83 'made':228 'manual':76 'market':565,573 'matter':966 'may':568,593 'mention':352 'merg':186,190 'metadata':26,55,63,125,408,777,784,797,830,852,890,893,897,904,933,984,992,1018,1027 'metadata/version':118,395,616,856,868,882 'mid':669 'mid-sent':668 'miss':420 'mode':149 'must':645,652 'natur':436,626 'need':569,594 'never':440,666 'new':4,15,38,297,298,511,694,710,769,867,915,938 'no-merg':184 'nois':189 'note':12,44,283,439,535,630,687,772,912,953 'notic':312 'offer':847 'omit':313 'one':145,500 'onelin':183 'open':237 'oper':899 'optim':998 'option':29,48,478 'otherwis':99 'output':272 'pair':30,49 'pars':155 'part':370,949 'partial':837 'past':269 'path':854 'per':294,656 'phase':140,280,529,671 'plan':1022 'play':566,589 'point':20,206,274 'precondit':54 'present':513,677 'primari':89,284,398,458 'primary-local':397 'promo':699 'promot':32,51,480,491,650,807,814,928 'promotional-text':813 'promotionaltext':823 'prompt':259 'provid':74,208,258 'pull':56,64,891,1019 'punchi':501 'push':778,785,798,831,894 'rank':974 're':960 're-evalu':959 'read':104,126,392,410,613 'refer':504 'references/release_notes_guidelines.md':105,336 'refresh':1014 'regist':544 'releas':11,43,266,771,952 'relev':427 'report':840 'research':996 'resolut':905 'respect':446,598 'retri':849 'review':673 'room':462 'rough':209 'rule':334,541 'run':795 'russian':549 'sa':715 'search':213,229,705,922 'season':505 'section':293,315 'semver':120,879 'sentenc':384,670 'shorten':664 'show':322,515,679 'sie':552 'sinc':157,172 'singl':376 'skill':247 'skill-asc-whats-new-writer' 'skip':421,637 'sleep':219,243,711 'source-rorkai' 'spanish':555 'specif':351,606,624 'specifi':98 'stale':1011 'start':102 'step':286,324,355,385,423,444,476,675,723,734,832 'store':10,921 'structur':108,250 'stuff':443 'submiss':512,939 'succeed':843 'summar':494 'summari':678 'syntax':742 'tabl':681 'tag':160,164,167,174,179 'text':23,33,52,222,255,481,492,651,700,808,815,929,970 'theme':498 'three':147 'timer':220,244 'tone':107,333,562,590 'topic-agent-skills' 'topic-ai-skills' 'topic-app-store-connect' 'topic-apple' 'topic-asc' 'topic-automation' 'topic-cicd' 'topic-cli' 'topic-devops' 'topic-ios' 'topic-macos' 'topic-testflight' 'total':450 'translat':532,540,581,629,644,660,985 'tree':886 'trigger':957 'truncat':667 'u':558 'unless':95 'updat':34,53,496,508,750,819,935,956,965,976 'upload':80,674,730,736,737,838 'us':94,704,766 'use':24,121,343,542,988,999 'user':73,97,202,207,223,261,310,338,484,520,732 'user-fac':201 'ust':556 'valid':642 'var':87 'verb':349 'verifi':740 'version':68,115,138,759,761,789,802,859,871,877 'version-id':758 'via':61,738 'visibl':369,943 'vous':554 'wait':524,725 'want':485 'weav':434 'week':981 'what':3,768 'whats-new':767 'whatsnew':874 'window':944 'without':509,731,936 'would':311 'write':326,412,780,822,923 'writer':5,39 'вы':550 'أسرع':718 'أصبح':717 'البحث':716 'جديد':721 'نوم':720","prices":[{"id":"3be5723c-5cba-4893-9c76-cd0a6b51f888","listingId":"88366bd6-cc38-40d1-9005-5c5e98a40956","amountUsd":"0","unit":"free","nativeCurrency":null,"nativeAmount":null,"chain":null,"payTo":null,"paymentMethod":"skill-free","isPrimary":true,"details":{"org":"rorkai","category":"app-store-connect-cli-skills","install_from":"skills.sh"},"createdAt":"2026-04-18T21:56:55.860Z"}],"sources":[{"listingId":"88366bd6-cc38-40d1-9005-5c5e98a40956","source":"github","sourceId":"rorkai/app-store-connect-cli-skills/asc-whats-new-writer","sourceUrl":"https://github.com/rorkai/app-store-connect-cli-skills/tree/main/skills/asc-whats-new-writer","isPrimary":false,"firstSeenAt":"2026-04-18T21:56:55.860Z","lastSeenAt":"2026-05-02T18:53:03.322Z"}],"details":{"listingId":"88366bd6-cc38-40d1-9005-5c5e98a40956","quickStartSnippet":null,"exampleRequest":null,"exampleResponse":null,"schema":null,"openapiUrl":null,"agentsTxtUrl":null,"citations":[],"useCases":[],"bestFor":[],"notFor":[],"kindDetails":{"org":"rorkai","slug":"asc-whats-new-writer","github":{"repo":"rorkai/app-store-connect-cli-skills","stars":776,"topics":["agent-skills","ai-skills","app-store-connect","apple","asc","automation","cicd","cli","devops","ios","macos","testflight","xcode"],"license":"mit","html_url":"https://github.com/rorkai/app-store-connect-cli-skills","pushed_at":"2026-04-24T08:59:37Z","description":"Skills to automate app store deployed and everything related to it using the asc cli","skill_md_sha":"fcc4c2d7ed8e4ff3698c84787cd84f58287b3477","skill_md_path":"skills/asc-whats-new-writer/SKILL.md","default_branch":"main","skill_tree_url":"https://github.com/rorkai/app-store-connect-cli-skills/tree/main/skills/asc-whats-new-writer"},"layout":"multi","source":"github","category":"app-store-connect-cli-skills","frontmatter":{"name":"asc-whats-new-writer","description":"Generate engaging, localized App Store release notes (What's New) from git log, bullet points, or free text using canonical metadata under `./metadata`. Optionally pairs with promotional text updates."},"skills_sh_url":"https://skills.sh/rorkai/app-store-connect-cli-skills/asc-whats-new-writer"},"updatedAt":"2026-05-02T18:53:03.322Z"}}