@olegkoval/agent-skills 1.35.3 → 1.37.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 (185) hide show
  1. package/.github/copilot-instructions.md +1 -0
  2. package/.github/prompts/music-to-plex.prompt.md +251 -0
  3. package/.kiro/steering/music-to-plex.md +250 -0
  4. package/.windsurf/rules/music-to-plex.md +249 -0
  5. package/README.md +12 -2
  6. package/adapters/claude/olko-creative/skills/music-to-plex/SKILL.md +255 -0
  7. package/adapters/claude/olko-creative/skills/music-to-plex/references/bandcamp-album-identification.md +29 -0
  8. package/adapters/claude/olko-creative/skills/music-to-plex/references/batch-import-staging.md +23 -0
  9. package/adapters/claude/olko-creative/skills/music-to-plex/references/canonical-artist-normalization.md +24 -0
  10. package/adapters/claude/olko-creative/skills/music-to-plex/references/cover-art-and-plexamp.md +22 -0
  11. package/adapters/claude/olko-creative/skills/music-to-plex/references/cover-art-repair-session.md +34 -0
  12. package/adapters/claude/olko-creative/skills/music-to-plex/references/cover-art-sourcing-session.md +23 -0
  13. package/adapters/claude/olko-creative/skills/music-to-plex/references/dj-tracklist-crate-ingest.md +184 -0
  14. package/adapters/claude/olko-creative/skills/music-to-plex/references/duplicate-torrent-handling.md +19 -0
  15. package/adapters/claude/olko-creative/skills/music-to-plex/references/fallback-audio-validation-and-nas-preflight.md +42 -0
  16. package/adapters/claude/olko-creative/skills/music-to-plex/references/gear-change-image-identification.md +35 -0
  17. package/adapters/claude/olko-creative/skills/music-to-plex/references/image-driven-identification-and-verification.md +19 -0
  18. package/adapters/claude/olko-creative/skills/music-to-plex/references/library-repair-folders.md +22 -0
  19. package/adapters/claude/olko-creative/skills/music-to-plex/references/malformed-flac-fallbacks.md +11 -0
  20. package/adapters/claude/olko-creative/skills/music-to-plex/references/manual-fallback-transfer-and-plex-verification.md +39 -0
  21. package/adapters/claude/olko-creative/skills/music-to-plex/references/mtp-bot-bulk-state-safety.md +21 -0
  22. package/adapters/claude/olko-creative/skills/music-to-plex/references/mtp-subprocess-wrapper.md +13 -0
  23. package/adapters/claude/olko-creative/skills/music-to-plex/references/music-note-blurb-order.md +38 -0
  24. package/adapters/claude/olko-creative/skills/music-to-plex/references/nas-import-and-refresh.md +16 -0
  25. package/adapters/claude/olko-creative/skills/music-to-plex/references/nas-library-layout-and-write-preflight.md +31 -0
  26. package/adapters/claude/olko-creative/skills/music-to-plex/references/nas-permissions-and-plex-traversal.md +26 -0
  27. package/adapters/claude/olko-creative/skills/music-to-plex/references/nas-routing-and-refresh.md +22 -0
  28. package/adapters/claude/olko-creative/skills/music-to-plex/references/no-result-album-fallback.md +28 -0
  29. package/adapters/claude/olko-creative/skills/music-to-plex/references/per-track-album-art-split.md +12 -0
  30. package/adapters/claude/olko-creative/skills/music-to-plex/references/plex-playlist-append-and-verify.md +18 -0
  31. package/adapters/claude/olko-creative/skills/music-to-plex/references/plex-playlist-creation.md +21 -0
  32. package/adapters/claude/olko-creative/skills/music-to-plex/references/plex-token-source.md +20 -0
  33. package/adapters/claude/olko-creative/skills/music-to-plex/references/plex-visibility-check.md +28 -0
  34. package/adapters/claude/olko-creative/skills/music-to-plex/references/practice-crate-playlist.md +18 -0
  35. package/adapters/claude/olko-creative/skills/music-to-plex/references/session-2026-06-17-synology-probe.md +13 -0
  36. package/adapters/claude/olko-creative/skills/music-to-plex/references/torrent-stall-fallback.md +62 -0
  37. package/adapters/claude/olko-creative/skills/music-to-plex/references/verification-and-pitfalls.md +17 -0
  38. package/adapters/claude/olko-creative/skills/music-to-plex/references/youtube-403-fallbacks.md +17 -0
  39. package/adapters/claude/olko-creative/skills/music-to-plex/references/youtube-full-album-fallback.md +34 -0
  40. package/adapters/claude/olko-creative/skills/music-to-plex/references/youtube-lineage-playlist-fallback.md +33 -0
  41. package/adapters/claude/olko-creative/skills/music-to-plex/references/youtube-playlist-import.md +50 -0
  42. package/adapters/claude/olko-creative/skills/music-to-plex/references/youtube-track-resolution-heuristics.md +23 -0
  43. package/adapters/claude/olko-creative/skills/music-to-plex/references/zero-track-playlist-recovery.md +21 -0
  44. package/adapters/claude/olko-github-pr/skills/lekker-review/SKILL.md +44 -0
  45. package/adapters/claude/olko-github-pr/skills/lekker-review/references/agents/quality.md +18 -0
  46. package/adapters/claude/olko-github-pr/skills/lekker-review/references/agents/simplification.md +29 -0
  47. package/adapters/claude/olko-github-pr/skills/lekker-review/references/output-format.md +30 -0
  48. package/adapters/codex/olko-creative/README.md +1 -0
  49. package/adapters/cursor/olko-creative/skills/music-to-plex/SKILL.md +255 -0
  50. package/adapters/cursor/olko-creative/skills/music-to-plex/references/bandcamp-album-identification.md +29 -0
  51. package/adapters/cursor/olko-creative/skills/music-to-plex/references/batch-import-staging.md +23 -0
  52. package/adapters/cursor/olko-creative/skills/music-to-plex/references/canonical-artist-normalization.md +24 -0
  53. package/adapters/cursor/olko-creative/skills/music-to-plex/references/cover-art-and-plexamp.md +22 -0
  54. package/adapters/cursor/olko-creative/skills/music-to-plex/references/cover-art-repair-session.md +34 -0
  55. package/adapters/cursor/olko-creative/skills/music-to-plex/references/cover-art-sourcing-session.md +23 -0
  56. package/adapters/cursor/olko-creative/skills/music-to-plex/references/dj-tracklist-crate-ingest.md +184 -0
  57. package/adapters/cursor/olko-creative/skills/music-to-plex/references/duplicate-torrent-handling.md +19 -0
  58. package/adapters/cursor/olko-creative/skills/music-to-plex/references/fallback-audio-validation-and-nas-preflight.md +42 -0
  59. package/adapters/cursor/olko-creative/skills/music-to-plex/references/gear-change-image-identification.md +35 -0
  60. package/adapters/cursor/olko-creative/skills/music-to-plex/references/image-driven-identification-and-verification.md +19 -0
  61. package/adapters/cursor/olko-creative/skills/music-to-plex/references/library-repair-folders.md +22 -0
  62. package/adapters/cursor/olko-creative/skills/music-to-plex/references/malformed-flac-fallbacks.md +11 -0
  63. package/adapters/cursor/olko-creative/skills/music-to-plex/references/manual-fallback-transfer-and-plex-verification.md +39 -0
  64. package/adapters/cursor/olko-creative/skills/music-to-plex/references/mtp-bot-bulk-state-safety.md +21 -0
  65. package/adapters/cursor/olko-creative/skills/music-to-plex/references/mtp-subprocess-wrapper.md +13 -0
  66. package/adapters/cursor/olko-creative/skills/music-to-plex/references/music-note-blurb-order.md +38 -0
  67. package/adapters/cursor/olko-creative/skills/music-to-plex/references/nas-import-and-refresh.md +16 -0
  68. package/adapters/cursor/olko-creative/skills/music-to-plex/references/nas-library-layout-and-write-preflight.md +31 -0
  69. package/adapters/cursor/olko-creative/skills/music-to-plex/references/nas-permissions-and-plex-traversal.md +26 -0
  70. package/adapters/cursor/olko-creative/skills/music-to-plex/references/nas-routing-and-refresh.md +22 -0
  71. package/adapters/cursor/olko-creative/skills/music-to-plex/references/no-result-album-fallback.md +28 -0
  72. package/adapters/cursor/olko-creative/skills/music-to-plex/references/per-track-album-art-split.md +12 -0
  73. package/adapters/cursor/olko-creative/skills/music-to-plex/references/plex-playlist-append-and-verify.md +18 -0
  74. package/adapters/cursor/olko-creative/skills/music-to-plex/references/plex-playlist-creation.md +21 -0
  75. package/adapters/cursor/olko-creative/skills/music-to-plex/references/plex-token-source.md +20 -0
  76. package/adapters/cursor/olko-creative/skills/music-to-plex/references/plex-visibility-check.md +28 -0
  77. package/adapters/cursor/olko-creative/skills/music-to-plex/references/practice-crate-playlist.md +18 -0
  78. package/adapters/cursor/olko-creative/skills/music-to-plex/references/session-2026-06-17-synology-probe.md +13 -0
  79. package/adapters/cursor/olko-creative/skills/music-to-plex/references/torrent-stall-fallback.md +62 -0
  80. package/adapters/cursor/olko-creative/skills/music-to-plex/references/verification-and-pitfalls.md +17 -0
  81. package/adapters/cursor/olko-creative/skills/music-to-plex/references/youtube-403-fallbacks.md +17 -0
  82. package/adapters/cursor/olko-creative/skills/music-to-plex/references/youtube-full-album-fallback.md +34 -0
  83. package/adapters/cursor/olko-creative/skills/music-to-plex/references/youtube-lineage-playlist-fallback.md +33 -0
  84. package/adapters/cursor/olko-creative/skills/music-to-plex/references/youtube-playlist-import.md +50 -0
  85. package/adapters/cursor/olko-creative/skills/music-to-plex/references/youtube-track-resolution-heuristics.md +23 -0
  86. package/adapters/cursor/olko-creative/skills/music-to-plex/references/zero-track-playlist-recovery.md +21 -0
  87. package/adapters/grok/olko-creative/skills/music-to-plex/SKILL.md +255 -0
  88. package/adapters/grok/olko-creative/skills/music-to-plex/references/bandcamp-album-identification.md +29 -0
  89. package/adapters/grok/olko-creative/skills/music-to-plex/references/batch-import-staging.md +23 -0
  90. package/adapters/grok/olko-creative/skills/music-to-plex/references/canonical-artist-normalization.md +24 -0
  91. package/adapters/grok/olko-creative/skills/music-to-plex/references/cover-art-and-plexamp.md +22 -0
  92. package/adapters/grok/olko-creative/skills/music-to-plex/references/cover-art-repair-session.md +34 -0
  93. package/adapters/grok/olko-creative/skills/music-to-plex/references/cover-art-sourcing-session.md +23 -0
  94. package/adapters/grok/olko-creative/skills/music-to-plex/references/dj-tracklist-crate-ingest.md +184 -0
  95. package/adapters/grok/olko-creative/skills/music-to-plex/references/duplicate-torrent-handling.md +19 -0
  96. package/adapters/grok/olko-creative/skills/music-to-plex/references/fallback-audio-validation-and-nas-preflight.md +42 -0
  97. package/adapters/grok/olko-creative/skills/music-to-plex/references/gear-change-image-identification.md +35 -0
  98. package/adapters/grok/olko-creative/skills/music-to-plex/references/image-driven-identification-and-verification.md +19 -0
  99. package/adapters/grok/olko-creative/skills/music-to-plex/references/library-repair-folders.md +22 -0
  100. package/adapters/grok/olko-creative/skills/music-to-plex/references/malformed-flac-fallbacks.md +11 -0
  101. package/adapters/grok/olko-creative/skills/music-to-plex/references/manual-fallback-transfer-and-plex-verification.md +39 -0
  102. package/adapters/grok/olko-creative/skills/music-to-plex/references/mtp-bot-bulk-state-safety.md +21 -0
  103. package/adapters/grok/olko-creative/skills/music-to-plex/references/mtp-subprocess-wrapper.md +13 -0
  104. package/adapters/grok/olko-creative/skills/music-to-plex/references/music-note-blurb-order.md +38 -0
  105. package/adapters/grok/olko-creative/skills/music-to-plex/references/nas-import-and-refresh.md +16 -0
  106. package/adapters/grok/olko-creative/skills/music-to-plex/references/nas-library-layout-and-write-preflight.md +31 -0
  107. package/adapters/grok/olko-creative/skills/music-to-plex/references/nas-permissions-and-plex-traversal.md +26 -0
  108. package/adapters/grok/olko-creative/skills/music-to-plex/references/nas-routing-and-refresh.md +22 -0
  109. package/adapters/grok/olko-creative/skills/music-to-plex/references/no-result-album-fallback.md +28 -0
  110. package/adapters/grok/olko-creative/skills/music-to-plex/references/per-track-album-art-split.md +12 -0
  111. package/adapters/grok/olko-creative/skills/music-to-plex/references/plex-playlist-append-and-verify.md +18 -0
  112. package/adapters/grok/olko-creative/skills/music-to-plex/references/plex-playlist-creation.md +21 -0
  113. package/adapters/grok/olko-creative/skills/music-to-plex/references/plex-token-source.md +20 -0
  114. package/adapters/grok/olko-creative/skills/music-to-plex/references/plex-visibility-check.md +28 -0
  115. package/adapters/grok/olko-creative/skills/music-to-plex/references/practice-crate-playlist.md +18 -0
  116. package/adapters/grok/olko-creative/skills/music-to-plex/references/session-2026-06-17-synology-probe.md +13 -0
  117. package/adapters/grok/olko-creative/skills/music-to-plex/references/torrent-stall-fallback.md +62 -0
  118. package/adapters/grok/olko-creative/skills/music-to-plex/references/verification-and-pitfalls.md +17 -0
  119. package/adapters/grok/olko-creative/skills/music-to-plex/references/youtube-403-fallbacks.md +17 -0
  120. package/adapters/grok/olko-creative/skills/music-to-plex/references/youtube-full-album-fallback.md +34 -0
  121. package/adapters/grok/olko-creative/skills/music-to-plex/references/youtube-lineage-playlist-fallback.md +33 -0
  122. package/adapters/grok/olko-creative/skills/music-to-plex/references/youtube-playlist-import.md +50 -0
  123. package/adapters/grok/olko-creative/skills/music-to-plex/references/youtube-track-resolution-heuristics.md +23 -0
  124. package/adapters/grok/olko-creative/skills/music-to-plex/references/zero-track-playlist-recovery.md +21 -0
  125. package/catalog/skills.json +33 -9
  126. package/package.json +1 -1
  127. package/plugins/olko-apple-kit/.claude-plugin/plugin.json +1 -1
  128. package/plugins/olko-creative/.claude-plugin/plugin.json +1 -1
  129. package/plugins/olko-creative/skills/music-to-plex/SKILL.md +254 -0
  130. package/plugins/olko-creative/skills/music-to-plex/references/bandcamp-album-identification.md +29 -0
  131. package/plugins/olko-creative/skills/music-to-plex/references/batch-import-staging.md +23 -0
  132. package/plugins/olko-creative/skills/music-to-plex/references/canonical-artist-normalization.md +24 -0
  133. package/plugins/olko-creative/skills/music-to-plex/references/cover-art-and-plexamp.md +22 -0
  134. package/plugins/olko-creative/skills/music-to-plex/references/cover-art-repair-session.md +34 -0
  135. package/plugins/olko-creative/skills/music-to-plex/references/cover-art-sourcing-session.md +23 -0
  136. package/plugins/olko-creative/skills/music-to-plex/references/dj-tracklist-crate-ingest.md +184 -0
  137. package/plugins/olko-creative/skills/music-to-plex/references/duplicate-torrent-handling.md +19 -0
  138. package/plugins/olko-creative/skills/music-to-plex/references/fallback-audio-validation-and-nas-preflight.md +42 -0
  139. package/plugins/olko-creative/skills/music-to-plex/references/gear-change-image-identification.md +35 -0
  140. package/plugins/olko-creative/skills/music-to-plex/references/image-driven-identification-and-verification.md +19 -0
  141. package/plugins/olko-creative/skills/music-to-plex/references/library-repair-folders.md +22 -0
  142. package/plugins/olko-creative/skills/music-to-plex/references/malformed-flac-fallbacks.md +11 -0
  143. package/plugins/olko-creative/skills/music-to-plex/references/manual-fallback-transfer-and-plex-verification.md +39 -0
  144. package/plugins/olko-creative/skills/music-to-plex/references/mtp-bot-bulk-state-safety.md +21 -0
  145. package/plugins/olko-creative/skills/music-to-plex/references/mtp-subprocess-wrapper.md +13 -0
  146. package/plugins/olko-creative/skills/music-to-plex/references/music-note-blurb-order.md +38 -0
  147. package/plugins/olko-creative/skills/music-to-plex/references/nas-import-and-refresh.md +16 -0
  148. package/plugins/olko-creative/skills/music-to-plex/references/nas-library-layout-and-write-preflight.md +31 -0
  149. package/plugins/olko-creative/skills/music-to-plex/references/nas-permissions-and-plex-traversal.md +26 -0
  150. package/plugins/olko-creative/skills/music-to-plex/references/nas-routing-and-refresh.md +22 -0
  151. package/plugins/olko-creative/skills/music-to-plex/references/no-result-album-fallback.md +28 -0
  152. package/plugins/olko-creative/skills/music-to-plex/references/per-track-album-art-split.md +12 -0
  153. package/plugins/olko-creative/skills/music-to-plex/references/plex-playlist-append-and-verify.md +18 -0
  154. package/plugins/olko-creative/skills/music-to-plex/references/plex-playlist-creation.md +21 -0
  155. package/plugins/olko-creative/skills/music-to-plex/references/plex-token-source.md +20 -0
  156. package/plugins/olko-creative/skills/music-to-plex/references/plex-visibility-check.md +28 -0
  157. package/plugins/olko-creative/skills/music-to-plex/references/practice-crate-playlist.md +18 -0
  158. package/plugins/olko-creative/skills/music-to-plex/references/session-2026-06-17-synology-probe.md +13 -0
  159. package/plugins/olko-creative/skills/music-to-plex/references/torrent-stall-fallback.md +62 -0
  160. package/plugins/olko-creative/skills/music-to-plex/references/verification-and-pitfalls.md +17 -0
  161. package/plugins/olko-creative/skills/music-to-plex/references/youtube-403-fallbacks.md +17 -0
  162. package/plugins/olko-creative/skills/music-to-plex/references/youtube-full-album-fallback.md +34 -0
  163. package/plugins/olko-creative/skills/music-to-plex/references/youtube-lineage-playlist-fallback.md +33 -0
  164. package/plugins/olko-creative/skills/music-to-plex/references/youtube-playlist-import.md +50 -0
  165. package/plugins/olko-creative/skills/music-to-plex/references/youtube-track-resolution-heuristics.md +23 -0
  166. package/plugins/olko-creative/skills/music-to-plex/references/zero-track-playlist-recovery.md +21 -0
  167. package/plugins/olko-garmin-kit/.claude-plugin/plugin.json +1 -1
  168. package/plugins/olko-git-tools/.claude-plugin/plugin.json +1 -1
  169. package/plugins/olko-github-pr/.claude-plugin/plugin.json +1 -1
  170. package/plugins/olko-github-pr/skills/lekker-review/README.md +60 -0
  171. package/plugins/olko-github-pr/skills/lekker-review/SKILL.md +44 -0
  172. package/plugins/olko-github-pr/skills/lekker-review/assets/poster-overview.html +204 -0
  173. package/plugins/olko-github-pr/skills/lekker-review/assets/poster-overview.png +0 -0
  174. package/plugins/olko-github-pr/skills/lekker-review/assets/poster-proof.html +199 -0
  175. package/plugins/olko-github-pr/skills/lekker-review/assets/poster-proof.png +0 -0
  176. package/plugins/olko-github-pr/skills/lekker-review/references/agents/quality.md +18 -0
  177. package/plugins/olko-github-pr/skills/lekker-review/references/agents/simplification.md +29 -0
  178. package/plugins/olko-github-pr/skills/lekker-review/references/output-format.md +30 -0
  179. package/plugins/olko-obsidian/.claude-plugin/plugin.json +1 -1
  180. package/plugins/olko-product/.claude-plugin/plugin.json +1 -1
  181. package/plugins/olko-reflection/.claude-plugin/plugin.json +1 -1
  182. package/plugins/olko-release/.claude-plugin/plugin.json +1 -1
  183. package/plugins/olko-skill-meta/.claude-plugin/plugin.json +1 -1
  184. package/plugins/olko-web-ops/.claude-plugin/plugin.json +1 -1
  185. package/scripts/lib/catalog.mjs +1 -1
@@ -0,0 +1,34 @@
1
+ # YouTube full-album fallback salvage
2
+
3
+ Use this when RuTracker / Download Station fails and the only practical source is a YouTube full-album upload.
4
+
5
+ ## Pattern observed
6
+
7
+ - `yt-dlp` can pull a clean album source, but uploader metadata is often garbage.
8
+ - Treat the first download as a source artifact, not Plex-ready media.
9
+ - Validate tags with `ffprobe` or `mutagen` before any organize step.
10
+
11
+ ## Repair flow
12
+
13
+ 1. Download the upload at highest audio quality.
14
+ 2. Inspect embedded metadata immediately.
15
+ 3. If the output is one long FLAC, split it into tracks using album track timings.
16
+ 4. Retag each track with canonical artist, album, year, tracknumber, and tracktotal.
17
+ 5. Embed official cover art, not the YouTube thumbnail.
18
+ 6. Move the repaired album into the final NAS music path.
19
+ 7. Refresh Plex only after the final path exists.
20
+ 8. Verify the album appears in Plex search.
21
+
22
+ ## NAS transfer workaround
23
+
24
+ When `rsync` or `scp` fights remote path quoting, use a tar pipe instead:
25
+
26
+ ```bash
27
+ cd /local/staging && tar -cf - *.flac | ssh user@nas 'cd "/volume1/music/.../Release" && tar -xf -'
28
+ ```
29
+
30
+ If macOS leaves AppleDouble sidecar files on the NAS, remove `._*` before refresh.
31
+
32
+ ## Session note
33
+
34
+ For `Ozzy Osbourne - Diary Of A Madman (1981)`, the fallback source was a YouTube full-album upload. The tracks were downloaded to FLAC, retagged, cover art embedded, copied into `/volume1/music/metal/Ozzy Osbourne/Diary Of A Madman (1981)`, AppleDouble files removed, and Plex refreshed with `mtp refresh --path`.
@@ -0,0 +1,33 @@
1
+ # YouTube-only lineage playlist fallback
2
+
3
+ Use when the user wants a new DJ crate or playlist based on mood/lineage rather than a formal release request, and the intended path is YouTube track finding/downloading only.
4
+
5
+ ## Trigger
6
+
7
+ - The user says things like "check this message and create new playlist" and provides lane/feeling language instead of a single album.
8
+ - The brief is built from references, influences, or lineage tags such as "classic deep house DNA", "modern disco/deep house revival", "jazzy/warm cuts", or a left-field closer.
9
+ - The task is explicitly on the YouTube branch, not a tracker or store purchase flow.
10
+
11
+ ## Pattern
12
+
13
+ 1. Convert the message into a small set of lanes first.
14
+ 2. Pick 1-3 anchor artists or canonical tracks per lane.
15
+ 3. Search exact titles with `yt-dlp`/YouTube query strings before broadening the search.
16
+ 4. Prefer official or Topic uploads, then the cleanest stable upload with the closest duration and metadata match.
17
+ 5. Assemble a local crate manifest, tracklist, and playlist file.
18
+ 6. Verify the files exist and the playlist content matches the intended lane order.
19
+
20
+ ## Curation notes
21
+
22
+ - Keep the middle of the set mix-friendly.
23
+ - Use the final lane for the emotional curveball or taste-flex closer.
24
+ - If the user explicitly says the branch is YouTube-only, do not route through tracker/search paths for acquisition.
25
+ - If Spotify or another catalog route is unavailable, skip it and continue with the YouTube branch instead of stalling.
26
+
27
+ ## File outputs
28
+
29
+ - `00_MANIFEST.json`
30
+ - `00_TRACKLIST.md`
31
+ - `00_PLAYLIST.m3u8`
32
+
33
+ This reference is session-derived but the pattern is reusable for future YouTube-only crate builds.
@@ -0,0 +1,50 @@
1
+ # YouTube-first playlist import for MTP
2
+
3
+ Use this flow when the user gives a YouTube playlist URL or a plain track list and wants it landed in Plex.
4
+
5
+ ## Input shapes
6
+ - Playlist URL
7
+ - Plain list of `Artist - Title` lines
8
+
9
+ If only a track list is provided, resolve each track on YouTube first, then download in album/sequence order.
10
+
11
+ ## Download + staging
12
+ Use max-quality audio extraction and preserve ordering with explicit numbering:
13
+
14
+ ```bash
15
+ yt-dlp -x --audio-format flac --audio-quality 0 \
16
+ --write-thumbnail --convert-thumbnails jpg --embed-thumbnail \
17
+ --add-metadata \
18
+ -o "/tmp/mtp_youtube_crates/<crate>/work/raw/%(playlist_index)02d - %(title)s.%(ext)s" \
19
+ "<youtube-url>"
20
+ ```
21
+
22
+ Notes:
23
+ - Keep a manifest with index, source URL, resolved artist/title, and final filename.
24
+ - For VA / DJ-style sets, keep track order stable even if metadata is messy.
25
+ - If a title needs cleanup, fix it in tags, not by renaming out of sequence.
26
+
27
+ ## Import into Plex
28
+ - Copy the finalized files into the NAS import path that Plex scans for the music section.
29
+ - Trigger a library scan after the copy.
30
+ - Create a normal Plex playlist from the imported track rating keys in the exact source order.
31
+
32
+ ## Verification
33
+ Prefer proof over assumptions:
34
+ - Check Plex scanner logs for `Added new metadata item` / `Loaded metadata for ...` on each track.
35
+ - Confirm the imported track by querying Plex search directly and inspecting the returned `ratingKey`, `title`, `originalTitle`, and `parentTitle`.
36
+ - For playlist verification, read the playlist back and enumerate items in order.
37
+
38
+ ## Plex metadata quirks
39
+ - For compilation-style sets, Plex often shows `grandparentTitle=Various Artists`.
40
+ - The displayed `title` may be the track title, while `originalTitle` carries the artist.
41
+ - Search by both artist and title when matching imported tracks.
42
+ - If a search query misses a track, try the cleaned title and artist separately.
43
+
44
+ ## Session-proven pattern
45
+ The Deep Lineage Set import worked by:
46
+ 1. staging 8 FLAC tracks from YouTube,
47
+ 2. copying the final files into a Plex-scanned NAS import directory,
48
+ 3. refreshing Plex,
49
+ 4. creating a playlist in the source order,
50
+ 5. verifying all 8 items and their order.
@@ -0,0 +1,23 @@
1
+ # YouTube track resolution heuristics
2
+
3
+ Use this when a user gives a plain `Artist - Title` list and wants it turned into a Plex playlist.
4
+
5
+ ## Search pattern
6
+ - Run `yt-dlp --flat-playlist --dump-json "ytsearch5:<artist> <title>"` for each line.
7
+ - Keep the source order from the user list. Never reorder by search result rank.
8
+
9
+ ## Scoring
10
+ Prefer results with:
11
+ 1. exact title match,
12
+ 2. artist match in the channel/uploader name,
13
+ 3. `Topic` channel or official upload,
14
+ 4. clean metadata over remix/edit clutter.
15
+
16
+ ## Pitfalls
17
+ - The first search hit is often wrong for house/disco catalog cuts.
18
+ - If the user only gives a vibe list and not a playlist name, derive a short title from the theme, then ask once before creating the Plex playlist.
19
+ - For compilation-style uploads, check both title and channel before deciding.
20
+
21
+ ## Verification
22
+ - After download, confirm each track title still maps to the intended line.
23
+ - When building the Plex playlist, read it back and verify item order matches the source list.
@@ -0,0 +1,21 @@
1
+ # Zero-track playlist recovery
2
+
3
+ Use this when Plex shows a playlist shell but the track list is empty or `0 tracks`.
4
+
5
+ ## What it means
6
+
7
+ - The playlist object exists.
8
+ - The import likely failed to attach playable items, or the items have not been indexed yet.
9
+ - Do not treat the playlist as done until Plex returns leaf items.
10
+
11
+ ## Recovery order
12
+
13
+ 1. Read back the playlist with `GET /playlists/<id>/items`.
14
+ 2. Confirm the returned leaf count matches the source track count.
15
+ 3. Compare the returned order with the intended playlist order.
16
+ 4. If the playlist is still empty, re-check the source track `ratingKey` list before trying another create.
17
+ 5. If the UI says `0 tracks` but the API returns items, trust the API and let PlexAmp refresh.
18
+
19
+ ## Rule
20
+
21
+ A playlist is only imported when the API read-back shows the expected number of items and order. The UI tile alone is not proof.
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "olko-garmin-kit",
3
3
  "description": "Build, test and publish Garmin Connect IQ watch faces.",
4
- "version": "1.35.3",
4
+ "version": "1.37.0",
5
5
  "author": {
6
6
  "name": "Oleg Koval"
7
7
  },
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "olko-git-tools",
3
3
  "description": "Everyday git and GitHub CLI operations: conventional commits, branch hygiene.",
4
- "version": "1.35.3",
4
+ "version": "1.37.0",
5
5
  "author": {
6
6
  "name": "Oleg Koval"
7
7
  },
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "olko-github-pr",
3
3
  "description": "Drive GitHub pull requests to merge-ready: review-bot loops, CI fixes, descriptions, dependency triage.",
4
- "version": "1.35.3",
4
+ "version": "1.37.0",
5
5
  "author": {
6
6
  "name": "Oleg Koval"
7
7
  },
@@ -0,0 +1,60 @@
1
+ # lekker-review
2
+
3
+ FAANG-quality PR code review for GitHub. It gathers the context a human reviewer
4
+ would gather and checks the branch out into an isolated worktree when the depth
5
+ requires one. `scan` runs two triage agents without a verifier. `medium` and
6
+ `deep` run five specialists and attempt proofs for at most five non-rule
7
+ Critical findings.
8
+
9
+ ![lekker-review at a glance](assets/poster-overview.png)
10
+
11
+ ## Why it is not a checklist reviewer
12
+
13
+ Most review tooling reports whatever the model believed on its first pass.
14
+ This skill spends most of its budget trying to disprove itself.
15
+
16
+ ![How findings are proved](assets/poster-proof.png)
17
+
18
+ - **Adversarial verification.** `medium` sends non-rule Criticals through an
19
+ independent verifier's five-challenge refutation; `deep` also sends
20
+ Importants. `scan` does not run verifiers.
21
+ - **Proof of bug.** In `medium` and `deep`, up to five non-rule Criticals are
22
+ sent to prover agents that attempt to write and run a failing test. A proof
23
+ that comes back green is counter-evidence: the finding is downgraded or
24
+ explicitly justified, never quietly kept.
25
+ - **Hard-rule exemption.** A finding tagged with a `rule` keeps Critical
26
+ severity and skips verification, because the verifier asks runtime-failure
27
+ questions that a standards violation can never answer.
28
+ - **Fix mode.** `--fix` has one agent edit each file, a read-only verifier read
29
+ the real `git diff`, and the captured proof re-run. If the proof stays red the
30
+ group is reverted. Nothing is pushed without explicit confirmation.
31
+
32
+ ## Requirements
33
+
34
+ Claude Code only. The review pipeline needs the Workflow tool for multi-agent
35
+ orchestration and the Artifact tool for the living review page. `git` and an
36
+ authenticated `gh` are required.
37
+
38
+ ## Setup
39
+
40
+ `references/house-rules.md` ships as a template. Replace its example rules with
41
+ your team's own non-negotiables, the ones that should always be Critical
42
+ regardless of review depth. The skill has no hard rules of its own: everything
43
+ blocking comes from that file.
44
+
45
+ ## Usage
46
+
47
+ ```text
48
+ lekker-review https://github.com/owner/repo/pull/123
49
+ lekker-review owner/repo 123 deep --post
50
+ lekker-review owner/repo 123 --fix
51
+ ```
52
+
53
+ Depth is auto-selected from the diff size when you do not name one: `scan` under
54
+ 150 changed lines and 5 files, `deep` over 800 changed lines or 25 files or when
55
+ the diff touches migrations or `*.sql`, `medium` otherwise.
56
+
57
+ ## Regenerating the posters
58
+
59
+ The posters are self-contained HTML in `assets/`. Open either file in a browser
60
+ at a 1280x720 viewport and screenshot it to regenerate the PNG.
@@ -329,6 +329,50 @@ anchors. Apply your own judgment to every finding.
329
329
  - Pre-existing code not touched by this diff
330
330
  - Anything you are not confident about - omit rather than hedge
331
331
 
332
+ **Approval standard.** The verdict answers "does this definitely improve the
333
+ codebase's health", not "is this how I would have written it". Perfect code does
334
+ not exist. `✅ LGTM - ship it` is the right call for a change that improves
335
+ health and violates no hard rule, even with open Observations or Idiomatic
336
+ findings. Reserve `🚫 Needs work` for an unfixed Critical, a hard-rule
337
+ violation, or an Important finding that changes external behaviour or data
338
+ shape. Never manufacture a Critical to justify a verdict, and never block on
339
+ taste.
340
+
341
+ **PR sizing.** Judge how much a reviewer must hold at once, not the raw diff
342
+ count:
343
+ - Under ~300 changed lines, or larger but one logical change: no finding.
344
+ - Over ~800 changed lines spanning more than one logical change: `important`,
345
+ and name the split. Pick the strategy that fits - stack (sequential
346
+ dependencies), by file group (different reviewers), horizontal (shared code
347
+ and stubs first, then consumers), vertical (smaller full-stack slices).
348
+ - A diff that both refactors existing code and adds new behaviour: `important`
349
+ at any size. Those are two PRs, and bundling them hides the real change.
350
+ - A change that pushes a single file past ~1000 total lines with no
351
+ decomposition: `observation`. Ask for the extraction first, then the feature.
352
+ Exempt: whole-file deletions and mechanical or automated refactors, where the
353
+ reviewer verifies intent rather than every line.
354
+
355
+ **Verify the verification.** Read the PR body for the author's verification
356
+ story: which tests were run, whether the build passed, whether it was exercised
357
+ manually, screenshots for a UI change, a before/after for a behaviour or
358
+ performance change. A non-trivial PR whose body claims nothing about
359
+ verification is an `observation` naming the evidence that is missing. `CI: ✅
360
+ All passing` is not a verification story - it only says the suite that already
361
+ existed still runs.
362
+
363
+ **Rationalizations to reject.** If one of these is the reason a finding is about
364
+ to be dropped or softened, keep the finding:
365
+
366
+ | Rationalization | Reality |
367
+ |---|---|
368
+ | "The tests pass, so it's fine" | Tests do not catch architecture, security, or data-shape problems. |
369
+ | "It works, that's good enough" | Working code that is unreadable or insecure is debt that compounds. |
370
+ | "The refactor makes it cleaner" | Relocating complexity is not reducing it. Count the concepts a reader holds. |
371
+ | "It's only a small addition to this file" | Judge the resulting structure, not the diff size. |
372
+ | "It's just a version bump" | A bump is a behaviour change nobody in the PR wrote. |
373
+ | "They'll clean it up later" | Later does not come. Require it now, or require a ticket. |
374
+ | "An agent wrote it, so it's probably fine" | Generated code needs more scrutiny, not less: it is confident and plausible when wrong. |
375
+
332
376
  **Idiomatic & Consistency exception:** the conventions agent raises non-blocking
333
377
  suggestions ONLY when a concrete better pattern provably already exists in the
334
378
  codebase. Never on taste alone. These land in their own section, not in
@@ -0,0 +1,204 @@
1
+ <!doctype html>
2
+ <html lang="en">
3
+ <head>
4
+ <meta charset="utf-8">
5
+ <meta name="viewport" content="width=1280, initial-scale=1">
6
+ <title>Lekker Review Overview</title>
7
+ <style>
8
+ * { box-sizing: border-box; }
9
+ html, body { width: 1280px; height: 720px; margin: 0; overflow: hidden; }
10
+ body {
11
+ color: #e8e8e8;
12
+ background: radial-gradient(circle at 0 0, rgba(255, 200, 60, 0.05), transparent 38%), #0d0d0d;
13
+ font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif;
14
+ }
15
+ .poster {
16
+ width: 1280px;
17
+ height: 720px;
18
+ padding: 40px;
19
+ display: grid;
20
+ grid-template-rows: 62px 38px 220px 128px 60px 22px;
21
+ gap: 16px;
22
+ align-content: space-between;
23
+ overflow: hidden;
24
+ }
25
+ h1 {
26
+ margin: 0 0 8px;
27
+ color: #f5c542;
28
+ font: 700 30px/1 ui-monospace, "SFMono-Regular", Menlo, monospace;
29
+ letter-spacing: 0.06em;
30
+ }
31
+ .subtitle { margin: 0; color: #9a9a9a; font-size: 15px; line-height: 1.35; white-space: nowrap; }
32
+ .pipeline { display: flex; align-items: center; gap: 8px; min-width: 0; }
33
+ .step {
34
+ height: 38px;
35
+ padding: 0 13px;
36
+ display: flex;
37
+ align-items: center;
38
+ justify-content: center;
39
+ color: #9a9a9a;
40
+ background: #161616;
41
+ border: 1px solid #2c2c2c;
42
+ border-radius: 8px;
43
+ font: 13px/1 ui-monospace, "SFMono-Regular", Menlo, monospace;
44
+ white-space: nowrap;
45
+ }
46
+ .step.hot { color: #f5c542; border-color: #f5c542; }
47
+ .arrow { flex: 0 0 auto; color: #555; font: 15px/1 ui-monospace, "SFMono-Regular", Menlo, monospace; }
48
+ .cards { display: flex; gap: 16px; min-width: 0; }
49
+ .card {
50
+ flex: 1 1 0;
51
+ min-width: 0;
52
+ height: 220px;
53
+ padding: 16px;
54
+ background: #161616;
55
+ border: 1px solid #262626;
56
+ border-radius: 10px;
57
+ overflow: hidden;
58
+ }
59
+ .kicker {
60
+ margin: 0 0 8px;
61
+ color: #f5c542;
62
+ font: 700 11px/1.2 ui-monospace, "SFMono-Regular", Menlo, monospace;
63
+ letter-spacing: 0.11em;
64
+ text-transform: uppercase;
65
+ }
66
+ h2 { margin: 0 0 14px; font-size: 19px; line-height: 1.1; font-weight: 600; }
67
+ .claims { display: grid; gap: 9px; }
68
+ .claim { margin: 0; color: #9a9a9a; font-size: 12.5px; line-height: 1.38; }
69
+ .panel {
70
+ padding: 14px 16px;
71
+ background: #161616;
72
+ border: 1px solid #262626;
73
+ border-radius: 10px;
74
+ overflow: hidden;
75
+ }
76
+ .panel-title {
77
+ margin: 0 0 10px;
78
+ color: #f5c542;
79
+ font: 700 11px/1 ui-monospace, "SFMono-Regular", Menlo, monospace;
80
+ letter-spacing: 0.11em;
81
+ }
82
+ .severity-row { display: flex; flex-wrap: wrap; gap: 10px; min-width: 0; margin-bottom: 10px; }
83
+ .chip {
84
+ flex: 1 1 0;
85
+ min-width: 0;
86
+ padding: 7px 10px;
87
+ color: #8a8a8a;
88
+ background: #1e1e1e;
89
+ border: 1px solid #2c2c2c;
90
+ border-radius: 6px;
91
+ font: 11.5px/1.15 ui-monospace, "SFMono-Regular", Menlo, monospace;
92
+ white-space: normal;
93
+ }
94
+ .chip strong { color: #e8e8e8; font-weight: 700; }
95
+ .chip.critical { color: #f0dcdc; background: #a35c60; border-color: #a35c60; }
96
+ .chip.critical strong { color: #f0dcdc; }
97
+ .rule { margin: 0; color: #e8e8e8; font-size: 12.5px; line-height: 1.25; font-weight: 600; }
98
+ .statement {
99
+ display: flex;
100
+ align-items: center;
101
+ color: #e8e8e8;
102
+ font-size: 18px;
103
+ line-height: 1.2;
104
+ font-weight: 600;
105
+ }
106
+ footer {
107
+ display: flex;
108
+ align-items: end;
109
+ justify-content: space-between;
110
+ color: #6a6a6a;
111
+ font: 11.5px/1 ui-monospace, "SFMono-Regular", Menlo, monospace;
112
+ white-space: nowrap;
113
+ }
114
+ </style>
115
+ </head>
116
+ <body>
117
+ <main class="poster">
118
+ <header>
119
+ <h1>LEKKER REVIEW</h1>
120
+ <p class="subtitle">Depth selects two triage agents or five specialists; verification follows depth. Nothing is pushed without confirmation.</p>
121
+ </header>
122
+
123
+ <section class="pipeline" aria-label="Review pipeline">
124
+ <div class="step">parse input</div><span class="arrow">→</span>
125
+ <div class="step">context + worktree</div><span class="arrow">→</span>
126
+ <div class="step">review agents</div><span class="arrow">→</span>
127
+ <div class="step hot">verify + prove</div><span class="arrow">→</span>
128
+ <div class="step">synthesize</div><span class="arrow">→</span>
129
+ <div class="step">fix / post</div>
130
+ </section>
131
+
132
+ <section class="cards" aria-label="Review agents">
133
+ <article class="card">
134
+ <p class="kicker">AGENT 01</p>
135
+ <h2>Quality</h2>
136
+ <div class="claims">
137
+ <p class="claim">Business logic</p>
138
+ <p class="claim">Data integrity and security</p>
139
+ <p class="claim">Error handling and scalability</p>
140
+ <p class="claim">Pre-existing code stays out of scope</p>
141
+ </div>
142
+ </article>
143
+ <article class="card">
144
+ <p class="kicker">AGENT 02</p>
145
+ <h2>Implementation</h2>
146
+ <div class="claims">
147
+ <p class="claim">Integration contracts</p>
148
+ <p class="claim">Migration safety</p>
149
+ <p class="claim">CI failures feed Critical findings</p>
150
+ <p class="claim">External behavior and data shape</p>
151
+ </div>
152
+ </article>
153
+ <article class="card">
154
+ <p class="kicker">AGENT 03</p>
155
+ <h2>Simplification</h2>
156
+ <div class="claims">
157
+ <p class="claim">Count reader-held concepts</p>
158
+ <p class="claim">Relocating is not reducing</p>
159
+ <p class="claim">Split refactor from behavior</p>
160
+ <p class="claim">Ignore 2-3 duplicated lines</p>
161
+ </div>
162
+ </article>
163
+ <article class="card">
164
+ <p class="kicker">AGENT 04</p>
165
+ <h2>Conventions</h2>
166
+ <div class="claims">
167
+ <p class="claim">Existing precedent required</p>
168
+ <p class="claim">Cite the precedent</p>
169
+ <p class="claim">Taste alone is dropped</p>
170
+ <p class="claim">Idiomatic findings never block</p>
171
+ </div>
172
+ </article>
173
+ <article class="card">
174
+ <p class="kicker">AGENT 05</p>
175
+ <h2>Test Quality</h2>
176
+ <div class="claims">
177
+ <p class="claim">Coverage verdict</p>
178
+ <p class="claim">Mutation-slip risk</p>
179
+ <p class="claim">Mock smells and gaps</p>
180
+ <p class="claim">Would tests catch a regression?</p>
181
+ </div>
182
+ </article>
183
+ </section>
184
+
185
+ <section class="panel" aria-label="Severity tiers">
186
+ <p class="panel-title">SEVERITY</p>
187
+ <div class="severity-row">
188
+ <div class="chip critical"><strong>Critical</strong> / blocks the merge</div>
189
+ <div class="chip"><strong>Important</strong> / should fix</div>
190
+ <div class="chip"><strong>Observation</strong> / worth raising</div>
191
+ <div class="chip"><strong>Idiomatic</strong> / cited precedent</div>
192
+ </div>
193
+ <p class="rule">Critical and Important cover real failure risk; adopter-defined hard-rule violations also remain Critical. No nitpicking.</p>
194
+ </section>
195
+
196
+ <div class="statement">Approve when the change definitely improves codebase health, violates no hard rule, and leaves only non-blocking findings.</div>
197
+
198
+ <footer>
199
+ <span>AUTO: SCAN additions+deletions &lt;150 AND ≤5 files · DEEP &gt;800 OR &gt;25 files OR migrations/ OR *.sql · MEDIUM otherwise</span>
200
+ <span>lekker-review</span>
201
+ </footer>
202
+ </main>
203
+ </body>
204
+ </html>