@olegkoval/agent-skills 1.6.0 → 1.7.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 (121) hide show
  1. package/.claude-plugin/plugin.json +1 -1
  2. package/.kiro/steering/add-to-my-skills.md +78 -0
  3. package/.kiro/steering/ai-tools-setup.md +263 -0
  4. package/.kiro/steering/changelog-generator.md +106 -0
  5. package/.kiro/steering/cloudflare-block-countries.md +167 -0
  6. package/.kiro/steering/docs-index-keeper.md +53 -0
  7. package/.kiro/steering/fill-music-player.md +101 -0
  8. package/.kiro/steering/gallery.md +228 -0
  9. package/.kiro/steering/gh-cli.md +2190 -0
  10. package/.kiro/steering/git-commit.md +125 -0
  11. package/.kiro/steering/open-source-publisher.md +427 -0
  12. package/.kiro/steering/product-builder.md +213 -0
  13. package/.kiro/steering/promptctl.md +81 -0
  14. package/.kiro/steering/search-console-indexing-audit.md +57 -0
  15. package/.kiro/steering/semantic-release-beta.md +48 -0
  16. package/.kiro/steering/starter-rules.md +62 -0
  17. package/.kiro/steering/viral-launch.md +92 -0
  18. package/.windsurf/rules/add-to-my-skills.md +77 -0
  19. package/.windsurf/rules/ai-tools-setup.md +262 -0
  20. package/.windsurf/rules/changelog-generator.md +105 -0
  21. package/.windsurf/rules/cloudflare-block-countries.md +166 -0
  22. package/.windsurf/rules/docs-index-keeper.md +52 -0
  23. package/.windsurf/rules/fill-music-player.md +100 -0
  24. package/.windsurf/rules/gallery.md +227 -0
  25. package/.windsurf/rules/gh-cli.md +2189 -0
  26. package/.windsurf/rules/git-commit.md +124 -0
  27. package/.windsurf/rules/open-source-publisher.md +426 -0
  28. package/.windsurf/rules/product-builder.md +212 -0
  29. package/.windsurf/rules/promptctl.md +80 -0
  30. package/.windsurf/rules/search-console-indexing-audit.md +56 -0
  31. package/.windsurf/rules/semantic-release-beta.md +47 -0
  32. package/.windsurf/rules/starter-rules.md +61 -0
  33. package/.windsurf/rules/viral-launch.md +91 -0
  34. package/README.md +67 -14
  35. package/catalog/skills.json +48 -16
  36. package/docs/skill-anatomy.md +10 -6
  37. package/package.json +3 -1
  38. package/packages/marketing/search-console-indexing-audit/SKILL.md +3 -0
  39. package/packages/marketing/search-console-indexing-audit/adapters/claude/skills/search-console-indexing-audit/SKILL.md +3 -0
  40. package/packages/marketing/search-console-indexing-audit/adapters/cursor/plugin.json +1 -1
  41. package/packages/marketing/search-console-indexing-audit/adapters/cursor/skills/search-console-indexing-audit/SKILL.md +3 -0
  42. package/packages/marketing/search-console-indexing-audit/adapters/kiro/steering/search-console-indexing-audit.md +57 -0
  43. package/packages/marketing/search-console-indexing-audit/adapters/windsurf/rules/search-console-indexing-audit.md +56 -0
  44. package/packages/marketing/viral-launch/SKILL.md +3 -1
  45. package/packages/marketing/viral-launch/adapters/claude/skills/viral-launch/SKILL.md +3 -1
  46. package/packages/marketing/viral-launch/adapters/cursor/skills/viral-launch/SKILL.md +3 -1
  47. package/packages/marketing/viral-launch/adapters/kiro/steering/viral-launch.md +92 -0
  48. package/packages/marketing/viral-launch/adapters/windsurf/rules/viral-launch.md +91 -0
  49. package/packages/music/fill-music-player/SKILL.md +2 -1
  50. package/packages/music/fill-music-player/adapters/claude/skills/fill-music-player/SKILL.md +2 -1
  51. package/packages/music/fill-music-player/adapters/cursor/plugin.json +1 -1
  52. package/packages/music/fill-music-player/adapters/cursor/skills/fill-music-player/SKILL.md +2 -1
  53. package/packages/music/fill-music-player/adapters/kiro/steering/fill-music-player.md +101 -0
  54. package/packages/music/fill-music-player/adapters/windsurf/rules/fill-music-player.md +100 -0
  55. package/packages/photography/gallery/SKILL.md +3 -1
  56. package/packages/photography/gallery/adapters/claude/skills/gallery/SKILL.md +3 -1
  57. package/packages/photography/gallery/adapters/cursor/skills/gallery/SKILL.md +3 -1
  58. package/packages/photography/gallery/adapters/kiro/steering/gallery.md +228 -0
  59. package/packages/photography/gallery/adapters/windsurf/rules/gallery.md +227 -0
  60. package/packages/software-development/add-to-my-skills/SKILL.md +2 -1
  61. package/packages/software-development/add-to-my-skills/adapters/claude/skills/add-to-my-skills/SKILL.md +2 -1
  62. package/packages/software-development/add-to-my-skills/adapters/cursor/skills/add-to-my-skills/SKILL.md +2 -1
  63. package/packages/software-development/add-to-my-skills/adapters/kiro/steering/add-to-my-skills.md +78 -0
  64. package/packages/software-development/add-to-my-skills/adapters/windsurf/rules/add-to-my-skills.md +77 -0
  65. package/packages/software-development/ai-tools-setup/adapters/kiro/steering/ai-tools-setup.md +263 -0
  66. package/packages/software-development/ai-tools-setup/adapters/windsurf/rules/ai-tools-setup.md +262 -0
  67. package/packages/software-development/changelog-generator/SKILL.md +3 -1
  68. package/packages/software-development/changelog-generator/adapters/claude/skills/changelog-generator/SKILL.md +3 -1
  69. package/packages/software-development/changelog-generator/adapters/cursor/skills/changelog-generator/SKILL.md +3 -1
  70. package/packages/software-development/changelog-generator/adapters/kiro/steering/changelog-generator.md +106 -0
  71. package/packages/software-development/changelog-generator/adapters/windsurf/rules/changelog-generator.md +105 -0
  72. package/packages/software-development/cloudflare-block-countries/SKILL.md +1 -1
  73. package/packages/software-development/cloudflare-block-countries/adapters/claude/skills/cloudflare-block-countries/SKILL.md +1 -1
  74. package/packages/software-development/cloudflare-block-countries/adapters/cursor/skills/cloudflare-block-countries/SKILL.md +1 -1
  75. package/packages/software-development/cloudflare-block-countries/adapters/kiro/steering/cloudflare-block-countries.md +167 -0
  76. package/packages/software-development/cloudflare-block-countries/adapters/windsurf/rules/cloudflare-block-countries.md +166 -0
  77. package/packages/software-development/docs-index-keeper/SKILL.md +2 -1
  78. package/packages/software-development/docs-index-keeper/adapters/claude/skills/docs-index-keeper/SKILL.md +2 -1
  79. package/packages/software-development/docs-index-keeper/adapters/cursor/plugin.json +1 -1
  80. package/packages/software-development/docs-index-keeper/adapters/cursor/skills/docs-index-keeper/SKILL.md +2 -1
  81. package/packages/software-development/docs-index-keeper/adapters/kiro/steering/docs-index-keeper.md +53 -0
  82. package/packages/software-development/docs-index-keeper/adapters/windsurf/rules/docs-index-keeper.md +52 -0
  83. package/packages/software-development/gh-cli/SKILL.md +3 -1
  84. package/packages/software-development/gh-cli/adapters/claude/skills/gh-cli/SKILL.md +3 -1
  85. package/packages/software-development/gh-cli/adapters/cursor/skills/gh-cli/SKILL.md +3 -1
  86. package/packages/software-development/gh-cli/adapters/kiro/steering/gh-cli.md +2190 -0
  87. package/packages/software-development/gh-cli/adapters/windsurf/rules/gh-cli.md +2189 -0
  88. package/packages/software-development/git-commit/SKILL.md +1 -1
  89. package/packages/software-development/git-commit/adapters/claude/skills/git-commit/SKILL.md +1 -1
  90. package/packages/software-development/git-commit/adapters/cursor/skills/git-commit/SKILL.md +1 -1
  91. package/packages/software-development/git-commit/adapters/kiro/steering/git-commit.md +125 -0
  92. package/packages/software-development/git-commit/adapters/windsurf/rules/git-commit.md +124 -0
  93. package/packages/software-development/open-source-publisher/SKILL.md +2 -1
  94. package/packages/software-development/open-source-publisher/adapters/claude/skills/open-source-publisher/SKILL.md +2 -1
  95. package/packages/software-development/open-source-publisher/adapters/cursor/skills/open-source-publisher/SKILL.md +2 -1
  96. package/packages/software-development/open-source-publisher/adapters/kiro/steering/open-source-publisher.md +427 -0
  97. package/packages/software-development/open-source-publisher/adapters/windsurf/rules/open-source-publisher.md +426 -0
  98. package/packages/software-development/product-builder/SKILL.md +2 -1
  99. package/packages/software-development/product-builder/adapters/claude/skills/product-builder/SKILL.md +2 -1
  100. package/packages/software-development/product-builder/adapters/cursor/plugin.json +1 -1
  101. package/packages/software-development/product-builder/adapters/cursor/skills/product-builder/SKILL.md +2 -1
  102. package/packages/software-development/product-builder/adapters/kiro/steering/product-builder.md +213 -0
  103. package/packages/software-development/product-builder/adapters/windsurf/rules/product-builder.md +212 -0
  104. package/packages/software-development/promptctl/SKILL.md +3 -1
  105. package/packages/software-development/promptctl/adapters/claude/skills/promptctl/SKILL.md +3 -1
  106. package/packages/software-development/promptctl/adapters/cursor/skills/promptctl/SKILL.md +3 -1
  107. package/packages/software-development/promptctl/adapters/kiro/steering/promptctl.md +81 -0
  108. package/packages/software-development/promptctl/adapters/windsurf/rules/promptctl.md +80 -0
  109. package/packages/software-development/semantic-release-beta/SKILL.md +3 -1
  110. package/packages/software-development/semantic-release-beta/adapters/claude/skills/semantic-release-beta/SKILL.md +3 -1
  111. package/packages/software-development/semantic-release-beta/adapters/cursor/skills/semantic-release-beta/SKILL.md +3 -1
  112. package/packages/software-development/semantic-release-beta/adapters/kiro/steering/semantic-release-beta.md +48 -0
  113. package/packages/software-development/semantic-release-beta/adapters/windsurf/rules/semantic-release-beta.md +47 -0
  114. package/packages/software-development/starter-rules/SKILL.md +2 -1
  115. package/packages/software-development/starter-rules/adapters/claude/skills/starter-rules/SKILL.md +2 -1
  116. package/packages/software-development/starter-rules/adapters/cursor/plugin.json +3 -2
  117. package/packages/software-development/starter-rules/adapters/cursor/skills/starter-rules/SKILL.md +2 -1
  118. package/packages/software-development/starter-rules/adapters/kiro/steering/starter-rules.md +62 -0
  119. package/packages/software-development/starter-rules/adapters/windsurf/rules/starter-rules.md +61 -0
  120. package/scripts/build-adapters.sh +97 -8
  121. package/scripts/validate-catalog.sh +4 -0
@@ -0,0 +1,91 @@
1
+ <!-- Generated by scripts/build-adapters.sh. Do not edit directly. -->
2
+
3
+ ---
4
+ description: "Set up a project repository and launch plan for shareable marketing, public launch readiness, and growth loops."
5
+ ---
6
+
7
+
8
+ # viral-launch
9
+
10
+ Use this skill when a user wants to launch a project, make a repo marketable, improve discoverability, or build shareable launch assets.
11
+
12
+ 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.
13
+
14
+ ## Trigger phrases
15
+
16
+ - make this repo launch-ready
17
+ - set this up to go viral
18
+ - prepare a product launch
19
+ - create marketing assets for this project
20
+ - improve the README for launch
21
+ - prepare Product Hunt / Hacker News / X / LinkedIn launch copy
22
+ - set up an open-source repo for growth
23
+
24
+ ## Workflow
25
+
26
+ 1. Inspect the project first:
27
+ - product purpose
28
+ - target user
29
+ - core use case
30
+ - current README and docs
31
+ - install or demo path
32
+ - screenshots, videos, or visual proof
33
+ - analytics or waitlist capture if present
34
+ 2. Define the launch angle in one sentence:
35
+ - who it is for
36
+ - what painful job it solves
37
+ - why now
38
+ - what makes it different
39
+ 3. Make the repo launch-ready:
40
+ - clear README headline and first paragraph
41
+ - demo or quickstart within the first screen
42
+ - installation steps that work from a clean checkout
43
+ - screenshots, GIF, or demo link where possible
44
+ - feature list based on outcomes, not implementation trivia
45
+ - examples for the highest-intent use cases
46
+ - badges only when they add trust
47
+ - license, contributing notes, and issue templates when useful
48
+ 4. Create launch assets:
49
+ - short tagline
50
+ - 1-paragraph announcement
51
+ - 5 social post variants
52
+ - Product Hunt tagline and description when relevant
53
+ - Hacker News title candidates when relevant
54
+ - launch email or DM when relevant
55
+ - creator/influencer outreach list criteria, not spam copy
56
+ 5. Design share loops:
57
+ - a reason users would show the output to someone else
58
+ - a public artifact worth linking
59
+ - a before/after demo
60
+ - a template, benchmark, checklist, or gallery that can travel
61
+ - referral or waitlist loop only if it fits the product
62
+ 6. Define proof and metrics:
63
+ - activation event
64
+ - share event
65
+ - conversion event
66
+ - retention proxy
67
+ - launch-day dashboard or simple tracking checklist
68
+ 7. Keep claims grounded:
69
+ - do not invent traction, logos, benchmarks, testimonials, or user counts
70
+ - mark assumptions explicitly
71
+ - prefer specific proof over hype
72
+ - avoid dark patterns and spam
73
+
74
+ ## Output format
75
+
76
+ When planning, produce:
77
+
78
+ - Launch angle
79
+ - Repo changes
80
+ - Launch assets
81
+ - Share loops
82
+ - Metrics
83
+ - Risks and assumptions
84
+ - Next actions
85
+
86
+ When editing a repository, make the smallest useful set of changes first, then validate by reading the README from a new user's perspective.
87
+
88
+ ## References
89
+
90
+ - `references/launch-checklist.md`
91
+ - `references/external-skills.md`
@@ -2,7 +2,8 @@
2
2
  name: fill-music-player
3
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
4
  license: MIT
5
- compatibility: Codex, Claude Code, Cursor, and other Agent Skills compatible tools. Requires shell access and the fill-music-player CLI or underlying script in the target environment.
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.
6
7
  metadata:
7
8
  author: Oleg Koval
8
9
  tags:
@@ -4,7 +4,8 @@
4
4
  name: fill-music-player
5
5
  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.
6
6
  license: MIT
7
- compatibility: Codex, Claude Code, Cursor, and other Agent Skills compatible tools. Requires shell access and the fill-music-player CLI or underlying script in the target environment.
7
+ allowed-tools: Bash
8
+ 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.
8
9
  metadata:
9
10
  author: Oleg Koval
10
11
  tags:
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "olko:fill-music-player",
3
3
  "version": "0.1.0",
4
- "description": "Fill a portable music player with a curated random selection from a source music library.",
4
+ "description": "Fill a portable music player with a curated random selection from a source music library while balancing formats, artists, albums, and capacity.",
5
5
  "skills": "skills/"
6
6
  }
@@ -4,7 +4,8 @@
4
4
  name: fill-music-player
5
5
  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.
6
6
  license: MIT
7
- compatibility: Codex, Claude Code, Cursor, and other Agent Skills compatible tools. Requires shell access and the fill-music-player CLI or underlying script in the target environment.
7
+ allowed-tools: Bash
8
+ 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.
8
9
  metadata:
9
10
  author: Oleg Koval
10
11
  tags:
@@ -0,0 +1,101 @@
1
+ <!-- Generated by scripts/build-adapters.sh. Do not edit directly. -->
2
+
3
+ ---
4
+ inclusion: manual
5
+ description: "Fill a portable music player with a curated random selection from a source music library while balancing formats, artists, albums, and capacity."
6
+ ---
7
+
8
+
9
+ # fill-music-player
10
+
11
+ 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.
12
+
13
+ ## Quick Reference
14
+
15
+ ```bash
16
+ # Dry run first (always recommend this)
17
+ fill-music-player --source /Volumes/music --dest /Volumes/WALKMAN/MUSIC --dry-run
18
+
19
+ # Copy for real
20
+ fill-music-player --source /Volumes/music --dest /Volumes/WALKMAN/MUSIC
21
+
22
+ # Or run the script directly with uv
23
+ uv run fill_music_player.py --source ~/Music --dest /Volumes/USB --dry-run
24
+ ```
25
+
26
+ Run `fill-music-player --help` for all options.
27
+
28
+ ## Key Parameters
29
+
30
+ | Flag | Default | Purpose |
31
+ |------|---------|---------|
32
+ | `--source` / `-s` | required | Source music root (NAS mount, ~/Music, etc.) |
33
+ | `--dest` / `-d` | required | Player destination directory |
34
+ | `--target-gb` | 95% of free space | How many GB to fill |
35
+ | `--formats` | mp3,m4a,wma,aac | Allowed extensions |
36
+ | `--max-per-artist` | 4 | Artist diversity cap |
37
+ | `--max-per-album` | 3 | Album diversity cap |
38
+ | `--skip-dirs` | (none) | Top-level dirs to skip |
39
+ | `--dry-run` | false | Preview without copying |
40
+
41
+ ## Workflow
42
+
43
+ 1. Always do `--dry-run` first
44
+ 2. Review the per-genre breakdown
45
+ 3. Adjust `--skip-dirs`, `--max-file-mb`, or `--max-per-artist` if needed
46
+ 4. Run without `--dry-run` to copy
47
+
48
+ ## Device Formats
49
+
50
+ | Device | Recommended `--formats` |
51
+ |--------|------------------------|
52
+ | Sony Walkman NWZ series | `mp3,m4a,wma` |
53
+ | iPod (classic/nano) | `mp3,m4a,aac` |
54
+ | Generic USB player | `mp3` |
55
+ | Any modern player | `mp3,m4a,wma,aac,ogg,flac` |
56
+
57
+ ## Edge Cases and Troubleshooting
58
+
59
+ | Situation | What happens | Fix |
60
+ |-----------|-------------|-----|
61
+ | 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()`) |
62
+ | Source has only FLAC/lossless | 0 files selected (FLAC not in default formats) | Use `--formats flac` or `--formats mp3,flac` |
63
+ | FAT32 filename too long or illegal chars | Filenames are sanitized: `<>:"/\|?*` replaced with `_`, truncated to 80 chars | Automatic — no action needed |
64
+ | Mixed/broken ID3 tags | Falls back to folder name parsing (`Genre/Artist - Album/track.mp3`) | Works transparently; folder structure is the reliable fallback |
65
+ | Very large files (DJ mixes, radio shows) | Skipped by default (>20 MB) | Adjust with `--max-file-mb 50` to include mixes |
66
+ | Tiny files (jingles, corrupt) | Skipped by default (<300 KB) | Adjust with `--min-file-kb 100` to be more permissive |
67
+ | One artist dominates the library | Capped at 4 tracks per artist, 3 per album | Lower with `--max-per-artist 2` for more variety |
68
+ | Empty genre directories | Silently skipped, no error | Normal behavior |
69
+ | Destination already has files | Existing files are not overwritten or deleted; new tracks added alongside | Clear destination first if you want a fresh set |
70
+ | 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 |
71
+
72
+ ## Real-World Example
73
+
74
+ 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:
75
+
76
+ ```bash
77
+ # Step 1: Preview
78
+ fill-music-player \
79
+ --source /Volumes/music \
80
+ --dest /Volumes/WALKMAN/MUSIC \
81
+ --skip-dirs "jingles,!recordings,!restored,dubrecords" \
82
+ --formats mp3,m4a,wma \
83
+ --dry-run
84
+
85
+ # Output:
86
+ # Found 8914 candidate tracks across 14 genres
87
+ # Funk → 86 tracks (440.8 MB)
88
+ # blues → 38 tracks (316.7 MB)
89
+ # hiphop → 33 tracks (234.7 MB)
90
+ # ...
91
+ # Selected 348 tracks (2473.0 MB)
92
+
93
+ # Step 2: Copy
94
+ fill-music-player \
95
+ --source /Volumes/music \
96
+ --dest /Volumes/WALKMAN/MUSIC \
97
+ --skip-dirs "jingles,!recordings,!restored,dubrecords" \
98
+ --formats mp3,m4a,wma
99
+ ```
100
+
101
+ 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,100 @@
1
+ <!-- Generated by scripts/build-adapters.sh. Do not edit directly. -->
2
+
3
+ ---
4
+ description: "Fill a portable music player with a curated random selection from a source music library while balancing formats, artists, albums, and capacity."
5
+ ---
6
+
7
+
8
+ # fill-music-player
9
+
10
+ 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.
11
+
12
+ ## Quick Reference
13
+
14
+ ```bash
15
+ # Dry run first (always recommend this)
16
+ fill-music-player --source /Volumes/music --dest /Volumes/WALKMAN/MUSIC --dry-run
17
+
18
+ # Copy for real
19
+ fill-music-player --source /Volumes/music --dest /Volumes/WALKMAN/MUSIC
20
+
21
+ # Or run the script directly with uv
22
+ uv run fill_music_player.py --source ~/Music --dest /Volumes/USB --dry-run
23
+ ```
24
+
25
+ Run `fill-music-player --help` for all options.
26
+
27
+ ## Key Parameters
28
+
29
+ | Flag | Default | Purpose |
30
+ |------|---------|---------|
31
+ | `--source` / `-s` | required | Source music root (NAS mount, ~/Music, etc.) |
32
+ | `--dest` / `-d` | required | Player destination directory |
33
+ | `--target-gb` | 95% of free space | How many GB to fill |
34
+ | `--formats` | mp3,m4a,wma,aac | Allowed extensions |
35
+ | `--max-per-artist` | 4 | Artist diversity cap |
36
+ | `--max-per-album` | 3 | Album diversity cap |
37
+ | `--skip-dirs` | (none) | Top-level dirs to skip |
38
+ | `--dry-run` | false | Preview without copying |
39
+
40
+ ## Workflow
41
+
42
+ 1. Always do `--dry-run` first
43
+ 2. Review the per-genre breakdown
44
+ 3. Adjust `--skip-dirs`, `--max-file-mb`, or `--max-per-artist` if needed
45
+ 4. Run without `--dry-run` to copy
46
+
47
+ ## Device Formats
48
+
49
+ | Device | Recommended `--formats` |
50
+ |--------|------------------------|
51
+ | Sony Walkman NWZ series | `mp3,m4a,wma` |
52
+ | iPod (classic/nano) | `mp3,m4a,aac` |
53
+ | Generic USB player | `mp3` |
54
+ | Any modern player | `mp3,m4a,wma,aac,ogg,flac` |
55
+
56
+ ## Edge Cases and Troubleshooting
57
+
58
+ | Situation | What happens | Fix |
59
+ |-----------|-------------|-----|
60
+ | 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()`) |
61
+ | Source has only FLAC/lossless | 0 files selected (FLAC not in default formats) | Use `--formats flac` or `--formats mp3,flac` |
62
+ | FAT32 filename too long or illegal chars | Filenames are sanitized: `<>:"/\|?*` replaced with `_`, truncated to 80 chars | Automatic — no action needed |
63
+ | Mixed/broken ID3 tags | Falls back to folder name parsing (`Genre/Artist - Album/track.mp3`) | Works transparently; folder structure is the reliable fallback |
64
+ | Very large files (DJ mixes, radio shows) | Skipped by default (>20 MB) | Adjust with `--max-file-mb 50` to include mixes |
65
+ | Tiny files (jingles, corrupt) | Skipped by default (<300 KB) | Adjust with `--min-file-kb 100` to be more permissive |
66
+ | One artist dominates the library | Capped at 4 tracks per artist, 3 per album | Lower with `--max-per-artist 2` for more variety |
67
+ | Empty genre directories | Silently skipped, no error | Normal behavior |
68
+ | Destination already has files | Existing files are not overwritten or deleted; new tracks added alongside | Clear destination first if you want a fresh set |
69
+ | 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 |
70
+
71
+ ## Real-World Example
72
+
73
+ 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:
74
+
75
+ ```bash
76
+ # Step 1: Preview
77
+ fill-music-player \
78
+ --source /Volumes/music \
79
+ --dest /Volumes/WALKMAN/MUSIC \
80
+ --skip-dirs "jingles,!recordings,!restored,dubrecords" \
81
+ --formats mp3,m4a,wma \
82
+ --dry-run
83
+
84
+ # Output:
85
+ # Found 8914 candidate tracks across 14 genres
86
+ # Funk → 86 tracks (440.8 MB)
87
+ # blues → 38 tracks (316.7 MB)
88
+ # hiphop → 33 tracks (234.7 MB)
89
+ # ...
90
+ # Selected 348 tracks (2473.0 MB)
91
+
92
+ # Step 2: Copy
93
+ fill-music-player \
94
+ --source /Volumes/music \
95
+ --dest /Volumes/WALKMAN/MUSIC \
96
+ --skip-dirs "jingles,!recordings,!restored,dubrecords" \
97
+ --formats mp3,m4a,wma
98
+ ```
99
+
100
+ 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.
@@ -1,7 +1,9 @@
1
1
  ---
2
2
  name: gallery
3
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
- compatibility: Codex, Claude Code, Cursor, and other Agent Skills compatible tools. Requires a project that contains the gallery scripts and expected data layout.
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.
5
7
  metadata:
6
8
  author: Oleg Koval
7
9
  tags:
@@ -3,7 +3,9 @@
3
3
  ---
4
4
  name: gallery
5
5
  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.
6
- compatibility: Codex, Claude Code, Cursor, and other Agent Skills compatible tools. Requires a project that contains the gallery scripts and expected data layout.
6
+ license: MIT
7
+ allowed-tools: Bash, Read, Write, WebSearch, WebFetch
8
+ 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
9
  metadata:
8
10
  author: Oleg Koval
9
11
  tags:
@@ -3,7 +3,9 @@
3
3
  ---
4
4
  name: gallery
5
5
  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.
6
- compatibility: Codex, Claude Code, Cursor, and other Agent Skills compatible tools. Requires a project that contains the gallery scripts and expected data layout.
6
+ license: MIT
7
+ allowed-tools: Bash, Read, Write, WebSearch, WebFetch
8
+ 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
9
  metadata:
8
10
  author: Oleg Koval
9
11
  tags:
@@ -0,0 +1,228 @@
1
+ <!-- Generated by scripts/build-adapters.sh. Do not edit directly. -->
2
+
3
+ ---
4
+ inclusion: manual
5
+ description: "Create photo galleries with AI-assisted layout curation and sequencing."
6
+ ---
7
+
8
+
9
+ # Gallery Workflow
10
+
11
+ Composed skill that creates photo galleries by orchestrating atomic scripts and sub-agents.
12
+
13
+ ## Philosophy
14
+
15
+ This skill applies principles from masters of photo sequencing and curation:
16
+
17
+ - **Keith Smith** — Group/Series/Sequence taxonomy; the gallery as a unified experience
18
+ - **Jörg Colberg** — Ruthless editing; visual rhythm; pacing
19
+ - **John Szarkowski** — The Five Characteristics for image assessment
20
+
21
+ > "The individual pages have to give up their independence in order to form a union." — Keith Smith
22
+
23
+ For detailed principles, see `docs/photo-layout-principles.md`.
24
+
25
+ ## Usage
26
+
27
+ `/gallery {folder} "{title}" {slug}`
28
+
29
+ Example: `/gallery cabo-2025 "CABO 2025" cabo`
30
+
31
+ **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.
32
+
33
+ ## Gallery Modes
34
+
35
+ Before starting, identify the gallery's organizational mode:
36
+
37
+ | Mode | Definition | Implication |
38
+ |------|------------|-------------|
39
+ | **Series** | Chronological journey (default) | Respect timestamp order; adjust only within temporal clusters |
40
+ | **Group** | Thematic collection | Order is flexible; optimize for visual rhythm |
41
+ | **Sequence** | Strict order with meaning | Order is sacred; only adjust layout, not arrangement |
42
+
43
+ Most travel/event galleries are **Series**.
44
+
45
+ ## Architecture
46
+
47
+ ```
48
+ Atomic Scripts (reusable):
49
+ ├── init-gallery-manifest.ts Create manifest from EXIF
50
+ ├── merge-gallery-batches.ts Combine batch files
51
+ ├── validate-gallery-manifest.ts Fix common errors
52
+ └── generate-gallery-files.ts Generate .astro pages
53
+
54
+ Sub-Agent Skill:
55
+ └── review-image-batch AI reviews images → batch-NN.json
56
+ ```
57
+
58
+ ## Workflow
59
+
60
+ ### Phase 1: Initialize
61
+
62
+ ```bash
63
+ bun scripts/init-gallery-manifest.ts {folder} "{title}" {slug}
64
+ ```
65
+
66
+ Creates:
67
+ - `src/data/gallery-manifests/{folder}.json` (images array, empty blocks)
68
+ - `/tmp/gallery-batches/{folder}/` (clean directory for batch files)
69
+
70
+ ### Phase 2: Batch Review
71
+
72
+ Spawn sub-agents to review images. **Each writes to its own file** (parallel-safe).
73
+
74
+ ```
75
+ For batchIndex in 0..ceil(imageCount/8):
76
+ Task(
77
+ subagent_type: "general-purpose",
78
+ description: "Review gallery batch {batchIndex}",
79
+ prompt: <see below>
80
+ )
81
+ ```
82
+
83
+ **Sub-agent prompt template:**
84
+
85
+ ```
86
+ Review batch {batchIndex} for {folder} gallery.
87
+
88
+ Read:
89
+ - Manifest: src/data/gallery-manifests/{folder}.json
90
+ - Layout guide: {plugin_base_dir}/skills/review-image-batch/references/layout-guide.md
91
+ (The plugin base directory is provided in the skill invocation header)
92
+
93
+ Images to review: indices {startImage} to {endImage}
94
+ (Calculate: startImage = batchIndex * 8, endImage = min(startImage + 7, totalImages - 1))
95
+
96
+ Workflow:
97
+ 1. Read manifest to get image filenames
98
+ 2. Read layout guide for rules
99
+ 3. View each image file with Read tool
100
+ 4. Create layout blocks using your visual judgment
101
+ 5. Write JSON to: /tmp/gallery-batches/{folder}/batch-{NN}.json
102
+ where NN = batchIndex padded to 2 digits (00, 01, 02...)
103
+ 6. Return TEXT SUMMARY ONLY
104
+
105
+ Output file format:
106
+ {
107
+ "batchIndex": {batchIndex},
108
+ "startImage": {startImage},
109
+ "endImage": {endImage},
110
+ "blocks": [
111
+ { "layout": "WideImage", "images": ["DSCF1234.jpeg"], "props": {}, "notes": "..." }
112
+ ]
113
+ }
114
+
115
+ LAYOUT PHILOSOPHY:
116
+ Apply visual judgment, not mechanical rules. A gallery needs rhythm and variety.
117
+
118
+ Single-image (WideImage, OffsetImage, InsetImage, FullBleed):
119
+ - Strong standalones, portraits, quiet moments
120
+
121
+ Multi-image (TwoUp, ThreeUp):
122
+ - Use when juxtaposition creates meaning beyond either image alone
123
+ - Apply Lyons's test: Temporal? Spatial? Formal echo? Emotional pairing? Transformation?
124
+ - A good TwoUp is BETTER than two mediocre WideImages
125
+ - A true sequence (entering→through→emerging) deserves ThreeUp
126
+
127
+ Spacer: Add breathing room after powerful images
128
+ Chapter: Insert at location/theme changes
129
+ ```
130
+
131
+ **Parallel execution:** Sub-agents can run in parallel since each writes to its own file.
132
+
133
+ ### Phase 3: Merge & Validate
134
+
135
+ After all batches complete:
136
+
137
+ ```bash
138
+ bun scripts/merge-gallery-batches.ts {folder}
139
+ bun scripts/validate-gallery-manifest.ts src/data/gallery-manifests/{folder}.json
140
+ ```
141
+
142
+ This combines all batch files and validates the result.
143
+
144
+ ### Phase 4: Global Arc Review (NEW)
145
+
146
+ Before generating, review the merged manifest for overall coherence:
147
+
148
+ 1. **Count hero moments** — If >4 FullBleeds, demote some to WideImage
149
+ 2. **Check multi-image limits** — Max 2-3 TwoUp, 1-2 ThreeUp across entire gallery
150
+ 3. **Verify rhythm** — No consecutive high-weight blocks
151
+ 4. **Identify the climax** — One clear emotional peak, not many
152
+ 5. **Working backwards** — Does the final image provide satisfying closure?
153
+
154
+ ### Phase 5: Generate
155
+
156
+ ```bash
157
+ bun scripts/generate-gallery-files.ts {folder}
158
+ ```
159
+
160
+ Creates:
161
+ - `src/data/{folder}.ts` (data file with chapters)
162
+ - `src/pages/photographing/{slug}/index.astro`
163
+ - Additional `.astro` files for each chapter (if multi-chapter)
164
+
165
+ ## Resume Protocol
166
+
167
+ If interrupted, check `/tmp/gallery-batches/{folder}/` for existing batch files:
168
+
169
+ ```bash
170
+ ls /tmp/gallery-batches/{folder}/
171
+ ```
172
+
173
+ Only run missing batches, then merge.
174
+
175
+ ## Layout Philosophy
176
+
177
+ A gallery needs **rhythm and variety** — loud moments, quiet moments, pairings that create meaning.
178
+
179
+ | Layout | Purpose |
180
+ |--------|---------|
181
+ | WideImage | Strong standalone landscapes |
182
+ | OffsetImage | Portraits, quiet moments, breathing room |
183
+ | FullBleed | Hero shots, climactic moments |
184
+ | InsetImage | Intimate details, visual whispers |
185
+ | Spacer | Pacing, section breaks |
186
+ | TwoUp | Images that speak to each other |
187
+ | ThreeUp | True sequences (entering→through→emerging) |
188
+ | SplitLayout | Asymmetric pairs, one frames the other |
189
+ | Chapter | Location/theme breaks |
190
+
191
+ ### Lyons's Juxtaposition Test
192
+
193
+ Pair images when juxtaposition creates meaning beyond either image alone:
194
+
195
+ 1. **Temporal** — Same moment, different angles
196
+ 2. **Spatial** — Same scene, complementary views
197
+ 3. **Formal echo** — Compositional rhyme (lines, shapes, colors)
198
+ 4. **Emotional** — Contrast or reinforcement
199
+ 5. **Transformation** — Together they say something neither says alone
200
+
201
+ A strong TwoUp is better than two mediocre WideImages.
202
+
203
+ ## Output
204
+
205
+ When complete:
206
+ - Gallery URL: `/photographing/{slug}/`
207
+ - Files:
208
+ - `src/data/gallery-manifests/{folder}.json`
209
+ - `src/data/{folder}.ts`
210
+ - `src/pages/photographing/{slug}/*.astro`
211
+
212
+ ## Composability
213
+
214
+ Each piece is reusable:
215
+
216
+ ```bash
217
+ # Just extract EXIF
218
+ bun scripts/init-gallery-manifest.ts photos "Photos" photos
219
+
220
+ # Just merge existing batches
221
+ bun scripts/merge-gallery-batches.ts photos
222
+
223
+ # Just regenerate pages from manifest
224
+ bun scripts/generate-gallery-files.ts photos
225
+
226
+ # Validate any manifest
227
+ bun scripts/validate-gallery-manifest.ts src/data/gallery-manifests/photos.json
228
+ ```