@olegkoval/agent-skills 1.17.0 โ 1.18.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.
- package/.claude-plugin/marketplace.json +2 -2
- package/.claude-plugin/plugin.json +2 -2
- package/.grok-plugin/index.json +120 -0
- package/README.md +26 -3
- package/catalog/skills.json +46 -23
- package/package.json +3 -2
- package/packages/marketing/search-console-indexing-audit/adapters/grok/plugin.json +6 -0
- package/packages/marketing/search-console-indexing-audit/adapters/grok/skills/search-console-indexing-audit/SKILL.md +69 -0
- package/packages/marketing/search-console-indexing-audit/adapters/grok/skills/search-console-indexing-audit/scripts/summarize_gsc_coverage.py +151 -0
- package/packages/marketing/viral-launch/adapters/grok/plugin.json +6 -0
- package/packages/marketing/viral-launch/adapters/grok/skills/viral-launch/SKILL.md +105 -0
- package/packages/music/fill-music-player/adapters/grok/plugin.json +6 -0
- package/packages/music/fill-music-player/adapters/grok/skills/fill-music-player/SKILL.md +111 -0
- package/packages/photography/gallery/adapters/grok/plugin.json +6 -0
- package/packages/photography/gallery/adapters/grok/skills/gallery/SKILL.md +237 -0
- package/packages/software-development/apple-store-submit/adapters/grok/plugin.json +6 -0
- package/packages/software-development/apple-store-submit/adapters/grok/skills/apple-store-submit/SKILL.md +158 -0
- package/packages/software-development/cloudflare-block-countries/adapters/grok/plugin.json +6 -0
- package/packages/software-development/cloudflare-block-countries/adapters/grok/skills/cloudflare-block-countries/SKILL.md +177 -0
- package/packages/software-development/crash-course/adapters/grok/plugin.json +6 -0
- package/packages/software-development/crash-course/adapters/grok/skills/crash-course/SKILL.md +271 -0
- package/packages/software-development/docs-index-keeper/adapters/grok/plugin.json +6 -0
- package/packages/software-development/docs-index-keeper/adapters/grok/skills/docs-index-keeper/SKILL.md +65 -0
- package/packages/software-development/gh-cli/adapters/grok/plugin.json +6 -0
- package/packages/software-development/gh-cli/adapters/grok/skills/gh-cli/SKILL.md +2200 -0
- package/packages/software-development/git-commit/adapters/grok/plugin.json +6 -0
- package/packages/software-development/git-commit/adapters/grok/skills/git-commit/SKILL.md +133 -0
- package/packages/software-development/macos-menubar-app/adapters/grok/plugin.json +6 -0
- package/packages/software-development/macos-menubar-app/adapters/grok/skills/macos-menubar-app/SKILL.md +238 -0
- package/packages/software-development/mvp-oneshot/adapters/grok/plugin.json +6 -0
- package/packages/software-development/mvp-oneshot/adapters/grok/skills/mvp-oneshot/SKILL.md +176 -0
- package/packages/software-development/obsidian-pr-sync/adapters/grok/plugin.json +6 -0
- package/packages/software-development/obsidian-pr-sync/adapters/grok/skills/obsidian-pr-sync/SKILL.md +154 -0
- package/packages/software-development/obsidian-task-rollover/adapters/grok/plugin.json +6 -0
- package/packages/software-development/obsidian-task-rollover/adapters/grok/skills/obsidian-task-rollover/SKILL.md +198 -0
- package/packages/software-development/open-source-publisher/adapters/grok/plugin.json +6 -0
- package/packages/software-development/open-source-publisher/adapters/grok/skills/open-source-publisher/SKILL.md +471 -0
- package/packages/software-development/product-builder/adapters/grok/plugin.json +6 -0
- package/packages/software-development/product-builder/adapters/grok/skills/product-builder/SKILL.md +224 -0
- package/packages/software-development/promptctl/adapters/grok/plugin.json +6 -0
- package/packages/software-development/promptctl/adapters/grok/skills/promptctl/SKILL.md +90 -0
- package/packages/software-development/relay/adapters/grok/plugin.json +6 -0
- package/packages/software-development/relay/adapters/grok/skills/relay/SKILL.md +117 -0
- package/packages/software-development/review-past-performance/adapters/grok/plugin.json +6 -0
- package/packages/software-development/review-past-performance/adapters/grok/skills/review-past-performance/SKILL.md +212 -0
- package/packages/software-development/self-critique/adapters/grok/plugin.json +6 -0
- package/packages/software-development/self-critique/adapters/grok/skills/self-critique/SKILL.md +149 -0
- package/packages/software-development/self-critique/adapters/grok/skills/self-critique/scripts/critique-nudge.mjs +57 -0
- package/packages/software-development/semantic-release-beta/adapters/grok/plugin.json +6 -0
- package/packages/software-development/semantic-release-beta/adapters/grok/skills/semantic-release-beta/SKILL.md +59 -0
- package/packages/software-development/skill-budget-audit/adapters/grok/plugin.json +6 -0
- package/packages/software-development/skill-budget-audit/adapters/grok/skills/skill-budget-audit/SKILL.md +146 -0
- package/packages/software-development/starter-rules/adapters/grok/plugin.json +6 -0
- package/packages/software-development/starter-rules/adapters/grok/skills/starter-rules/SKILL.md +73 -0
- package/scripts/build-adapters.sh +47 -4
- package/scripts/validate-catalog.sh +10 -0
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
---
|
|
2
|
+
|
|
3
|
+
name: viral-launch
|
|
4
|
+
description: Set up a project repository and launch plan for shareable marketing, public launch readiness, and growth loops without pretending virality is guaranteed.
|
|
5
|
+
license: MIT
|
|
6
|
+
allowed-tools: Bash, Read, Write, WebSearch, WebFetch
|
|
7
|
+
compatibility: Codex, Claude Code, Cursor, GitHub Copilot, Windsurf, Kiro, and other Agent Skills compatible tools. Useful for product repos, open-source packages, SaaS launches, waitlists, and creator tools.
|
|
8
|
+
metadata:
|
|
9
|
+
targets: [_source-only]
|
|
10
|
+
author: Oleg Koval
|
|
11
|
+
tags:
|
|
12
|
+
- marketing
|
|
13
|
+
- launch
|
|
14
|
+
- growth
|
|
15
|
+
- virality
|
|
16
|
+
- positioning
|
|
17
|
+
- github
|
|
18
|
+
|
|
19
|
+
---
|
|
20
|
+
<!-- Generated by scripts/build-adapters.sh. Do not edit directly. -->
|
|
21
|
+
|
|
22
|
+
# viral-launch
|
|
23
|
+
|
|
24
|
+
Use this skill when a user wants to launch a project, make a repo marketable, improve discoverability, or build shareable launch assets.
|
|
25
|
+
|
|
26
|
+
This skill is opinionated: virality is not a promise. The goal is to make the project easy to understand, easy to share, and easy to act on.
|
|
27
|
+
|
|
28
|
+
## Trigger phrases
|
|
29
|
+
|
|
30
|
+
- make this repo launch-ready
|
|
31
|
+
- set this up to go viral
|
|
32
|
+
- prepare a product launch
|
|
33
|
+
- create marketing assets for this project
|
|
34
|
+
- improve the README for launch
|
|
35
|
+
- prepare Product Hunt / Hacker News / X / LinkedIn launch copy
|
|
36
|
+
- set up an open-source repo for growth
|
|
37
|
+
|
|
38
|
+
## Workflow
|
|
39
|
+
|
|
40
|
+
1. Inspect the project first:
|
|
41
|
+
- product purpose
|
|
42
|
+
- target user
|
|
43
|
+
- core use case
|
|
44
|
+
- current README and docs
|
|
45
|
+
- install or demo path
|
|
46
|
+
- screenshots, videos, or visual proof
|
|
47
|
+
- analytics or waitlist capture if present
|
|
48
|
+
2. Define the launch angle in one sentence:
|
|
49
|
+
- who it is for
|
|
50
|
+
- what painful job it solves
|
|
51
|
+
- why now
|
|
52
|
+
- what makes it different
|
|
53
|
+
3. Make the repo launch-ready:
|
|
54
|
+
- clear README headline and first paragraph
|
|
55
|
+
- demo or quickstart within the first screen
|
|
56
|
+
- installation steps that work from a clean checkout
|
|
57
|
+
- screenshots, GIF, or demo link where possible
|
|
58
|
+
- feature list based on outcomes, not implementation trivia
|
|
59
|
+
- examples for the highest-intent use cases
|
|
60
|
+
- badges only when they add trust
|
|
61
|
+
- license, contributing notes, and issue templates when useful
|
|
62
|
+
4. Create launch assets:
|
|
63
|
+
- short tagline
|
|
64
|
+
- 1-paragraph announcement
|
|
65
|
+
- 5 social post variants
|
|
66
|
+
- Product Hunt tagline and description when relevant
|
|
67
|
+
- Hacker News title candidates when relevant
|
|
68
|
+
- launch email or DM when relevant
|
|
69
|
+
- creator/influencer outreach list criteria, not spam copy
|
|
70
|
+
5. Design share loops:
|
|
71
|
+
- a reason users would show the output to someone else
|
|
72
|
+
- a public artifact worth linking
|
|
73
|
+
- a before/after demo
|
|
74
|
+
- a template, benchmark, checklist, or gallery that can travel
|
|
75
|
+
- referral or waitlist loop only if it fits the product
|
|
76
|
+
6. Define proof and metrics:
|
|
77
|
+
- activation event
|
|
78
|
+
- share event
|
|
79
|
+
- conversion event
|
|
80
|
+
- retention proxy
|
|
81
|
+
- launch-day dashboard or simple tracking checklist
|
|
82
|
+
7. Keep claims grounded:
|
|
83
|
+
- do not invent traction, logos, benchmarks, testimonials, or user counts
|
|
84
|
+
- mark assumptions explicitly
|
|
85
|
+
- prefer specific proof over hype
|
|
86
|
+
- avoid dark patterns and spam
|
|
87
|
+
|
|
88
|
+
## Output format
|
|
89
|
+
|
|
90
|
+
When planning, produce:
|
|
91
|
+
|
|
92
|
+
- Launch angle
|
|
93
|
+
- Repo changes
|
|
94
|
+
- Launch assets
|
|
95
|
+
- Share loops
|
|
96
|
+
- Metrics
|
|
97
|
+
- Risks and assumptions
|
|
98
|
+
- Next actions
|
|
99
|
+
|
|
100
|
+
When editing a repository, make the smallest useful set of changes first, then validate by reading the README from a new user's perspective.
|
|
101
|
+
|
|
102
|
+
## References
|
|
103
|
+
|
|
104
|
+
- `references/launch-checklist.md`
|
|
105
|
+
- `references/external-skills.md`
|
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: fill-music-player
|
|
3
|
+
description: Use when a user wants to fill a portable music player (Walkman, iPod, USB drive) with a curated random selection from a music library on a NAS or local directory. Handles format filtering, artist/album diversity balancing, and size targeting.
|
|
4
|
+
license: MIT
|
|
5
|
+
allowed-tools: Bash
|
|
6
|
+
compatibility: Codex, Claude Code, Cursor, GitHub Copilot, Windsurf, Kiro, and other Agent Skills compatible tools. Requires shell access and the fill-music-player CLI or underlying script in the target environment.
|
|
7
|
+
metadata:
|
|
8
|
+
targets: [_source-only]
|
|
9
|
+
author: Oleg Koval
|
|
10
|
+
tags:
|
|
11
|
+
- music
|
|
12
|
+
- media
|
|
13
|
+
- curation
|
|
14
|
+
- copy
|
|
15
|
+
- cli
|
|
16
|
+
---
|
|
17
|
+
<!-- Generated by scripts/build-adapters.sh. Do not edit directly. -->
|
|
18
|
+
|
|
19
|
+
# fill-music-player
|
|
20
|
+
|
|
21
|
+
Curates a DJ-balanced selection of tracks from a source music library and copies them to a portable player, respecting device capacity and supported formats.
|
|
22
|
+
|
|
23
|
+
## Quick Reference
|
|
24
|
+
|
|
25
|
+
```bash
|
|
26
|
+
# Dry run first (always recommend this)
|
|
27
|
+
fill-music-player --source /Volumes/music --dest /Volumes/WALKMAN/MUSIC --dry-run
|
|
28
|
+
|
|
29
|
+
# Copy for real
|
|
30
|
+
fill-music-player --source /Volumes/music --dest /Volumes/WALKMAN/MUSIC
|
|
31
|
+
|
|
32
|
+
# Or run the script directly with uv
|
|
33
|
+
uv run fill_music_player.py --source ~/Music --dest /Volumes/USB --dry-run
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
Run `fill-music-player --help` for all options.
|
|
37
|
+
|
|
38
|
+
## Key Parameters
|
|
39
|
+
|
|
40
|
+
| Flag | Default | Purpose |
|
|
41
|
+
|------|---------|---------|
|
|
42
|
+
| `--source` / `-s` | required | Source music root (NAS mount, ~/Music, etc.) |
|
|
43
|
+
| `--dest` / `-d` | required | Player destination directory |
|
|
44
|
+
| `--target-gb` | 95% of free space | How many GB to fill |
|
|
45
|
+
| `--formats` | mp3,m4a,wma,aac | Allowed extensions |
|
|
46
|
+
| `--max-per-artist` | 4 | Artist diversity cap |
|
|
47
|
+
| `--max-per-album` | 3 | Album diversity cap |
|
|
48
|
+
| `--skip-dirs` | (none) | Top-level dirs to skip |
|
|
49
|
+
| `--dry-run` | false | Preview without copying |
|
|
50
|
+
|
|
51
|
+
## Workflow
|
|
52
|
+
|
|
53
|
+
1. Always do `--dry-run` first
|
|
54
|
+
2. Review the per-genre breakdown
|
|
55
|
+
3. Adjust `--skip-dirs`, `--max-file-mb`, or `--max-per-artist` if needed
|
|
56
|
+
4. Run without `--dry-run` to copy
|
|
57
|
+
|
|
58
|
+
## Device Formats
|
|
59
|
+
|
|
60
|
+
| Device | Recommended `--formats` |
|
|
61
|
+
|--------|------------------------|
|
|
62
|
+
| Sony Walkman NWZ series | `mp3,m4a,wma` |
|
|
63
|
+
| iPod (classic/nano) | `mp3,m4a,aac` |
|
|
64
|
+
| Generic USB player | `mp3` |
|
|
65
|
+
| Any modern player | `mp3,m4a,wma,aac,ogg,flac` |
|
|
66
|
+
|
|
67
|
+
## Edge Cases and Troubleshooting
|
|
68
|
+
|
|
69
|
+
| Situation | What happens | Fix |
|
|
70
|
+
|-----------|-------------|-----|
|
|
71
|
+
| NAS disconnects mid-copy | Copy fails for that file, logged as error, continues with next track | Re-run; already-copied files are skipped (`if not dst.exists()`) |
|
|
72
|
+
| Source has only FLAC/lossless | 0 files selected (FLAC not in default formats) | Use `--formats flac` or `--formats mp3,flac` |
|
|
73
|
+
| FAT32 filename too long or illegal chars | Filenames are sanitized: `<>:"/\|?*` replaced with `_`, truncated to 80 chars | Automatic โ no action needed |
|
|
74
|
+
| Mixed/broken ID3 tags | Falls back to folder name parsing (`Genre/Artist - Album/track.mp3`) | Works transparently; folder structure is the reliable fallback |
|
|
75
|
+
| Very large files (DJ mixes, radio shows) | Skipped by default (>20 MB) | Adjust with `--max-file-mb 50` to include mixes |
|
|
76
|
+
| Tiny files (jingles, corrupt) | Skipped by default (<300 KB) | Adjust with `--min-file-kb 100` to be more permissive |
|
|
77
|
+
| One artist dominates the library | Capped at 4 tracks per artist, 3 per album | Lower with `--max-per-artist 2` for more variety |
|
|
78
|
+
| Empty genre directories | Silently skipped, no error | Normal behavior |
|
|
79
|
+
| Destination already has files | Existing files are not overwritten or deleted; new tracks added alongside | Clear destination first if you want a fresh set |
|
|
80
|
+
| SMB/NFS mount is slow | Scanning with mutagen tag reading can take 5-10 min for large libraries | Expected; the dry-run output appears once scanning completes |
|
|
81
|
+
|
|
82
|
+
## Real-World Example
|
|
83
|
+
|
|
84
|
+
Filling a **Sony Walkman NWZ-B183F (4 GB)** from a **Synology DS918+ NAS** with ~9,000 tracks across blues, funk, hip-hop, soul, IDM, dubstep, dub, indie, and post-rock:
|
|
85
|
+
|
|
86
|
+
```bash
|
|
87
|
+
# Step 1: Preview
|
|
88
|
+
fill-music-player \
|
|
89
|
+
--source /Volumes/music \
|
|
90
|
+
--dest /Volumes/WALKMAN/MUSIC \
|
|
91
|
+
--skip-dirs "jingles,!recordings,!restored,dubrecords" \
|
|
92
|
+
--formats mp3,m4a,wma \
|
|
93
|
+
--dry-run
|
|
94
|
+
|
|
95
|
+
# Output:
|
|
96
|
+
# Found 8914 candidate tracks across 14 genres
|
|
97
|
+
# Funk โ 86 tracks (440.8 MB)
|
|
98
|
+
# blues โ 38 tracks (316.7 MB)
|
|
99
|
+
# hiphop โ 33 tracks (234.7 MB)
|
|
100
|
+
# ...
|
|
101
|
+
# Selected 348 tracks (2473.0 MB)
|
|
102
|
+
|
|
103
|
+
# Step 2: Copy
|
|
104
|
+
fill-music-player \
|
|
105
|
+
--source /Volumes/music \
|
|
106
|
+
--dest /Volumes/WALKMAN/MUSIC \
|
|
107
|
+
--skip-dirs "jingles,!recordings,!restored,dubrecords" \
|
|
108
|
+
--formats mp3,m4a,wma
|
|
109
|
+
```
|
|
110
|
+
|
|
111
|
+
Result: 348 tracks, 2.4 GB, balanced across 14 genres with max 4 tracks per artist. Artists included Fela Kuti, ZZ Top, Mobb Deep, Gregory Porter, Tinariwen, Chick Corea, Hudson Mohawke, and Funkadelic. Total copy time over SMB: ~12 minutes.
|
|
@@ -0,0 +1,237 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: gallery
|
|
3
|
+
description: Create photo galleries with AI-assisted layout curation. Orchestrates atomic scripts and sub-agents. Use when user wants to create a gallery from photos, mentions "/gallery", or asks about photo layout and sequencing.
|
|
4
|
+
license: MIT
|
|
5
|
+
allowed-tools: Bash, Read, Write, WebSearch, WebFetch
|
|
6
|
+
compatibility: Codex, Claude Code, Cursor, GitHub Copilot, Windsurf, Kiro, and other Agent Skills compatible tools. Requires a project that contains the gallery scripts and expected data layout.
|
|
7
|
+
metadata:
|
|
8
|
+
targets: [_source-only]
|
|
9
|
+
author: Oleg Koval
|
|
10
|
+
tags:
|
|
11
|
+
- photos
|
|
12
|
+
- gallery
|
|
13
|
+
- layout
|
|
14
|
+
- curation
|
|
15
|
+
---
|
|
16
|
+
<!-- Generated by scripts/build-adapters.sh. Do not edit directly. -->
|
|
17
|
+
|
|
18
|
+
# Gallery Workflow
|
|
19
|
+
|
|
20
|
+
Composed skill that creates photo galleries by orchestrating atomic scripts and sub-agents.
|
|
21
|
+
|
|
22
|
+
## Philosophy
|
|
23
|
+
|
|
24
|
+
This skill applies principles from masters of photo sequencing and curation:
|
|
25
|
+
|
|
26
|
+
- **Keith Smith** โ Group/Series/Sequence taxonomy; the gallery as a unified experience
|
|
27
|
+
- **Jรถrg Colberg** โ Ruthless editing; visual rhythm; pacing
|
|
28
|
+
- **John Szarkowski** โ The Five Characteristics for image assessment
|
|
29
|
+
|
|
30
|
+
> "The individual pages have to give up their independence in order to form a union." โ Keith Smith
|
|
31
|
+
|
|
32
|
+
For detailed principles, see `docs/photo-layout-principles.md`.
|
|
33
|
+
|
|
34
|
+
## Usage
|
|
35
|
+
|
|
36
|
+
`/gallery {folder} "{title}" {slug}`
|
|
37
|
+
|
|
38
|
+
Example: `/gallery cabo-2025 "CABO 2025" cabo`
|
|
39
|
+
|
|
40
|
+
**Important:** All paths are relative to the current project directory. The `{folder}` argument is a path within the project (e.g., `./photos/cabo-2025` or just `cabo-2025`). Do NOT search the filesystem for folders โ assume the user's folder exists in the current working directory.
|
|
41
|
+
|
|
42
|
+
## Gallery Modes
|
|
43
|
+
|
|
44
|
+
Before starting, identify the gallery's organizational mode:
|
|
45
|
+
|
|
46
|
+
| Mode | Definition | Implication |
|
|
47
|
+
|------|------------|-------------|
|
|
48
|
+
| **Series** | Chronological journey (default) | Respect timestamp order; adjust only within temporal clusters |
|
|
49
|
+
| **Group** | Thematic collection | Order is flexible; optimize for visual rhythm |
|
|
50
|
+
| **Sequence** | Strict order with meaning | Order is sacred; only adjust layout, not arrangement |
|
|
51
|
+
|
|
52
|
+
Most travel/event galleries are **Series**.
|
|
53
|
+
|
|
54
|
+
## Architecture
|
|
55
|
+
|
|
56
|
+
```
|
|
57
|
+
Atomic Scripts (reusable):
|
|
58
|
+
โโโ init-gallery-manifest.ts Create manifest from EXIF
|
|
59
|
+
โโโ merge-gallery-batches.ts Combine batch files
|
|
60
|
+
โโโ validate-gallery-manifest.ts Fix common errors
|
|
61
|
+
โโโ generate-gallery-files.ts Generate .astro pages
|
|
62
|
+
|
|
63
|
+
Sub-Agent Skill:
|
|
64
|
+
โโโ review-image-batch AI reviews images โ batch-NN.json
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
## Workflow
|
|
68
|
+
|
|
69
|
+
### Phase 1: Initialize
|
|
70
|
+
|
|
71
|
+
```bash
|
|
72
|
+
bun scripts/init-gallery-manifest.ts {folder} "{title}" {slug}
|
|
73
|
+
```
|
|
74
|
+
|
|
75
|
+
Creates:
|
|
76
|
+
- `src/data/gallery-manifests/{folder}.json` (images array, empty blocks)
|
|
77
|
+
- `/tmp/gallery-batches/{folder}/` (clean directory for batch files)
|
|
78
|
+
|
|
79
|
+
### Phase 2: Batch Review
|
|
80
|
+
|
|
81
|
+
Spawn sub-agents to review images. **Each writes to its own file** (parallel-safe).
|
|
82
|
+
|
|
83
|
+
```
|
|
84
|
+
For batchIndex in 0..ceil(imageCount/8):
|
|
85
|
+
Task(
|
|
86
|
+
subagent_type: "general-purpose",
|
|
87
|
+
description: "Review gallery batch {batchIndex}",
|
|
88
|
+
prompt: <see below>
|
|
89
|
+
)
|
|
90
|
+
```
|
|
91
|
+
|
|
92
|
+
**Sub-agent prompt template:**
|
|
93
|
+
|
|
94
|
+
```
|
|
95
|
+
Review batch {batchIndex} for {folder} gallery.
|
|
96
|
+
|
|
97
|
+
Read:
|
|
98
|
+
- Manifest: src/data/gallery-manifests/{folder}.json
|
|
99
|
+
- Layout guide: {plugin_base_dir}/skills/review-image-batch/references/layout-guide.md
|
|
100
|
+
(The plugin base directory is provided in the skill invocation header)
|
|
101
|
+
|
|
102
|
+
Images to review: indices {startImage} to {endImage}
|
|
103
|
+
(Calculate: startImage = batchIndex * 8, endImage = min(startImage + 7, totalImages - 1))
|
|
104
|
+
|
|
105
|
+
Workflow:
|
|
106
|
+
1. Read manifest to get image filenames
|
|
107
|
+
2. Read layout guide for rules
|
|
108
|
+
3. View each image file with Read tool
|
|
109
|
+
4. Create layout blocks using your visual judgment
|
|
110
|
+
5. Write JSON to: /tmp/gallery-batches/{folder}/batch-{NN}.json
|
|
111
|
+
where NN = batchIndex padded to 2 digits (00, 01, 02...)
|
|
112
|
+
6. Return TEXT SUMMARY ONLY
|
|
113
|
+
|
|
114
|
+
Output file format:
|
|
115
|
+
{
|
|
116
|
+
"batchIndex": {batchIndex},
|
|
117
|
+
"startImage": {startImage},
|
|
118
|
+
"endImage": {endImage},
|
|
119
|
+
"blocks": [
|
|
120
|
+
{ "layout": "WideImage", "images": ["DSCF1234.jpeg"], "props": {}, "notes": "..." }
|
|
121
|
+
]
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
LAYOUT PHILOSOPHY:
|
|
125
|
+
Apply visual judgment, not mechanical rules. A gallery needs rhythm and variety.
|
|
126
|
+
|
|
127
|
+
Single-image (WideImage, OffsetImage, InsetImage, FullBleed):
|
|
128
|
+
- Strong standalones, portraits, quiet moments
|
|
129
|
+
|
|
130
|
+
Multi-image (TwoUp, ThreeUp):
|
|
131
|
+
- Use when juxtaposition creates meaning beyond either image alone
|
|
132
|
+
- Apply Lyons's test: Temporal? Spatial? Formal echo? Emotional pairing? Transformation?
|
|
133
|
+
- A good TwoUp is BETTER than two mediocre WideImages
|
|
134
|
+
- A true sequence (enteringโthroughโemerging) deserves ThreeUp
|
|
135
|
+
|
|
136
|
+
Spacer: Add breathing room after powerful images
|
|
137
|
+
Chapter: Insert at location/theme changes
|
|
138
|
+
```
|
|
139
|
+
|
|
140
|
+
**Parallel execution:** Sub-agents can run in parallel since each writes to its own file.
|
|
141
|
+
|
|
142
|
+
### Phase 3: Merge & Validate
|
|
143
|
+
|
|
144
|
+
After all batches complete:
|
|
145
|
+
|
|
146
|
+
```bash
|
|
147
|
+
bun scripts/merge-gallery-batches.ts {folder}
|
|
148
|
+
bun scripts/validate-gallery-manifest.ts src/data/gallery-manifests/{folder}.json
|
|
149
|
+
```
|
|
150
|
+
|
|
151
|
+
This combines all batch files and validates the result.
|
|
152
|
+
|
|
153
|
+
### Phase 4: Global Arc Review (NEW)
|
|
154
|
+
|
|
155
|
+
Before generating, review the merged manifest for overall coherence:
|
|
156
|
+
|
|
157
|
+
1. **Count hero moments** โ If >4 FullBleeds, demote some to WideImage
|
|
158
|
+
2. **Check multi-image limits** โ Max 2-3 TwoUp, 1-2 ThreeUp across entire gallery
|
|
159
|
+
3. **Verify rhythm** โ No consecutive high-weight blocks
|
|
160
|
+
4. **Identify the climax** โ One clear emotional peak, not many
|
|
161
|
+
5. **Working backwards** โ Does the final image provide satisfying closure?
|
|
162
|
+
|
|
163
|
+
### Phase 5: Generate
|
|
164
|
+
|
|
165
|
+
```bash
|
|
166
|
+
bun scripts/generate-gallery-files.ts {folder}
|
|
167
|
+
```
|
|
168
|
+
|
|
169
|
+
Creates:
|
|
170
|
+
- `src/data/{folder}.ts` (data file with chapters)
|
|
171
|
+
- `src/pages/photographing/{slug}/index.astro`
|
|
172
|
+
- Additional `.astro` files for each chapter (if multi-chapter)
|
|
173
|
+
|
|
174
|
+
## Resume Protocol
|
|
175
|
+
|
|
176
|
+
If interrupted, check `/tmp/gallery-batches/{folder}/` for existing batch files:
|
|
177
|
+
|
|
178
|
+
```bash
|
|
179
|
+
ls /tmp/gallery-batches/{folder}/
|
|
180
|
+
```
|
|
181
|
+
|
|
182
|
+
Only run missing batches, then merge.
|
|
183
|
+
|
|
184
|
+
## Layout Philosophy
|
|
185
|
+
|
|
186
|
+
A gallery needs **rhythm and variety** โ loud moments, quiet moments, pairings that create meaning.
|
|
187
|
+
|
|
188
|
+
| Layout | Purpose |
|
|
189
|
+
|--------|---------|
|
|
190
|
+
| WideImage | Strong standalone landscapes |
|
|
191
|
+
| OffsetImage | Portraits, quiet moments, breathing room |
|
|
192
|
+
| FullBleed | Hero shots, climactic moments |
|
|
193
|
+
| InsetImage | Intimate details, visual whispers |
|
|
194
|
+
| Spacer | Pacing, section breaks |
|
|
195
|
+
| TwoUp | Images that speak to each other |
|
|
196
|
+
| ThreeUp | True sequences (enteringโthroughโemerging) |
|
|
197
|
+
| SplitLayout | Asymmetric pairs, one frames the other |
|
|
198
|
+
| Chapter | Location/theme breaks |
|
|
199
|
+
|
|
200
|
+
### Lyons's Juxtaposition Test
|
|
201
|
+
|
|
202
|
+
Pair images when juxtaposition creates meaning beyond either image alone:
|
|
203
|
+
|
|
204
|
+
1. **Temporal** โ Same moment, different angles
|
|
205
|
+
2. **Spatial** โ Same scene, complementary views
|
|
206
|
+
3. **Formal echo** โ Compositional rhyme (lines, shapes, colors)
|
|
207
|
+
4. **Emotional** โ Contrast or reinforcement
|
|
208
|
+
5. **Transformation** โ Together they say something neither says alone
|
|
209
|
+
|
|
210
|
+
A strong TwoUp is better than two mediocre WideImages.
|
|
211
|
+
|
|
212
|
+
## Output
|
|
213
|
+
|
|
214
|
+
When complete:
|
|
215
|
+
- Gallery URL: `/photographing/{slug}/`
|
|
216
|
+
- Files:
|
|
217
|
+
- `src/data/gallery-manifests/{folder}.json`
|
|
218
|
+
- `src/data/{folder}.ts`
|
|
219
|
+
- `src/pages/photographing/{slug}/*.astro`
|
|
220
|
+
|
|
221
|
+
## Composability
|
|
222
|
+
|
|
223
|
+
Each piece is reusable:
|
|
224
|
+
|
|
225
|
+
```bash
|
|
226
|
+
# Just extract EXIF
|
|
227
|
+
bun scripts/init-gallery-manifest.ts photos "Photos" photos
|
|
228
|
+
|
|
229
|
+
# Just merge existing batches
|
|
230
|
+
bun scripts/merge-gallery-batches.ts photos
|
|
231
|
+
|
|
232
|
+
# Just regenerate pages from manifest
|
|
233
|
+
bun scripts/generate-gallery-files.ts photos
|
|
234
|
+
|
|
235
|
+
# Validate any manifest
|
|
236
|
+
bun scripts/validate-gallery-manifest.ts src/data/gallery-manifests/photos.json
|
|
237
|
+
```
|
|
@@ -0,0 +1,158 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: apple-store-submit
|
|
3
|
+
description: Handle Apple App Store rejection emails end-to-end โ parse rejection reasons, create a fix plan, implement code changes (privacy strings, entitlements, sandbox), navigate App Store Connect to update metadata, and resubmit. Use when an app receives a rejection or when preparing a first-time submission.
|
|
4
|
+
license: MIT
|
|
5
|
+
allowed-tools: Bash, Read, Write, Edit
|
|
6
|
+
compatibility: Codex, Claude Code, Cursor, GitHub Copilot, Windsurf, Kiro, and other Agent Skills compatible tools. Requires Xcode, an Apple Developer account, and App Store Connect access.
|
|
7
|
+
metadata:
|
|
8
|
+
targets: [_source-only]
|
|
9
|
+
author: Oleg Koval
|
|
10
|
+
tags:
|
|
11
|
+
- apple
|
|
12
|
+
- app-store
|
|
13
|
+
- ios
|
|
14
|
+
- macos
|
|
15
|
+
- xcode
|
|
16
|
+
- submission
|
|
17
|
+
- rejection
|
|
18
|
+
---
|
|
19
|
+
<!-- Generated by scripts/build-adapters.sh. Do not edit directly. -->
|
|
20
|
+
|
|
21
|
+
> ๐ค *Auto-generated by **weekly-pattern-learner** ยท App Store rejection handling workflow observed in FocusNotch App Store session, Jun 2026 (92 user turns covering rejection โ plan โ code fixes โ metadata โ resubmit)*
|
|
22
|
+
|
|
23
|
+
# Apple App Store Submission & Rejection Handling
|
|
24
|
+
|
|
25
|
+
## Overview
|
|
26
|
+
|
|
27
|
+
Parse Apple rejection feedback, implement targeted fixes, update App Store Connect metadata, and resubmit โ covering the complete cycle from rejection email to approved build.
|
|
28
|
+
|
|
29
|
+
## When to Use
|
|
30
|
+
|
|
31
|
+
- Apple review team sends a rejection email
|
|
32
|
+
- App fails automated pre-review checks (binary rejected at upload)
|
|
33
|
+
- Preparing metadata for first-time submission (screenshots, keywords, privacy labels)
|
|
34
|
+
- Resolving App Store Connect errors before submitting for review
|
|
35
|
+
|
|
36
|
+
## Workflow
|
|
37
|
+
|
|
38
|
+
### 1. Parse the Rejection
|
|
39
|
+
|
|
40
|
+
Read the full rejection email. Extract and list:
|
|
41
|
+
|
|
42
|
+
- **Guideline numbers** violated (e.g., 2.1, 4.2.0, 5.1.1)
|
|
43
|
+
- **Code-level issues** โ missing entitlements, incorrect privacy strings, sandbox violations
|
|
44
|
+
- **Metadata issues** โ wrong screenshot sizes, subtitle policy, keyword stuffing
|
|
45
|
+
- **UX issues** โ crashes described by reviewer, broken flows, missing functionality
|
|
46
|
+
|
|
47
|
+
Create a numbered fix plan: one item per rejection point, with the type of fix needed.
|
|
48
|
+
|
|
49
|
+
### 2. Classify Fixes by Type
|
|
50
|
+
|
|
51
|
+
| Type | Location |
|
|
52
|
+
|------|----------|
|
|
53
|
+
| Privacy usage strings missing | `Info.plist` |
|
|
54
|
+
| Entitlement missing/wrong | `<AppName>.entitlements` |
|
|
55
|
+
| Crash or broken feature | Source code |
|
|
56
|
+
| Screenshots wrong size/content | App Store Connect |
|
|
57
|
+
| Keywords/subtitle/description | App Store Connect |
|
|
58
|
+
| Build number conflict | Xcode + App Store Connect |
|
|
59
|
+
|
|
60
|
+
### 3. Implement Code Fixes
|
|
61
|
+
|
|
62
|
+
**Privacy permission strings** (`Info.plist`):
|
|
63
|
+
|
|
64
|
+
```xml
|
|
65
|
+
<key>NSMicrophoneUsageDescription</key>
|
|
66
|
+
<string>Used for voice input during focus sessions.</string>
|
|
67
|
+
|
|
68
|
+
<key>NSCalendarsUsageDescription</key>
|
|
69
|
+
<string>Used to sync tasks with your calendar.</string>
|
|
70
|
+
```
|
|
71
|
+
|
|
72
|
+
**Entitlements** (`<AppName>.entitlements`):
|
|
73
|
+
|
|
74
|
+
```xml
|
|
75
|
+
<key>com.apple.security.app-sandbox</key>
|
|
76
|
+
<true/>
|
|
77
|
+
<key>com.apple.security.network.client</key>
|
|
78
|
+
<true/>
|
|
79
|
+
<key>com.apple.security.files.user-selected.read-write</key>
|
|
80
|
+
<true/>
|
|
81
|
+
```
|
|
82
|
+
|
|
83
|
+
**Sandbox violations** โ remove `NoEscapeBlock` patterns, replace deprecated APIs, use only sandboxed file access via Security-Scoped Bookmarks when needed.
|
|
84
|
+
|
|
85
|
+
### 4. Build and Archive
|
|
86
|
+
|
|
87
|
+
```bash
|
|
88
|
+
# Clean build
|
|
89
|
+
xcodebuild clean \
|
|
90
|
+
-scheme <AppName> \
|
|
91
|
+
-destination 'generic/platform=macOS'
|
|
92
|
+
|
|
93
|
+
# Archive
|
|
94
|
+
xcodebuild archive \
|
|
95
|
+
-scheme <AppName> \
|
|
96
|
+
-archivePath build/<AppName>.xcarchive \
|
|
97
|
+
-destination 'generic/platform=macOS'
|
|
98
|
+
|
|
99
|
+
# Export for App Store
|
|
100
|
+
xcodebuild -exportArchive \
|
|
101
|
+
-archivePath build/<AppName>.xcarchive \
|
|
102
|
+
-exportPath build/export \
|
|
103
|
+
-exportOptionsPlist ExportOptions.plist
|
|
104
|
+
```
|
|
105
|
+
|
|
106
|
+
Validate codesigning before upload:
|
|
107
|
+
|
|
108
|
+
```bash
|
|
109
|
+
codesign --verify --deep --strict --verbose=4 build/export/<AppName>.app
|
|
110
|
+
spctl --assess --verbose=4 build/export/<AppName>.app
|
|
111
|
+
```
|
|
112
|
+
|
|
113
|
+
### 5. Update App Store Connect Metadata
|
|
114
|
+
|
|
115
|
+
Navigate: **My Apps โ [App] โ App Store tab**
|
|
116
|
+
|
|
117
|
+
Common metadata fixes:
|
|
118
|
+
|
|
119
|
+
- **App name**: max 30 chars
|
|
120
|
+
- **Subtitle**: max 30 chars, no duplicate keywords from the title field
|
|
121
|
+
- **Keywords**: 100-char total limit, comma-separated, no spaces after commas
|
|
122
|
+
- **Screenshots**: exact pixel dimensions per device type (check Apple's current spec)
|
|
123
|
+
- **Privacy Nutrition Labels**: must accurately reflect data collected/linked to user
|
|
124
|
+
- **Build selection**: select the newly uploaded build before submitting
|
|
125
|
+
|
|
126
|
+
### 6. Write Reviewer Notes
|
|
127
|
+
|
|
128
|
+
In the submission form, fill **Notes for Reviewer**:
|
|
129
|
+
|
|
130
|
+
- Explain each rejection point and what was changed
|
|
131
|
+
- Reference specific guideline numbers: "Addressing 2.1 โ added NSMicrophoneUsageDescription to Info.plist"
|
|
132
|
+
- If a feature requires special credentials to test, provide test account details
|
|
133
|
+
|
|
134
|
+
### 7. Submit and Track
|
|
135
|
+
|
|
136
|
+
1. Upload via **Xcode Organizer โ Distribute App โ App Store Connect**
|
|
137
|
+
2. In App Store Connect: select the new build, fill notes, **Submit for Review**
|
|
138
|
+
3. Typical re-review: 24โ48h
|
|
139
|
+
4. If rejected again: respond in the **Resolution Center** thread (same case number)
|
|
140
|
+
5. Escalate via Resolution Center for policy disagreements โ do not open a new submission
|
|
141
|
+
|
|
142
|
+
## Build Number Protocol
|
|
143
|
+
|
|
144
|
+
Apple rejects builds with a duplicate build number. Increment `CFBundleVersion` in `Info.plist` or Xcode target settings before every upload:
|
|
145
|
+
|
|
146
|
+
```bash
|
|
147
|
+
# Bump build number (e.g., 9 โ 10)
|
|
148
|
+
xcrun agvtool new-version -all 10
|
|
149
|
+
```
|
|
150
|
+
|
|
151
|
+
## Verification
|
|
152
|
+
|
|
153
|
+
- [ ] Every rejection guideline number has a corresponding fix in the plan
|
|
154
|
+
- [ ] `xcodebuild archive` exits 0 with no warnings about entitlements
|
|
155
|
+
- [ ] `codesign --verify` passes
|
|
156
|
+
- [ ] App Store Connect shows build status as "Ready to Submit"
|
|
157
|
+
- [ ] Reviewer Notes reference each changed item
|
|
158
|
+
- [ ] Build number is higher than any previously uploaded build
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "olko:cloudflare-block-countries",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "Block specific countries via Cloudflare WAF Custom Rules using the Cloudflare API. Handles creating new rulesets and updating existing ones across single or multiple zones.",
|
|
5
|
+
"skills": "skills/"
|
|
6
|
+
}
|