@olegkoval/agent-skills 1.28.0 → 1.30.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (98) hide show
  1. package/.claude-plugin/plugin.json +7 -2
  2. package/.cursor-plugin/index.json +26 -1
  3. package/.grok-plugin/index.json +26 -1
  4. package/.kiro/steering/garmin-watchface.md +83 -31
  5. package/.windsurf/rules/garmin-watchface.md +83 -31
  6. package/README.md +8 -3
  7. package/catalog/skills.json +117 -1
  8. package/collections/software-development.json +2 -1
  9. package/package.json +1 -1
  10. package/packages/software-development/branch-cleanup/SKILL.md +204 -0
  11. package/packages/software-development/branch-cleanup/adapters/claude/plugin.json +5 -0
  12. package/packages/software-development/branch-cleanup/adapters/claude/skills/branch-cleanup/SKILL.md +205 -0
  13. package/packages/software-development/branch-cleanup/adapters/codex/README.md +19 -0
  14. package/packages/software-development/branch-cleanup/adapters/cursor/plugin.json +6 -0
  15. package/packages/software-development/branch-cleanup/adapters/cursor/skills/branch-cleanup/SKILL.md +205 -0
  16. package/packages/software-development/branch-cleanup/adapters/grok/plugin.json +6 -0
  17. package/packages/software-development/branch-cleanup/adapters/grok/skills/branch-cleanup/SKILL.md +205 -0
  18. package/packages/software-development/morning-routine/SKILL.md +149 -0
  19. package/packages/software-development/morning-routine/adapters/claude/plugin.json +5 -0
  20. package/packages/software-development/morning-routine/adapters/claude/skills/morning-routine/SKILL.md +150 -0
  21. package/packages/software-development/morning-routine/adapters/codex/README.md +19 -0
  22. package/packages/software-development/morning-routine/adapters/cursor/plugin.json +6 -0
  23. package/packages/software-development/morning-routine/adapters/cursor/skills/morning-routine/SKILL.md +150 -0
  24. package/packages/software-development/morning-routine/adapters/grok/plugin.json +6 -0
  25. package/packages/software-development/morning-routine/adapters/grok/skills/morning-routine/SKILL.md +150 -0
  26. package/packages/software-development/pr-finalize-complete/adapters/claude/plugin.json +1 -1
  27. package/packages/software-development/pr-finalize-complete/adapters/codex/README.md +7 -11
  28. package/packages/software-development/pr-finalize-complete/adapters/cursor/plugin.json +1 -1
  29. package/packages/software-development/pr-finalize-complete/adapters/grok/plugin.json +1 -1
  30. package/packages/software-development/release-day/SKILL.md +286 -0
  31. package/packages/software-development/release-day/adapters/claude/plugin.json +5 -0
  32. package/packages/software-development/release-day/adapters/claude/skills/release-day/SKILL.md +287 -0
  33. package/packages/software-development/release-day/adapters/codex/README.md +19 -0
  34. package/packages/software-development/release-day/adapters/cursor/plugin.json +6 -0
  35. package/packages/software-development/release-day/adapters/cursor/skills/release-day/SKILL.md +287 -0
  36. package/packages/software-development/release-day/adapters/grok/plugin.json +6 -0
  37. package/packages/software-development/release-day/adapters/grok/skills/release-day/SKILL.md +287 -0
  38. package/packages/software-development/vinted-listing/SKILL.md +58 -0
  39. package/packages/software-development/vinted-listing/adapters/claude/plugin.json +5 -0
  40. package/packages/software-development/vinted-listing/adapters/claude/skills/vinted-listing/SKILL.md +59 -0
  41. package/packages/software-development/vinted-listing/adapters/claude/skills/vinted-listing/references/photo-and-duplicate-policy.md +20 -0
  42. package/packages/software-development/vinted-listing/adapters/codex/README.md +3 -0
  43. package/packages/software-development/vinted-listing/adapters/cursor/plugin.json +6 -0
  44. package/packages/software-development/vinted-listing/adapters/cursor/skills/vinted-listing/SKILL.md +59 -0
  45. package/packages/software-development/vinted-listing/adapters/cursor/skills/vinted-listing/references/photo-and-duplicate-policy.md +20 -0
  46. package/packages/software-development/vinted-listing/adapters/grok/plugin.json +6 -0
  47. package/packages/software-development/vinted-listing/adapters/grok/skills/vinted-listing/SKILL.md +59 -0
  48. package/packages/software-development/vinted-listing/adapters/grok/skills/vinted-listing/references/photo-and-duplicate-policy.md +20 -0
  49. package/packages/software-development/vinted-listing/references/photo-and-duplicate-policy.md +20 -0
  50. package/packages/wearables/garmin-watchface/SKILL.md +82 -35
  51. package/packages/wearables/garmin-watchface/adapters/claude/plugin.json +1 -1
  52. package/packages/wearables/garmin-watchface/adapters/claude/skills/garmin-watchface/SKILL.md +82 -35
  53. package/packages/wearables/garmin-watchface/adapters/claude/skills/garmin-watchface/references/design-proposals.md +99 -0
  54. package/packages/wearables/garmin-watchface/adapters/claude/skills/garmin-watchface/references/devices.md +112 -0
  55. package/packages/wearables/garmin-watchface/adapters/claude/skills/garmin-watchface/references/display.md +78 -3
  56. package/packages/wearables/garmin-watchface/adapters/claude/skills/garmin-watchface/references/inspiration-wizard.md +140 -0
  57. package/packages/wearables/garmin-watchface/adapters/claude/skills/garmin-watchface/references/layout.md +28 -0
  58. package/packages/wearables/garmin-watchface/adapters/claude/skills/garmin-watchface/references/publishing.md +134 -5
  59. package/packages/wearables/garmin-watchface/adapters/claude/skills/garmin-watchface/references/simulator.md +86 -2
  60. package/packages/wearables/garmin-watchface/adapters/claude/skills/garmin-watchface/scripts/ciq-inspire +329 -0
  61. package/packages/wearables/garmin-watchface/adapters/claude/skills/garmin-watchface/scripts/ciq-mock +502 -0
  62. package/packages/wearables/garmin-watchface/adapters/claude/skills/garmin-watchface/scripts/ciq-release +12 -6
  63. package/packages/wearables/garmin-watchface/adapters/cursor/plugin.json +1 -1
  64. package/packages/wearables/garmin-watchface/adapters/cursor/skills/garmin-watchface/SKILL.md +82 -35
  65. package/packages/wearables/garmin-watchface/adapters/cursor/skills/garmin-watchface/references/design-proposals.md +99 -0
  66. package/packages/wearables/garmin-watchface/adapters/cursor/skills/garmin-watchface/references/devices.md +112 -0
  67. package/packages/wearables/garmin-watchface/adapters/cursor/skills/garmin-watchface/references/display.md +78 -3
  68. package/packages/wearables/garmin-watchface/adapters/cursor/skills/garmin-watchface/references/inspiration-wizard.md +140 -0
  69. package/packages/wearables/garmin-watchface/adapters/cursor/skills/garmin-watchface/references/layout.md +28 -0
  70. package/packages/wearables/garmin-watchface/adapters/cursor/skills/garmin-watchface/references/publishing.md +134 -5
  71. package/packages/wearables/garmin-watchface/adapters/cursor/skills/garmin-watchface/references/simulator.md +86 -2
  72. package/packages/wearables/garmin-watchface/adapters/cursor/skills/garmin-watchface/scripts/ciq-inspire +329 -0
  73. package/packages/wearables/garmin-watchface/adapters/cursor/skills/garmin-watchface/scripts/ciq-mock +502 -0
  74. package/packages/wearables/garmin-watchface/adapters/cursor/skills/garmin-watchface/scripts/ciq-release +12 -6
  75. package/packages/wearables/garmin-watchface/adapters/grok/plugin.json +1 -1
  76. package/packages/wearables/garmin-watchface/adapters/grok/skills/garmin-watchface/SKILL.md +82 -35
  77. package/packages/wearables/garmin-watchface/adapters/grok/skills/garmin-watchface/references/design-proposals.md +99 -0
  78. package/packages/wearables/garmin-watchface/adapters/grok/skills/garmin-watchface/references/devices.md +112 -0
  79. package/packages/wearables/garmin-watchface/adapters/grok/skills/garmin-watchface/references/display.md +78 -3
  80. package/packages/wearables/garmin-watchface/adapters/grok/skills/garmin-watchface/references/inspiration-wizard.md +140 -0
  81. package/packages/wearables/garmin-watchface/adapters/grok/skills/garmin-watchface/references/layout.md +28 -0
  82. package/packages/wearables/garmin-watchface/adapters/grok/skills/garmin-watchface/references/publishing.md +134 -5
  83. package/packages/wearables/garmin-watchface/adapters/grok/skills/garmin-watchface/references/simulator.md +86 -2
  84. package/packages/wearables/garmin-watchface/adapters/grok/skills/garmin-watchface/scripts/ciq-inspire +329 -0
  85. package/packages/wearables/garmin-watchface/adapters/grok/skills/garmin-watchface/scripts/ciq-mock +502 -0
  86. package/packages/wearables/garmin-watchface/adapters/grok/skills/garmin-watchface/scripts/ciq-release +12 -6
  87. package/packages/wearables/garmin-watchface/adapters/kiro/steering/garmin-watchface.md +83 -31
  88. package/packages/wearables/garmin-watchface/adapters/windsurf/rules/garmin-watchface.md +83 -31
  89. package/packages/wearables/garmin-watchface/references/design-proposals.md +99 -0
  90. package/packages/wearables/garmin-watchface/references/devices.md +112 -0
  91. package/packages/wearables/garmin-watchface/references/display.md +78 -3
  92. package/packages/wearables/garmin-watchface/references/inspiration-wizard.md +140 -0
  93. package/packages/wearables/garmin-watchface/references/layout.md +28 -0
  94. package/packages/wearables/garmin-watchface/references/publishing.md +134 -5
  95. package/packages/wearables/garmin-watchface/references/simulator.md +86 -2
  96. package/packages/wearables/garmin-watchface/scripts/ciq-inspire +329 -0
  97. package/packages/wearables/garmin-watchface/scripts/ciq-mock +502 -0
  98. package/packages/wearables/garmin-watchface/scripts/ciq-release +12 -6
@@ -0,0 +1,286 @@
1
+ ---
2
+ name: release-day
3
+ description: >
4
+ Orchestrate a full release-day workflow for iOS, Android, or Garmin apps: verify the
5
+ main branch CI is green, generate a changelog from git history, draft platform-ready
6
+ store listing copy, trigger semantic-release (or tag manually), wait for the build,
7
+ and queue the App Store submission. Use when the user says "cut a release", "ship
8
+ version X", "it's release day", or "prepare the release".
9
+ license: MIT
10
+ allowed-tools: Bash, Read, Write, Edit, WebSearch
11
+ compatibility: Codex, Claude Code, Cursor, GitHub Copilot, Windsurf, Kiro, and other Agent Skills compatible tools. Requires git, gh, and the target platform's release toolchain (fastlane, Xcode CLI, Garmin SDK, or npm with semantic-release).
12
+ metadata:
13
+ targets: [_source-only]
14
+ author: Oleg Koval
15
+ tags:
16
+ - release
17
+ - ios
18
+ - android
19
+ - garmin
20
+ - app-store
21
+ - changelog
22
+ - store-listing
23
+ - semantic-release
24
+ - deployment
25
+ - automation
26
+ source: weekly-pattern-learner
27
+ source_reason: "changelog-generator, store-listing-copy, and apple-store-submit each reference each other in their Chaining tables but no skill chains them into a single end-to-end release-day workflow"
28
+ source_date: "2026-08-10"
29
+ ---
30
+
31
+ > 🤖 *Auto-generated by **weekly-pattern-learner** · changelog-generator, store-listing-copy, and apple-store-submit each reference each other in their Chaining tables but no skill chains them into a single end-to-end release-day workflow*
32
+
33
+ # Release Day
34
+
35
+ Drive a release from "code is ready" to "build submitted" in one orchestrated pass.
36
+ Each phase validates its output before proceeding — the skill stops and reports
37
+ rather than pushing a broken release.
38
+
39
+ ## Inputs
40
+
41
+ - **Platform** (required): `ios`, `android`, `garmin`, or `all`
42
+ - **Version** (optional): explicit version to release; if omitted, semantic-release
43
+ determines the next version automatically
44
+ - **Branch** (optional, default: `main`): branch to release from
45
+ - **--dry-run** (optional): run all checks and generate all copy without pushing
46
+ the tag or submitting to the store
47
+
48
+ ## Phase 1 — Verify the branch is ready
49
+
50
+ ```bash
51
+ BRANCH="${Branch:-main}"
52
+ git fetch origin "$BRANCH"
53
+ BRANCH_SHA=$(git rev-parse "origin/$BRANCH")
54
+
55
+ # Validate optional Version input
56
+ if [ -n "$Version" ]; then
57
+ if ! echo "$Version" | grep -qE '^v?[0-9]+\.[0-9]+\.[0-9]+(-[a-zA-Z0-9.]+)?$'; then
58
+ echo "Error: Version '$Version' is not a valid SemVer (e.g. 1.2.3 or v1.2.3)" >&2
59
+ exit 1
60
+ fi
61
+ fi
62
+
63
+ git status --short
64
+
65
+ # Last release tag
66
+ LAST_TAG=$(git describe --tags --abbrev=0 2>/dev/null || echo "none")
67
+
68
+ # Commits since last release
69
+ if [ "$LAST_TAG" = "none" ]; then
70
+ git log "origin/$BRANCH" --oneline --no-merges | head -20
71
+ else
72
+ git log "${LAST_TAG}..origin/$BRANCH" --oneline --no-merges | head -20
73
+ fi
74
+
75
+ # CI state on branch
76
+ gh run list --branch "$BRANCH" --limit 3 --json status,conclusion,workflowName \
77
+ --jq '.[] | "\(.workflowName): \(.conclusion // .status)"'
78
+ ```
79
+
80
+ **Stop if:**
81
+ - `git status --short` is non-empty — there are uncommitted changes
82
+ - The latest CI run on main is failing or still in progress
83
+ - There are zero commits since the last tag (nothing to release)
84
+
85
+ Report the problem clearly and stop — do not proceed to a release if the branch
86
+ is not clean and green.
87
+
88
+ ## Phase 2 — Generate changelog
89
+
90
+ Run `olko:changelog-generator`.
91
+
92
+ Use the range `${LAST_TAG}..origin/${BRANCH}` (or `origin/${BRANCH}` if no prior tag exists). Produce a
93
+ structured changelog with sections: New Features, Improvements, Bug Fixes, Breaking
94
+ Changes. Strip internal commits (refactor, test, ci, chore without behavior impact).
95
+
96
+ Write the changelog to:
97
+ ```bash
98
+ RELEASE_DIR="$(mktemp -d)/release-$(date +%Y-%m-%d)"
99
+ mkdir -p "$RELEASE_DIR"
100
+ # changelog-generator writes to CHANGELOG.md — validate before proceeding
101
+ if [ ! -s CHANGELOG.md ]; then
102
+ echo "Error: CHANGELOG.md is missing or empty — cannot continue." >&2
103
+ exit 1
104
+ fi
105
+ cp CHANGELOG.md "$RELEASE_DIR/changelog.md"
106
+ ```
107
+
108
+ Review the generated changelog for accuracy before continuing. If commits are
109
+ ambiguous (e.g. `fix: thing`), use `git show <sha>` to read the diff and
110
+ re-classify the entry.
111
+
112
+ ## Phase 3 — Draft store listing copy
113
+
114
+ Run `olko:store-listing-copy` with `--platform <platform>`.
115
+
116
+ This reads the changelog from Phase 2 and drafts:
117
+ - iOS: Title, Subtitle, What's New (4000 chars), Keywords (100 chars)
118
+ - Android: Title (30), Short Description (80), Release Notes (500)
119
+ - Garmin: Description, What's New (1500 chars)
120
+
121
+ The skill validates field lengths and known store-validator rules (e.g., no `<`/`>` in
122
+ Garmin copy) before delivering. Output goes to:
123
+ ```
124
+ store-copy-v<version>-<YYYY-MM-DD>.md
125
+ ```
126
+
127
+ **Do not proceed until store copy passes validation.** Fix any overflow or forbidden
128
+ character before tagging.
129
+
130
+ ## Phase 4 — Trigger the release
131
+
132
+ ### If semantic-release is configured
133
+
134
+ ```bash
135
+ # Dry-run first to confirm version and release notes
136
+ set -o pipefail
137
+ if ! npm run release:dry-run 2>&1 | tail -40; then
138
+ echo "Dry-run failed — aborting release." >&2
139
+ exit 1
140
+ fi
141
+
142
+ # On confirmation (or with --dry-run: stop here)
143
+ git push origin "$BRANCH" # trigger CI which runs semantic-release
144
+ ```
145
+
146
+ Wait for the GitHub Actions release workflow to complete:
147
+
148
+ ```bash
149
+ # Capture run ID for the push commit so we poll the right run
150
+ sleep 10
151
+ RUN_ID=$(gh run list --branch "$BRANCH" --workflow ci-release.yml --limit 1 \
152
+ --json databaseId,headSha \
153
+ --jq "[.[] | select(.headSha == \"$BRANCH_SHA\")] | .[0].databaseId")
154
+
155
+ # Poll until the targeted run is done (timeout: 15 min)
156
+ STATUS="pending"
157
+ for i in $(seq 1 30); do
158
+ STATUS=$(gh run view "$RUN_ID" --json conclusion \
159
+ --jq '.conclusion // "pending"' 2>/dev/null || echo "pending")
160
+ [ "$STATUS" = "success" ] && break
161
+ [ "$STATUS" = "failure" ] || [ "$STATUS" = "cancelled" ] || [ "$STATUS" = "timed_out" ] && \
162
+ echo "Release workflow ended with status: $STATUS" && exit 1
163
+ sleep 30
164
+ done
165
+ if [ "$STATUS" != "success" ]; then
166
+ echo "Release workflow timed out after 15 minutes." >&2
167
+ exit 1
168
+ fi
169
+ ```
170
+
171
+ ### If releasing manually (no semantic-release)
172
+
173
+ ```bash
174
+ # Determine next version (follow SemVer: breaking → major, new feature → minor, fix → patch)
175
+ NEXT_VERSION="vX.Y.Z" # fill in based on changelog analysis
176
+
177
+ # Tag and push
178
+ git tag -a "$NEXT_VERSION" -m "Release $NEXT_VERSION"
179
+ git push origin "$NEXT_VERSION"
180
+
181
+ # Create GitHub release
182
+ gh release create "$NEXT_VERSION" \
183
+ --title "$NEXT_VERSION" \
184
+ --notes-file "$RELEASE_DIR/changelog.md"
185
+ ```
186
+
187
+ ## Phase 5 — Confirm build artifact
188
+
189
+ Download and validate the platform-specific build artifact. Poll every 2 minutes
190
+ (timeout: 20 min) — do not proceed to Phase 6 until the artifact is confirmed present.
191
+
192
+ ```bash
193
+ ARTIFACT_FOUND=false
194
+ for i in $(seq 1 10); do
195
+ gh run download "$RUN_ID" --dir "$RELEASE_DIR" 2>/dev/null || true
196
+
197
+ case "$Platform" in
198
+ ios)
199
+ IPA=$(find "$RELEASE_DIR" -name "*.ipa" | head -1)
200
+ [ -n "$IPA" ] && ARTIFACT_FOUND=true && echo "iOS artifact: $IPA" && break
201
+ ;;
202
+ android)
203
+ APK=$(find "$RELEASE_DIR" \( -name "*.apk" -o -name "*.aab" \) | head -1)
204
+ [ -n "$APK" ] && ARTIFACT_FOUND=true && echo "Android artifact: $APK" && break
205
+ ;;
206
+ garmin)
207
+ PRG=$(find "$RELEASE_DIR" dist -name "*.prg" 2>/dev/null | head -1)
208
+ [ -n "$PRG" ] && ARTIFACT_FOUND=true && echo "Garmin artifact: $PRG" && break
209
+ ;;
210
+ all)
211
+ IPA=$(find "$RELEASE_DIR" -name "*.ipa" | head -1)
212
+ APK=$(find "$RELEASE_DIR" \( -name "*.apk" -o -name "*.aab" \) | head -1)
213
+ PRG=$(find "$RELEASE_DIR" dist -name "*.prg" 2>/dev/null | head -1)
214
+ [ -n "$IPA" ] && [ -n "$APK" ] && [ -n "$PRG" ] && ARTIFACT_FOUND=true && break
215
+ ;;
216
+ esac
217
+
218
+ echo "Attempt $i/10: artifact not yet available — waiting 2 minutes..."
219
+ sleep 120
220
+ done
221
+
222
+ if [ "$ARTIFACT_FOUND" != "true" ]; then
223
+ echo "Error: required build artifact not found after 20 minutes — aborting." >&2
224
+ exit 1
225
+ fi
226
+ ```
227
+
228
+ ## Phase 6 — Submit to the store
229
+
230
+ **Skip this phase with `--dry-run`** — stop after Phase 3 and print the store copy
231
+ for manual paste.
232
+
233
+ Run the platform-specific submission workflow with the artifact from Phase 5:
234
+
235
+ **iOS:** Run `olko:apple-store-submit` — handles `altool` / `xcrun notarytool`
236
+ submission, watches for Apple's processing email, and catches common rejection patterns.
237
+
238
+ **Android:** Upload the `.aab` (or `.apk`) to Google Play using `fastlane supply`:
239
+
240
+ ```bash
241
+ fastlane supply \
242
+ --aab "$APK" \
243
+ --track internal \
244
+ --package_name "$(cat android/app/build.gradle | grep applicationId | awk '{print $2}' | tr -d '"')"
245
+ ```
246
+
247
+ Promote from internal → production after QA sign-off.
248
+
249
+ **Garmin:** Run `olko:garmin-watchface` store publishing workflow — uploads the `.prg`
250
+ and the listing copy from Phase 3 via the Connect IQ developer portal.
251
+
252
+ **all:** Run iOS → Android → Garmin in sequence; report each result independently.
253
+
254
+ ## Final report
255
+
256
+ ```
257
+ Release day complete — YYYY-MM-DD
258
+
259
+ Version: vX.Y.Z (was vA.B.C)
260
+ Platform: ios / android / garmin / all
261
+ Changelog: N features, M fixes, K improvements
262
+ Store copy: validated ✓ (all fields within limits)
263
+ Release: tagged + GitHub Release created ✓
264
+ Build: CI green, artifact downloaded ✓
265
+ Submission: queued for App Store / Google Play / Connect IQ review
266
+
267
+ Next:
268
+ - Check Apple / Google / Garmin review status in 24–72h
269
+ - Monitor crash rates via Crashlytics / Firebase after rollout
270
+ - Run /review-past-performance at end of day to capture release learnings
271
+ ```
272
+
273
+ ## Safety guardrails
274
+
275
+ - Never push a tag or trigger a release if Phase 1 fails
276
+ - Never submit a store build without a validated Phase 3 output
277
+ - Always `--dry-run` first on a new repo or a new platform
278
+ - Keep the store copy file in $RELEASE_DIR until the submission is confirmed live
279
+
280
+ ## Chaining
281
+
282
+ | Before this skill | After this skill |
283
+ |---|---|
284
+ | `olko:pr-to-green` — merge the release PR | Monitor store review status |
285
+ | `olko:semantic-release-beta` — promote beta to stable | `olko:changelog-generator` for next iteration |
286
+ | Manual: "all features are in, ship it" | Post-release monitoring |
@@ -0,0 +1,5 @@
1
+ {
2
+ "name": "olko-release-day",
3
+ "description": "Orchestrate a full release-day workflow for iOS, Android, or Garmin apps: verify main branch CI is green, generate changelog, draft platform-ready store listing copy, trigger semantic-release or tag manually, wait for the build, and queue the App Store submission.",
4
+ "skills": "./skills"
5
+ }
@@ -0,0 +1,287 @@
1
+ ---
2
+ name: release-day
3
+ description: >
4
+ Orchestrate a full release-day workflow for iOS, Android, or Garmin apps: verify the
5
+ main branch CI is green, generate a changelog from git history, draft platform-ready
6
+ store listing copy, trigger semantic-release (or tag manually), wait for the build,
7
+ and queue the App Store submission. Use when the user says "cut a release", "ship
8
+ version X", "it's release day", or "prepare the release".
9
+ license: MIT
10
+ allowed-tools: Bash, Read, Write, Edit, WebSearch
11
+ compatibility: Codex, Claude Code, Cursor, GitHub Copilot, Windsurf, Kiro, and other Agent Skills compatible tools. Requires git, gh, and the target platform's release toolchain (fastlane, Xcode CLI, Garmin SDK, or npm with semantic-release).
12
+ metadata:
13
+ targets: [_source-only]
14
+ author: Oleg Koval
15
+ tags:
16
+ - release
17
+ - ios
18
+ - android
19
+ - garmin
20
+ - app-store
21
+ - changelog
22
+ - store-listing
23
+ - semantic-release
24
+ - deployment
25
+ - automation
26
+ source: weekly-pattern-learner
27
+ source_reason: "changelog-generator, store-listing-copy, and apple-store-submit each reference each other in their Chaining tables but no skill chains them into a single end-to-end release-day workflow"
28
+ source_date: "2026-08-10"
29
+ ---
30
+ <!-- Generated by scripts/build-adapters.sh. Do not edit directly. -->
31
+
32
+ > 🤖 *Auto-generated by **weekly-pattern-learner** · changelog-generator, store-listing-copy, and apple-store-submit each reference each other in their Chaining tables but no skill chains them into a single end-to-end release-day workflow*
33
+
34
+ # Release Day
35
+
36
+ Drive a release from "code is ready" to "build submitted" in one orchestrated pass.
37
+ Each phase validates its output before proceeding — the skill stops and reports
38
+ rather than pushing a broken release.
39
+
40
+ ## Inputs
41
+
42
+ - **Platform** (required): `ios`, `android`, `garmin`, or `all`
43
+ - **Version** (optional): explicit version to release; if omitted, semantic-release
44
+ determines the next version automatically
45
+ - **Branch** (optional, default: `main`): branch to release from
46
+ - **--dry-run** (optional): run all checks and generate all copy without pushing
47
+ the tag or submitting to the store
48
+
49
+ ## Phase 1 — Verify the branch is ready
50
+
51
+ ```bash
52
+ BRANCH="${Branch:-main}"
53
+ git fetch origin "$BRANCH"
54
+ BRANCH_SHA=$(git rev-parse "origin/$BRANCH")
55
+
56
+ # Validate optional Version input
57
+ if [ -n "$Version" ]; then
58
+ if ! echo "$Version" | grep -qE '^v?[0-9]+\.[0-9]+\.[0-9]+(-[a-zA-Z0-9.]+)?$'; then
59
+ echo "Error: Version '$Version' is not a valid SemVer (e.g. 1.2.3 or v1.2.3)" >&2
60
+ exit 1
61
+ fi
62
+ fi
63
+
64
+ git status --short
65
+
66
+ # Last release tag
67
+ LAST_TAG=$(git describe --tags --abbrev=0 2>/dev/null || echo "none")
68
+
69
+ # Commits since last release
70
+ if [ "$LAST_TAG" = "none" ]; then
71
+ git log "origin/$BRANCH" --oneline --no-merges | head -20
72
+ else
73
+ git log "${LAST_TAG}..origin/$BRANCH" --oneline --no-merges | head -20
74
+ fi
75
+
76
+ # CI state on branch
77
+ gh run list --branch "$BRANCH" --limit 3 --json status,conclusion,workflowName \
78
+ --jq '.[] | "\(.workflowName): \(.conclusion // .status)"'
79
+ ```
80
+
81
+ **Stop if:**
82
+ - `git status --short` is non-empty — there are uncommitted changes
83
+ - The latest CI run on main is failing or still in progress
84
+ - There are zero commits since the last tag (nothing to release)
85
+
86
+ Report the problem clearly and stop — do not proceed to a release if the branch
87
+ is not clean and green.
88
+
89
+ ## Phase 2 — Generate changelog
90
+
91
+ Run `olko:changelog-generator`.
92
+
93
+ Use the range `${LAST_TAG}..origin/${BRANCH}` (or `origin/${BRANCH}` if no prior tag exists). Produce a
94
+ structured changelog with sections: New Features, Improvements, Bug Fixes, Breaking
95
+ Changes. Strip internal commits (refactor, test, ci, chore without behavior impact).
96
+
97
+ Write the changelog to:
98
+ ```bash
99
+ RELEASE_DIR="$(mktemp -d)/release-$(date +%Y-%m-%d)"
100
+ mkdir -p "$RELEASE_DIR"
101
+ # changelog-generator writes to CHANGELOG.md — validate before proceeding
102
+ if [ ! -s CHANGELOG.md ]; then
103
+ echo "Error: CHANGELOG.md is missing or empty — cannot continue." >&2
104
+ exit 1
105
+ fi
106
+ cp CHANGELOG.md "$RELEASE_DIR/changelog.md"
107
+ ```
108
+
109
+ Review the generated changelog for accuracy before continuing. If commits are
110
+ ambiguous (e.g. `fix: thing`), use `git show <sha>` to read the diff and
111
+ re-classify the entry.
112
+
113
+ ## Phase 3 — Draft store listing copy
114
+
115
+ Run `olko:store-listing-copy` with `--platform <platform>`.
116
+
117
+ This reads the changelog from Phase 2 and drafts:
118
+ - iOS: Title, Subtitle, What's New (4000 chars), Keywords (100 chars)
119
+ - Android: Title (30), Short Description (80), Release Notes (500)
120
+ - Garmin: Description, What's New (1500 chars)
121
+
122
+ The skill validates field lengths and known store-validator rules (e.g., no `<`/`>` in
123
+ Garmin copy) before delivering. Output goes to:
124
+ ```
125
+ store-copy-v<version>-<YYYY-MM-DD>.md
126
+ ```
127
+
128
+ **Do not proceed until store copy passes validation.** Fix any overflow or forbidden
129
+ character before tagging.
130
+
131
+ ## Phase 4 — Trigger the release
132
+
133
+ ### If semantic-release is configured
134
+
135
+ ```bash
136
+ # Dry-run first to confirm version and release notes
137
+ set -o pipefail
138
+ if ! npm run release:dry-run 2>&1 | tail -40; then
139
+ echo "Dry-run failed — aborting release." >&2
140
+ exit 1
141
+ fi
142
+
143
+ # On confirmation (or with --dry-run: stop here)
144
+ git push origin "$BRANCH" # trigger CI which runs semantic-release
145
+ ```
146
+
147
+ Wait for the GitHub Actions release workflow to complete:
148
+
149
+ ```bash
150
+ # Capture run ID for the push commit so we poll the right run
151
+ sleep 10
152
+ RUN_ID=$(gh run list --branch "$BRANCH" --workflow ci-release.yml --limit 1 \
153
+ --json databaseId,headSha \
154
+ --jq "[.[] | select(.headSha == \"$BRANCH_SHA\")] | .[0].databaseId")
155
+
156
+ # Poll until the targeted run is done (timeout: 15 min)
157
+ STATUS="pending"
158
+ for i in $(seq 1 30); do
159
+ STATUS=$(gh run view "$RUN_ID" --json conclusion \
160
+ --jq '.conclusion // "pending"' 2>/dev/null || echo "pending")
161
+ [ "$STATUS" = "success" ] && break
162
+ [ "$STATUS" = "failure" ] || [ "$STATUS" = "cancelled" ] || [ "$STATUS" = "timed_out" ] && \
163
+ echo "Release workflow ended with status: $STATUS" && exit 1
164
+ sleep 30
165
+ done
166
+ if [ "$STATUS" != "success" ]; then
167
+ echo "Release workflow timed out after 15 minutes." >&2
168
+ exit 1
169
+ fi
170
+ ```
171
+
172
+ ### If releasing manually (no semantic-release)
173
+
174
+ ```bash
175
+ # Determine next version (follow SemVer: breaking → major, new feature → minor, fix → patch)
176
+ NEXT_VERSION="vX.Y.Z" # fill in based on changelog analysis
177
+
178
+ # Tag and push
179
+ git tag -a "$NEXT_VERSION" -m "Release $NEXT_VERSION"
180
+ git push origin "$NEXT_VERSION"
181
+
182
+ # Create GitHub release
183
+ gh release create "$NEXT_VERSION" \
184
+ --title "$NEXT_VERSION" \
185
+ --notes-file "$RELEASE_DIR/changelog.md"
186
+ ```
187
+
188
+ ## Phase 5 — Confirm build artifact
189
+
190
+ Download and validate the platform-specific build artifact. Poll every 2 minutes
191
+ (timeout: 20 min) — do not proceed to Phase 6 until the artifact is confirmed present.
192
+
193
+ ```bash
194
+ ARTIFACT_FOUND=false
195
+ for i in $(seq 1 10); do
196
+ gh run download "$RUN_ID" --dir "$RELEASE_DIR" 2>/dev/null || true
197
+
198
+ case "$Platform" in
199
+ ios)
200
+ IPA=$(find "$RELEASE_DIR" -name "*.ipa" | head -1)
201
+ [ -n "$IPA" ] && ARTIFACT_FOUND=true && echo "iOS artifact: $IPA" && break
202
+ ;;
203
+ android)
204
+ APK=$(find "$RELEASE_DIR" \( -name "*.apk" -o -name "*.aab" \) | head -1)
205
+ [ -n "$APK" ] && ARTIFACT_FOUND=true && echo "Android artifact: $APK" && break
206
+ ;;
207
+ garmin)
208
+ PRG=$(find "$RELEASE_DIR" dist -name "*.prg" 2>/dev/null | head -1)
209
+ [ -n "$PRG" ] && ARTIFACT_FOUND=true && echo "Garmin artifact: $PRG" && break
210
+ ;;
211
+ all)
212
+ IPA=$(find "$RELEASE_DIR" -name "*.ipa" | head -1)
213
+ APK=$(find "$RELEASE_DIR" \( -name "*.apk" -o -name "*.aab" \) | head -1)
214
+ PRG=$(find "$RELEASE_DIR" dist -name "*.prg" 2>/dev/null | head -1)
215
+ [ -n "$IPA" ] && [ -n "$APK" ] && [ -n "$PRG" ] && ARTIFACT_FOUND=true && break
216
+ ;;
217
+ esac
218
+
219
+ echo "Attempt $i/10: artifact not yet available — waiting 2 minutes..."
220
+ sleep 120
221
+ done
222
+
223
+ if [ "$ARTIFACT_FOUND" != "true" ]; then
224
+ echo "Error: required build artifact not found after 20 minutes — aborting." >&2
225
+ exit 1
226
+ fi
227
+ ```
228
+
229
+ ## Phase 6 — Submit to the store
230
+
231
+ **Skip this phase with `--dry-run`** — stop after Phase 3 and print the store copy
232
+ for manual paste.
233
+
234
+ Run the platform-specific submission workflow with the artifact from Phase 5:
235
+
236
+ **iOS:** Run `olko:apple-store-submit` — handles `altool` / `xcrun notarytool`
237
+ submission, watches for Apple's processing email, and catches common rejection patterns.
238
+
239
+ **Android:** Upload the `.aab` (or `.apk`) to Google Play using `fastlane supply`:
240
+
241
+ ```bash
242
+ fastlane supply \
243
+ --aab "$APK" \
244
+ --track internal \
245
+ --package_name "$(cat android/app/build.gradle | grep applicationId | awk '{print $2}' | tr -d '"')"
246
+ ```
247
+
248
+ Promote from internal → production after QA sign-off.
249
+
250
+ **Garmin:** Run `olko:garmin-watchface` store publishing workflow — uploads the `.prg`
251
+ and the listing copy from Phase 3 via the Connect IQ developer portal.
252
+
253
+ **all:** Run iOS → Android → Garmin in sequence; report each result independently.
254
+
255
+ ## Final report
256
+
257
+ ```
258
+ Release day complete — YYYY-MM-DD
259
+
260
+ Version: vX.Y.Z (was vA.B.C)
261
+ Platform: ios / android / garmin / all
262
+ Changelog: N features, M fixes, K improvements
263
+ Store copy: validated ✓ (all fields within limits)
264
+ Release: tagged + GitHub Release created ✓
265
+ Build: CI green, artifact downloaded ✓
266
+ Submission: queued for App Store / Google Play / Connect IQ review
267
+
268
+ Next:
269
+ - Check Apple / Google / Garmin review status in 24–72h
270
+ - Monitor crash rates via Crashlytics / Firebase after rollout
271
+ - Run /review-past-performance at end of day to capture release learnings
272
+ ```
273
+
274
+ ## Safety guardrails
275
+
276
+ - Never push a tag or trigger a release if Phase 1 fails
277
+ - Never submit a store build without a validated Phase 3 output
278
+ - Always `--dry-run` first on a new repo or a new platform
279
+ - Keep the store copy file in $RELEASE_DIR until the submission is confirmed live
280
+
281
+ ## Chaining
282
+
283
+ | Before this skill | After this skill |
284
+ |---|---|
285
+ | `olko:pr-to-green` — merge the release PR | Monitor store review status |
286
+ | `olko:semantic-release-beta` — promote beta to stable | `olko:changelog-generator` for next iteration |
287
+ | Manual: "all features are in, ship it" | Post-release monitoring |
@@ -0,0 +1,19 @@
1
+ # Codex Adapter for release-day
2
+
3
+ This is a Codex-specific adapter for the `olko:release-day` skill.
4
+ The canonical skill definition is in `../../SKILL.md`.
5
+
6
+ ## Usage
7
+
8
+ Invoke in a Codex session:
9
+
10
+ ```text
11
+ Use the olko:release-day skill to cut the iOS release for version 2.5.0.
12
+ ```
13
+
14
+ ## Workflow
15
+
16
+ See `../../SKILL.md` for the full workflow: verify the main branch CI is green, generate
17
+ a changelog from git history, draft platform-ready store listing copy, trigger
18
+ semantic-release or tag manually, wait for the build artifact, and queue the App Store
19
+ submission. Supports iOS, Android, and Garmin. The procedure is agent-agnostic.
@@ -0,0 +1,6 @@
1
+ {
2
+ "name": "olko:release-day",
3
+ "version": "0.1.0",
4
+ "description": "Orchestrate a full release-day workflow for iOS, Android, or Garmin apps: verify main branch CI is green, generate changelog, draft platform-ready store listing copy, trigger semantic-release or tag manually, wait for the build, and queue the App Store submission.",
5
+ "skills": "skills/"
6
+ }