@olegkoval/agent-skills 1.55.3 → 1.56.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 (29) hide show
  1. package/CLAUDE.md +1 -1
  2. package/README.md +31 -7
  3. package/adapters/hermes/olko-apple-kit/README.md +9 -0
  4. package/adapters/hermes/olko-creative/README.md +6 -1
  5. package/adapters/hermes/olko-garmin-kit/README.md +8 -0
  6. package/adapters/hermes/olko-git-tools/README.md +10 -0
  7. package/adapters/hermes/olko-github-pr/README.md +20 -0
  8. package/adapters/hermes/olko-obsidian/README.md +10 -0
  9. package/adapters/hermes/olko-product/README.md +12 -0
  10. package/adapters/hermes/olko-reflection/README.md +13 -0
  11. package/adapters/hermes/olko-release/README.md +12 -0
  12. package/adapters/hermes/olko-skill-meta/README.md +15 -0
  13. package/adapters/hermes/olko-web-ops/README.md +5 -1
  14. package/catalog/skills.json +106 -53
  15. package/docs/skill-anatomy.md +1 -1
  16. package/package.json +1 -1
  17. package/plugins/olko-apple-kit/.claude-plugin/plugin.json +1 -1
  18. package/plugins/olko-creative/.claude-plugin/plugin.json +1 -1
  19. package/plugins/olko-garmin-kit/.claude-plugin/plugin.json +1 -1
  20. package/plugins/olko-git-tools/.claude-plugin/plugin.json +1 -1
  21. package/plugins/olko-github-pr/.claude-plugin/plugin.json +1 -1
  22. package/plugins/olko-obsidian/.claude-plugin/plugin.json +1 -1
  23. package/plugins/olko-product/.claude-plugin/plugin.json +1 -1
  24. package/plugins/olko-reflection/.claude-plugin/plugin.json +1 -1
  25. package/plugins/olko-release/.claude-plugin/plugin.json +1 -1
  26. package/plugins/olko-skill-meta/.claude-plugin/plugin.json +1 -1
  27. package/plugins/olko-web-ops/.claude-plugin/plugin.json +1 -1
  28. package/scripts/build-adapters.sh +4 -1
  29. package/scripts/install-hermes-symlinks.sh +118 -0
package/CLAUDE.md CHANGED
@@ -1,7 +1,7 @@
1
1
  # agent-skills
2
2
 
3
3
  An agent-agnostic skill catalog published to Claude Code, Codex, Cursor, Grok,
4
- Copilot, Windsurf and Kiro.
4
+ Copilot, Windsurf, Kiro and Hermes Agent.
5
5
 
6
6
  ## Hard rules
7
7
 
package/README.md CHANGED
@@ -1,15 +1,15 @@
1
1
  <div align="center">
2
2
  <h1>agent skills</h1>
3
- <p><strong>Agent-agnostic skill catalog for Codex, Claude, Cursor, Grok, Copilot, Windsurf, Kiro, and other skill-aware tools.</strong></p>
3
+ <p><strong>Agent-agnostic skill catalog for Codex, Claude, Cursor, Grok, Copilot, Windsurf, Kiro, Hermes Agent, and other skill-aware tools.</strong></p>
4
4
  <p>
5
5
  <img src="https://img.shields.io/badge/license-MIT-16a34a" alt="MIT license">
6
- <img src="https://img.shields.io/badge/skills-53-2563eb" alt="53 skills">
7
- <img src="https://img.shields.io/badge/platforms-Codex%20%7C%20Claude%20%7C%20Cursor%20%7C%20Grok%20%7C%20Copilot%20%7C%20Windsurf%20%7C%20Kiro-111827" alt="Codex Claude Cursor Grok Copilot Windsurf Kiro">
6
+ <img src="https://img.shields.io/badge/skills-55-2563eb" alt="55 skills">
7
+ <img src="https://img.shields.io/badge/platforms-Codex%20%7C%20Claude%20%7C%20Cursor%20%7C%20Grok%20%7C%20Copilot%20%7C%20Windsurf%20%7C%20Kiro%20%7C%20Hermes-111827" alt="Codex Claude Cursor Grok Copilot Windsurf Kiro Hermes">
8
8
  <img src="https://img.shields.io/badge/status-public%20catalog-16a34a" alt="Public catalog">
9
9
  </p>
10
10
  </div>
11
11
 
12
- Agent-agnostic skill collection for Codex, Claude, Cursor, Grok, and other skill-aware tools.
12
+ Agent-agnostic skill collection for Codex, Claude, Cursor, Grok, Hermes Agent, and other skill-aware tools.
13
13
 
14
14
  **Browse the catalog: [skills.olegkoval.com](https://skills.olegkoval.com)**
15
15
 
@@ -124,6 +124,29 @@ Use the olko:semantic-release-beta skill to add prereleases on a beta branch.
124
124
 
125
125
  </details>
126
126
 
127
+ <details>
128
+ <summary><b>Hermes Agent</b></summary>
129
+
130
+ Install the catalog into the active Hermes profile from a persistent checkout:
131
+
132
+ ```bash
133
+ git clone https://github.com/oleg-koval/agent-skills.git
134
+ cd agent-skills
135
+ ./scripts/install-hermes-symlinks.sh
136
+ ```
137
+
138
+ The installer links all 55 canonical skill packages under
139
+ `${HERMES_HOME:-$HOME/.hermes}/skills/olko-agent-skills/`. It leaves existing paths untouched and
140
+ fails on a collision. It reports obsolete catalog-owned links without removing them; after
141
+ reviewing those links, run `./scripts/install-hermes-symlinks.sh --prune` to remove them.
142
+ Set `HERMES_HOME` to target another profile. Run the installer again after adding
143
+ skills to an updated checkout, then start a new Hermes session or use `/reload-skills`.
144
+ Use `/skills` to browse or `/wrap-up` to invoke a skill; a skill with a duplicate name can
145
+ be selected by its `olko-agent-skills/<plugin>/<skill>` path.
146
+ Individual skills may still require the tools, credentials, or services named in their instructions.
147
+
148
+ </details>
149
+
127
150
  <details>
128
151
  <summary><b>Grok</b></summary>
129
152
 
@@ -477,7 +500,7 @@ layout, the first-run walkthrough, and the contract callers follow when writing
477
500
  | Grok | `adapters/grok/<plugin>/` | Per-plugin skill copies |
478
501
  | Codex | `adapters/codex/<plugin>/README.md` | Pointer to the canonical skills |
479
502
  | Pi | `adapters/pi/<plugin>/README.md` | Pointer to the canonical skills |
480
- | Hermes | `adapters/hermes/<plugin>/README.md` | Pointer to the canonical skills |
503
+ | Hermes Agent | `adapters/hermes/<plugin>/README.md` | Pointer to the canonical skills |
481
504
  | GitHub Copilot | `.github/copilot-instructions.md` | Repository instructions |
482
505
  | GitHub Copilot | `.github/prompts/*.prompt.md` | Per-skill prompt files |
483
506
  | Windsurf | `.windsurf/rules/*.md` | Cascade rules |
@@ -485,10 +508,11 @@ layout, the first-run walkthrough, and the contract callers follow when writing
485
508
 
486
509
  Every file above is generated from `catalog/skills.json` by `./scripts/build-adapters.sh`.
487
510
  Never edit one by hand: CI regenerates and fails on any difference.
511
+ The maintained `scripts/install-hermes-symlinks.sh` makes the Hermes pointers usable by its skills loader.
488
512
 
489
513
  Coverage is per skill, not uniform. Each skill's `adapters` array in `catalog/skills.json`
490
- decides which targets it ships to, so the file counts differ per target: Claude 49, Grok 47,
491
- Cursor 45, Copilot 45, Codex 42, Windsurf 35, Kiro 35, Pi 2, Hermes 2. A skill is absent from a
514
+ decides which targets it ships to, so the file counts differ per target: Claude 55, Grok 53,
515
+ Cursor 51, Copilot 51, Codex 49, Windsurf 40, Kiro 40, Pi 2, Hermes 55. A skill is absent from a
492
516
  target's tree when its catalog entry does not list that target.
493
517
 
494
518
  ## Local validation
@@ -0,0 +1,9 @@
1
+ <!-- Generated by scripts/build-adapters.sh. Do not edit directly. -->
2
+
3
+ # Hermes adapter: olko-apple-kit
4
+
5
+ Run `./scripts/install-hermes-symlinks.sh` from the repository root to link these skills
6
+ into the active Hermes profile. The canonical packages are:
7
+
8
+ - `plugins/olko-apple-kit/skills/apple-store-submit/SKILL.md`
9
+ - `plugins/olko-apple-kit/skills/macos-menubar-app/SKILL.md`
@@ -2,6 +2,11 @@
2
2
 
3
3
  # Hermes adapter: olko-creative
4
4
 
5
- Use the canonical skills directly:
5
+ Run `./scripts/install-hermes-symlinks.sh` from the repository root to link these skills
6
+ into the active Hermes profile. The canonical packages are:
6
7
 
8
+ - `plugins/olko-creative/skills/gallery/SKILL.md`
9
+ - `plugins/olko-creative/skills/fill-music-player/SKILL.md`
10
+ - `plugins/olko-creative/skills/music-to-plex/SKILL.md`
11
+ - `plugins/olko-creative/skills/vinted-listing/SKILL.md`
7
12
  - `plugins/olko-creative/skills/wikipedia-uk-editor/SKILL.md`
@@ -0,0 +1,8 @@
1
+ <!-- Generated by scripts/build-adapters.sh. Do not edit directly. -->
2
+
3
+ # Hermes adapter: olko-garmin-kit
4
+
5
+ Run `./scripts/install-hermes-symlinks.sh` from the repository root to link these skills
6
+ into the active Hermes profile. The canonical packages are:
7
+
8
+ - `plugins/olko-garmin-kit/skills/garmin-watchface/SKILL.md`
@@ -0,0 +1,10 @@
1
+ <!-- Generated by scripts/build-adapters.sh. Do not edit directly. -->
2
+
3
+ # Hermes adapter: olko-git-tools
4
+
5
+ Run `./scripts/install-hermes-symlinks.sh` from the repository root to link these skills
6
+ into the active Hermes profile. The canonical packages are:
7
+
8
+ - `plugins/olko-git-tools/skills/git-commit/SKILL.md`
9
+ - `plugins/olko-git-tools/skills/gh-cli/SKILL.md`
10
+ - `plugins/olko-git-tools/skills/branch-cleanup/SKILL.md`
@@ -0,0 +1,20 @@
1
+ <!-- Generated by scripts/build-adapters.sh. Do not edit directly. -->
2
+
3
+ # Hermes adapter: olko-github-pr
4
+
5
+ Run `./scripts/install-hermes-symlinks.sh` from the repository root to link these skills
6
+ into the active Hermes profile. The canonical packages are:
7
+
8
+ - `plugins/olko-github-pr/skills/pr-finalize/SKILL.md`
9
+ - `plugins/olko-github-pr/skills/pr-finalize-complete/SKILL.md`
10
+ - `plugins/olko-github-pr/skills/pr-to-green/SKILL.md`
11
+ - `plugins/olko-github-pr/skills/pr-description-writer/SKILL.md`
12
+ - `plugins/olko-github-pr/skills/qodoloop/SKILL.md`
13
+ - `plugins/olko-github-pr/skills/coderabbitloop/SKILL.md`
14
+ - `plugins/olko-github-pr/skills/codexloop/SKILL.md`
15
+ - `plugins/olko-github-pr/skills/copilotloop/SKILL.md`
16
+ - `plugins/olko-github-pr/skills/geminiloop/SKILL.md`
17
+ - `plugins/olko-github-pr/skills/ci-fix-loop/SKILL.md`
18
+ - `plugins/olko-github-pr/skills/nas-actions-migration/SKILL.md`
19
+ - `plugins/olko-github-pr/skills/dependabot-triage/SKILL.md`
20
+ - `plugins/olko-github-pr/skills/lekker-review/SKILL.md`
@@ -0,0 +1,10 @@
1
+ <!-- Generated by scripts/build-adapters.sh. Do not edit directly. -->
2
+
3
+ # Hermes adapter: olko-obsidian
4
+
5
+ Run `./scripts/install-hermes-symlinks.sh` from the repository root to link these skills
6
+ into the active Hermes profile. The canonical packages are:
7
+
8
+ - `plugins/olko-obsidian/skills/obsidian-pr-sync/SKILL.md`
9
+ - `plugins/olko-obsidian/skills/obsidian-task-rollover/SKILL.md`
10
+ - `plugins/olko-obsidian/skills/morning-routine/SKILL.md`
@@ -0,0 +1,12 @@
1
+ <!-- Generated by scripts/build-adapters.sh. Do not edit directly. -->
2
+
3
+ # Hermes adapter: olko-product
4
+
5
+ Run `./scripts/install-hermes-symlinks.sh` from the repository root to link these skills
6
+ into the active Hermes profile. The canonical packages are:
7
+
8
+ - `plugins/olko-product/skills/product-builder/SKILL.md`
9
+ - `plugins/olko-product/skills/mvp-oneshot/SKILL.md`
10
+ - `plugins/olko-product/skills/ux-ui-audit-loop/SKILL.md`
11
+ - `plugins/olko-product/skills/starter-rules/SKILL.md`
12
+ - `plugins/olko-product/skills/viral-launch/SKILL.md`
@@ -0,0 +1,13 @@
1
+ <!-- Generated by scripts/build-adapters.sh. Do not edit directly. -->
2
+
3
+ # Hermes adapter: olko-reflection
4
+
5
+ Run `./scripts/install-hermes-symlinks.sh` from the repository root to link these skills
6
+ into the active Hermes profile. The canonical packages are:
7
+
8
+ - `plugins/olko-reflection/skills/self-critique/SKILL.md`
9
+ - `plugins/olko-reflection/skills/review-past-performance/SKILL.md`
10
+ - `plugins/olko-reflection/skills/retro-analysis/SKILL.md`
11
+ - `plugins/olko-reflection/skills/agent-ops-retro/SKILL.md`
12
+ - `plugins/olko-reflection/skills/crash-course/SKILL.md`
13
+ - `plugins/olko-reflection/skills/wrap-up/SKILL.md`
@@ -0,0 +1,12 @@
1
+ <!-- Generated by scripts/build-adapters.sh. Do not edit directly. -->
2
+
3
+ # Hermes adapter: olko-release
4
+
5
+ Run `./scripts/install-hermes-symlinks.sh` from the repository root to link these skills
6
+ into the active Hermes profile. The canonical packages are:
7
+
8
+ - `plugins/olko-release/skills/semantic-release-beta/SKILL.md`
9
+ - `plugins/olko-release/skills/open-source-publisher/SKILL.md`
10
+ - `plugins/olko-release/skills/release-day/SKILL.md`
11
+ - `plugins/olko-release/skills/changelog-generator/SKILL.md`
12
+ - `plugins/olko-release/skills/store-listing-copy/SKILL.md`
@@ -0,0 +1,15 @@
1
+ <!-- Generated by scripts/build-adapters.sh. Do not edit directly. -->
2
+
3
+ # Hermes adapter: olko-skill-meta
4
+
5
+ Run `./scripts/install-hermes-symlinks.sh` from the repository root to link these skills
6
+ into the active Hermes profile. The canonical packages are:
7
+
8
+ - `plugins/olko-skill-meta/skills/context-repo/SKILL.md`
9
+ - `plugins/olko-skill-meta/skills/add-to-my-skills/SKILL.md`
10
+ - `plugins/olko-skill-meta/skills/skill-budget-audit/SKILL.md`
11
+ - `plugins/olko-skill-meta/skills/promptctl/SKILL.md`
12
+ - `plugins/olko-skill-meta/skills/veto-routing/SKILL.md`
13
+ - `plugins/olko-skill-meta/skills/ai-tools-setup/SKILL.md`
14
+ - `plugins/olko-skill-meta/skills/relay/SKILL.md`
15
+ - `plugins/olko-skill-meta/skills/shared-knowledge-artifact/SKILL.md`
@@ -2,6 +2,10 @@
2
2
 
3
3
  # Hermes adapter: olko-web-ops
4
4
 
5
- Use the canonical skills directly:
5
+ Run `./scripts/install-hermes-symlinks.sh` from the repository root to link these skills
6
+ into the active Hermes profile. The canonical packages are:
6
7
 
8
+ - `plugins/olko-web-ops/skills/cloudflare-block-countries/SKILL.md`
7
9
  - `plugins/olko-web-ops/skills/search-console-indexing-audit/SKILL.md`
10
+ - `plugins/olko-web-ops/skills/docs-index-keeper/SKILL.md`
11
+ - `plugins/olko-web-ops/skills/website-analytics-bootstrap/SKILL.md`
@@ -25,7 +25,8 @@
25
25
  "copilot",
26
26
  "grok",
27
27
  "windsurf",
28
- "kiro"
28
+ "kiro",
29
+ "hermes"
29
30
  ]
30
31
  },
31
32
  {
@@ -48,7 +49,8 @@
48
49
  "copilot",
49
50
  "grok",
50
51
  "windsurf",
51
- "kiro"
52
+ "kiro",
53
+ "hermes"
52
54
  ]
53
55
  },
54
56
  {
@@ -72,7 +74,8 @@
72
74
  "claude",
73
75
  "cursor",
74
76
  "copilot",
75
- "grok"
77
+ "grok",
78
+ "hermes"
76
79
  ]
77
80
  },
78
81
  {
@@ -93,7 +96,8 @@
93
96
  "claude",
94
97
  "cursor",
95
98
  "copilot",
96
- "grok"
99
+ "grok",
100
+ "hermes"
97
101
  ]
98
102
  },
99
103
  {
@@ -116,7 +120,8 @@
116
120
  "copilot",
117
121
  "grok",
118
122
  "windsurf",
119
- "kiro"
123
+ "kiro",
124
+ "hermes"
120
125
  ]
121
126
  },
122
127
  {
@@ -139,7 +144,8 @@
139
144
  "copilot",
140
145
  "grok",
141
146
  "windsurf",
142
- "kiro"
147
+ "kiro",
148
+ "hermes"
143
149
  ]
144
150
  },
145
151
  {
@@ -162,7 +168,8 @@
162
168
  "copilot",
163
169
  "grok",
164
170
  "windsurf",
165
- "kiro"
171
+ "kiro",
172
+ "hermes"
166
173
  ]
167
174
  },
168
175
  {
@@ -185,7 +192,8 @@
185
192
  "copilot",
186
193
  "grok",
187
194
  "windsurf",
188
- "kiro"
195
+ "kiro",
196
+ "hermes"
189
197
  ]
190
198
  },
191
199
  {
@@ -208,7 +216,8 @@
208
216
  "copilot",
209
217
  "grok",
210
218
  "windsurf",
211
- "kiro"
219
+ "kiro",
220
+ "hermes"
212
221
  ]
213
222
  },
214
223
  {
@@ -229,7 +238,8 @@
229
238
  "claude",
230
239
  "cursor",
231
240
  "copilot",
232
- "grok"
241
+ "grok",
242
+ "hermes"
233
243
  ]
234
244
  },
235
245
  {
@@ -250,7 +260,8 @@
250
260
  "claude",
251
261
  "cursor",
252
262
  "copilot",
253
- "grok"
263
+ "grok",
264
+ "hermes"
254
265
  ]
255
266
  },
256
267
  {
@@ -272,7 +283,8 @@
272
283
  "claude",
273
284
  "cursor",
274
285
  "copilot",
275
- "grok"
286
+ "grok",
287
+ "hermes"
276
288
  ]
277
289
  },
278
290
  {
@@ -290,7 +302,8 @@
290
302
  ],
291
303
  "adapters": [
292
304
  "codex",
293
- "claude"
305
+ "claude",
306
+ "hermes"
294
307
  ]
295
308
  }
296
309
  ]
@@ -316,7 +329,8 @@
316
329
  "copilot",
317
330
  "windsurf",
318
331
  "kiro",
319
- "grok"
332
+ "grok",
333
+ "hermes"
320
334
  ]
321
335
  },
322
336
  {
@@ -338,7 +352,8 @@
338
352
  "copilot",
339
353
  "windsurf",
340
354
  "kiro",
341
- "grok"
355
+ "grok",
356
+ "hermes"
342
357
  ]
343
358
  },
344
359
  {
@@ -359,7 +374,8 @@
359
374
  "claude",
360
375
  "cursor",
361
376
  "copilot",
362
- "grok"
377
+ "grok",
378
+ "hermes"
363
379
  ]
364
380
  }
365
381
  ]
@@ -388,7 +404,8 @@
388
404
  "copilot",
389
405
  "windsurf",
390
406
  "kiro",
391
- "grok"
407
+ "grok",
408
+ "hermes"
392
409
  ]
393
410
  },
394
411
  {
@@ -413,7 +430,8 @@
413
430
  "copilot",
414
431
  "windsurf",
415
432
  "kiro",
416
- "grok"
433
+ "grok",
434
+ "hermes"
417
435
  ]
418
436
  },
419
437
  {
@@ -438,7 +456,8 @@
438
456
  "claude",
439
457
  "cursor",
440
458
  "copilot",
441
- "grok"
459
+ "grok",
460
+ "hermes"
442
461
  ]
443
462
  },
444
463
  {
@@ -459,7 +478,8 @@
459
478
  "copilot",
460
479
  "windsurf",
461
480
  "kiro",
462
- "grok"
481
+ "grok",
482
+ "hermes"
463
483
  ]
464
484
  },
465
485
  {
@@ -484,7 +504,8 @@
484
504
  "claude",
485
505
  "cursor",
486
506
  "copilot",
487
- "grok"
507
+ "grok",
508
+ "hermes"
488
509
  ]
489
510
  }
490
511
  ]
@@ -512,7 +533,8 @@
512
533
  "copilot",
513
534
  "windsurf",
514
535
  "kiro",
515
- "grok"
536
+ "grok",
537
+ "hermes"
516
538
  ]
517
539
  },
518
540
  {
@@ -536,7 +558,8 @@
536
558
  "copilot",
537
559
  "windsurf",
538
560
  "kiro",
539
- "grok"
561
+ "grok",
562
+ "hermes"
540
563
  ]
541
564
  },
542
565
  {
@@ -560,7 +583,8 @@
560
583
  "copilot",
561
584
  "windsurf",
562
585
  "kiro",
563
- "grok"
586
+ "grok",
587
+ "hermes"
564
588
  ]
565
589
  },
566
590
  {
@@ -584,7 +608,8 @@
584
608
  "copilot",
585
609
  "windsurf",
586
610
  "kiro",
587
- "grok"
611
+ "grok",
612
+ "hermes"
588
613
  ]
589
614
  },
590
615
  {
@@ -607,7 +632,8 @@
607
632
  "copilot",
608
633
  "windsurf",
609
634
  "kiro",
610
- "grok"
635
+ "grok",
636
+ "hermes"
611
637
  ]
612
638
  }
613
639
  ]
@@ -636,7 +662,8 @@
636
662
  "copilot",
637
663
  "windsurf",
638
664
  "kiro",
639
- "grok"
665
+ "grok",
666
+ "hermes"
640
667
  ]
641
668
  },
642
669
  {
@@ -658,7 +685,8 @@
658
685
  "copilot",
659
686
  "windsurf",
660
687
  "kiro",
661
- "grok"
688
+ "grok",
689
+ "hermes"
662
690
  ]
663
691
  },
664
692
  {
@@ -676,7 +704,8 @@
676
704
  ],
677
705
  "adapters": [
678
706
  "claude",
679
- "grok"
707
+ "grok",
708
+ "hermes"
680
709
  ]
681
710
  },
682
711
  {
@@ -697,7 +726,8 @@
697
726
  "copilot",
698
727
  "windsurf",
699
728
  "kiro",
700
- "grok"
729
+ "grok",
730
+ "hermes"
701
731
  ]
702
732
  },
703
733
  {
@@ -720,7 +750,8 @@
720
750
  "copilot",
721
751
  "windsurf",
722
752
  "kiro",
723
- "grok"
753
+ "grok",
754
+ "hermes"
724
755
  ]
725
756
  },
726
757
  {
@@ -742,7 +773,8 @@
742
773
  "copilot",
743
774
  "windsurf",
744
775
  "kiro",
745
- "grok"
776
+ "grok",
777
+ "hermes"
746
778
  ]
747
779
  },
748
780
  {
@@ -758,7 +790,8 @@
758
790
  ],
759
791
  "adapters": [
760
792
  "claude",
761
- "grok"
793
+ "grok",
794
+ "hermes"
762
795
  ]
763
796
  },
764
797
  {
@@ -775,7 +808,8 @@
775
808
  "documentation"
776
809
  ],
777
810
  "adapters": [
778
- "claude"
811
+ "claude",
812
+ "hermes"
779
813
  ]
780
814
  }
781
815
  ]
@@ -802,7 +836,8 @@
802
836
  "claude",
803
837
  "cursor",
804
838
  "copilot",
805
- "grok"
839
+ "grok",
840
+ "hermes"
806
841
  ]
807
842
  },
808
843
  {
@@ -825,7 +860,8 @@
825
860
  "copilot",
826
861
  "windsurf",
827
862
  "kiro",
828
- "grok"
863
+ "grok",
864
+ "hermes"
829
865
  ]
830
866
  },
831
867
  {
@@ -849,7 +885,8 @@
849
885
  "copilot",
850
886
  "windsurf",
851
887
  "kiro",
852
- "grok"
888
+ "grok",
889
+ "hermes"
853
890
  ]
854
891
  },
855
892
  {
@@ -873,7 +910,8 @@
873
910
  "copilot",
874
911
  "windsurf",
875
912
  "kiro",
876
- "grok"
913
+ "grok",
914
+ "hermes"
877
915
  ]
878
916
  },
879
917
  {
@@ -896,7 +934,8 @@
896
934
  "copilot",
897
935
  "windsurf",
898
936
  "kiro",
899
- "grok"
937
+ "grok",
938
+ "hermes"
900
939
  ]
901
940
  },
902
941
  {
@@ -919,7 +958,8 @@
919
958
  "copilot",
920
959
  "windsurf",
921
960
  "kiro",
922
- "grok"
961
+ "grok",
962
+ "hermes"
923
963
  ]
924
964
  }
925
965
  ]
@@ -955,7 +995,8 @@
955
995
  "copilot",
956
996
  "windsurf",
957
997
  "kiro",
958
- "grok"
998
+ "grok",
999
+ "hermes"
959
1000
  ]
960
1001
  },
961
1002
  {
@@ -977,7 +1018,8 @@
977
1018
  "copilot",
978
1019
  "windsurf",
979
1020
  "kiro",
980
- "grok"
1021
+ "grok",
1022
+ "hermes"
981
1023
  ]
982
1024
  },
983
1025
  {
@@ -1000,7 +1042,8 @@
1000
1042
  "claude",
1001
1043
  "cursor",
1002
1044
  "copilot",
1003
- "grok"
1045
+ "grok",
1046
+ "hermes"
1004
1047
  ]
1005
1048
  }
1006
1049
  ]
@@ -1030,7 +1073,8 @@
1030
1073
  "copilot",
1031
1074
  "windsurf",
1032
1075
  "kiro",
1033
- "grok"
1076
+ "grok",
1077
+ "hermes"
1034
1078
  ]
1035
1079
  },
1036
1080
  {
@@ -1054,7 +1098,8 @@
1054
1098
  "copilot",
1055
1099
  "windsurf",
1056
1100
  "kiro",
1057
- "grok"
1101
+ "grok",
1102
+ "hermes"
1058
1103
  ]
1059
1104
  }
1060
1105
  ]
@@ -1083,7 +1128,8 @@
1083
1128
  "copilot",
1084
1129
  "windsurf",
1085
1130
  "kiro",
1086
- "grok"
1131
+ "grok",
1132
+ "hermes"
1087
1133
  ]
1088
1134
  }
1089
1135
  ]
@@ -1110,7 +1156,8 @@
1110
1156
  "copilot",
1111
1157
  "windsurf",
1112
1158
  "kiro",
1113
- "grok"
1159
+ "grok",
1160
+ "hermes"
1114
1161
  ]
1115
1162
  },
1116
1163
  {
@@ -1132,7 +1179,8 @@
1132
1179
  "copilot",
1133
1180
  "windsurf",
1134
1181
  "kiro",
1135
- "grok"
1182
+ "grok",
1183
+ "hermes"
1136
1184
  ]
1137
1185
  },
1138
1186
  {
@@ -1156,7 +1204,8 @@
1156
1204
  "copilot",
1157
1205
  "windsurf",
1158
1206
  "kiro",
1159
- "grok"
1207
+ "grok",
1208
+ "hermes"
1160
1209
  ]
1161
1210
  },
1162
1211
  {
@@ -1177,7 +1226,8 @@
1177
1226
  "claude",
1178
1227
  "cursor",
1179
1228
  "copilot",
1180
- "grok"
1229
+ "grok",
1230
+ "hermes"
1181
1231
  ]
1182
1232
  },
1183
1233
  {
@@ -1230,7 +1280,8 @@
1230
1280
  "copilot",
1231
1281
  "windsurf",
1232
1282
  "kiro",
1233
- "grok"
1283
+ "grok",
1284
+ "hermes"
1234
1285
  ]
1235
1286
  },
1236
1287
  {
@@ -1277,7 +1328,8 @@
1277
1328
  "copilot",
1278
1329
  "windsurf",
1279
1330
  "kiro",
1280
- "grok"
1331
+ "grok",
1332
+ "hermes"
1281
1333
  ]
1282
1334
  },
1283
1335
  {
@@ -1300,7 +1352,8 @@
1300
1352
  "copilot",
1301
1353
  "windsurf",
1302
1354
  "kiro",
1303
- "grok"
1355
+ "grok",
1356
+ "hermes"
1304
1357
  ]
1305
1358
  }
1306
1359
  ]
@@ -145,7 +145,7 @@ Current adapter targets:
145
145
  | `windsurf` | n/a | `.windsurf/rules/{name}.md` |
146
146
  | `kiro` | n/a | `.kiro/steering/{name}.md` |
147
147
 
148
- Adapter coverage is not uniform across the catalog; a skill only ships the adapters listed in its `adapters` array in `catalog/skills.json`. As of this writing: claude 49, grok 47, cursor 45, copilot 45, codex 42, windsurf 35, kiro 35, pi 2, hermes 2 (out of 49 canonical skills).
148
+ Adapter coverage is not uniform across the catalog; a skill only ships the adapters listed in its `adapters` array in `catalog/skills.json`. Current coverage: claude 55, grok 53, cursor 51, copilot 51, codex 49, windsurf 40, kiro 40, pi 2, hermes 55 (out of 55 canonical skills). Hermes uses `scripts/install-hermes-symlinks.sh` to expose the canonical packages to its skills loader.
149
149
 
150
150
  Claude plugin and marketplace identifiers must be kebab-case. Keep `olko:*` names for Codex and Cursor lookup names, but do not use colons or spaces in Claude marketplace/plugin names.
151
151
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@olegkoval/agent-skills",
3
- "version": "1.55.3",
3
+ "version": "1.56.0",
4
4
  "private": false,
5
5
  "publishConfig": {
6
6
  "access": "public"
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "olko-apple-kit",
3
3
  "description": "Build and ship Apple platform apps: macOS menubar apps, App Store submissions.",
4
- "version": "1.55.3",
4
+ "version": "1.56.0",
5
5
  "author": {
6
6
  "name": "Oleg Koval"
7
7
  },
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "olko-creative",
3
3
  "description": "Creative and personal projects: photo galleries, music players, listings, wiki editing.",
4
- "version": "1.55.3",
4
+ "version": "1.56.0",
5
5
  "author": {
6
6
  "name": "Oleg Koval"
7
7
  },
@@ -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.55.3",
4
+ "version": "1.56.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.55.3",
4
+ "version": "1.56.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.55.3",
4
+ "version": "1.56.0",
5
5
  "author": {
6
6
  "name": "Oleg Koval"
7
7
  },
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "olko-obsidian",
3
3
  "description": "Keep an Obsidian vault in sync with work: PR sync, task rollover, morning routine.",
4
- "version": "1.55.3",
4
+ "version": "1.56.0",
5
5
  "author": {
6
6
  "name": "Oleg Koval"
7
7
  },
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "olko-product",
3
3
  "description": "Take a product idea to a shippable build: MVP passes, full-stack scaffolds, UX/UI quality loops, launch plans.",
4
- "version": "1.55.3",
4
+ "version": "1.56.0",
5
5
  "author": {
6
6
  "name": "Oleg Koval"
7
7
  },
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "olko-reflection",
3
3
  "description": "Look back and improve: self-critique, retrospectives, performance review, rapid learning.",
4
- "version": "1.55.3",
4
+ "version": "1.56.0",
5
5
  "author": {
6
6
  "name": "Oleg Koval"
7
7
  },
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "olko-release",
3
3
  "description": "Ship a release: semantic-release setup, changelogs, store listing copy, release-day routine.",
4
- "version": "1.55.3",
4
+ "version": "1.56.0",
5
5
  "author": {
6
6
  "name": "Oleg Koval"
7
7
  },
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "olko-skill-meta",
3
3
  "description": "Author and maintain agent skills and the AI toolchain itself.",
4
- "version": "1.55.3",
4
+ "version": "1.56.0",
5
5
  "author": {
6
6
  "name": "Oleg Koval"
7
7
  },
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "olko-web-ops",
3
3
  "description": "Operate a website: WAF rules, search console audits, analytics bootstrap, docs indexes.",
4
- "version": "1.55.3",
4
+ "version": "1.56.0",
5
5
  "author": {
6
6
  "name": "Oleg Koval"
7
7
  },
@@ -135,7 +135,10 @@ for (const skill of catalog.skills) {
135
135
  mkdirSync(dir, { recursive: true })
136
136
  writeFileSync(join(dir, 'README.md'), [
137
137
  generatedHeader, '', `# ${label} adapter: ${skill.plugin.name}`, '',
138
- 'Use the canonical skills directly:', '',
138
+ ...(target === 'hermes'
139
+ ? ['Run `./scripts/install-hermes-symlinks.sh` from the repository root to link these skills',
140
+ 'into the active Hermes profile. The canonical packages are:', '']
141
+ : ['Use the canonical skills directly:', '']),
139
142
  ...skill.plugin.skills.filter((s) => s.adapters.includes(target))
140
143
  .map((s) => `- \`${s.path}/SKILL.md\``),
141
144
  '',
@@ -0,0 +1,118 @@
1
+ #!/bin/sh
2
+ set -eu
3
+
4
+ HERMES_SKILLS_DIR="${HERMES_HOME:-$HOME/.hermes}/skills"
5
+ case "$HERMES_SKILLS_DIR" in
6
+ /*) ;;
7
+ *) HERMES_SKILLS_DIR="$PWD/$HERMES_SKILLS_DIR" ;;
8
+ esac
9
+ case "${1:-}" in
10
+ "") HERMES_PRUNE=0 ;;
11
+ --prune) HERMES_PRUNE=1 ;;
12
+ *) echo "usage: $0 [--prune]" >&2; exit 2 ;;
13
+ esac
14
+ test "$#" -le 1 || { echo "usage: $0 [--prune]" >&2; exit 2; }
15
+ # shellcheck disable=SC1007 # CDPATH= intentionally clears CDPATH before cd.
16
+ ROOT="$(CDPATH= cd -- "$(dirname -- "$0")/.." && pwd)"
17
+
18
+ cd "$ROOT"
19
+ HERMES_SKILLS_DIR="$HERMES_SKILLS_DIR" HERMES_PRUNE="$HERMES_PRUNE" node --input-type=module <<'EOF'
20
+ import { lstatSync, mkdirSync, readdirSync, readlinkSync, symlinkSync, unlinkSync } from 'node:fs'
21
+ import { basename, dirname, join, relative, resolve, sep } from 'node:path'
22
+ import { loadCatalog } from './scripts/lib/catalog.mjs'
23
+
24
+ const root = process.cwd()
25
+ const destination = join(process.env.HERMES_SKILLS_DIR, 'olko-agent-skills')
26
+ const entries = loadCatalog().skills
27
+ .filter(skill => skill.adapters.includes('hermes'))
28
+ .map(skill => ({
29
+ target: join(root, skill.path),
30
+ link: join(destination, skill.plugin.name, skill.name),
31
+ }))
32
+
33
+ const existing = path => {
34
+ try { return lstatSync(path) }
35
+ catch (error) {
36
+ if (error.code === 'ENOENT') return null
37
+ throw error
38
+ }
39
+ }
40
+ const isExpectedLink = (link, target) => {
41
+ const stat = existing(link)
42
+ return stat?.isSymbolicLink() && resolve(dirname(link), readlinkSync(link)) === target
43
+ }
44
+ const isManagedLink = link => {
45
+ if (!existing(link)?.isSymbolicLink()) return false
46
+ const target = resolve(dirname(link), readlinkSync(link))
47
+ const parts = relative(root, target).split(sep)
48
+ return parts.length === 4 && parts[0] === 'plugins' && parts[2] === 'skills'
49
+ && parts[1] === basename(dirname(link)) && parts[3] === basename(link)
50
+ }
51
+
52
+ // Inspect every destination before writing anything. Never replace user-owned paths.
53
+ for (const parent of [destination, ...new Set(entries.map(entry => dirname(entry.link)))]) {
54
+ const stat = existing(parent)
55
+ if (stat && (!stat.isDirectory() || stat.isSymbolicLink())) {
56
+ throw new Error(`refusing to use non-directory or symlinked parent: ${parent}`)
57
+ }
58
+ }
59
+ for (const { target, link } of entries) {
60
+ const stat = existing(link)
61
+ if (stat && !isExpectedLink(link, target)) {
62
+ throw new Error(`refusing to replace existing skill path: ${link}`)
63
+ }
64
+ }
65
+
66
+ const wanted = new Set(entries.map(entry => entry.link))
67
+ const stale = []
68
+ if (existing(destination)) {
69
+ for (const plugin of readdirSync(destination, { withFileTypes: true })) {
70
+ if (!plugin.isDirectory()) continue
71
+ const pluginDir = join(destination, plugin.name)
72
+ for (const skill of readdirSync(pluginDir)) {
73
+ const link = join(pluginDir, skill)
74
+ if (!wanted.has(link) && isManagedLink(link)) stale.push(link)
75
+ }
76
+ }
77
+ }
78
+ if (stale.length && process.env.HERMES_PRUNE !== '1') {
79
+ throw new Error(`${stale.length} stale catalog-owned link(s) found; inspect them and rerun with --prune to remove them`)
80
+ }
81
+
82
+ let linked = 0
83
+ const created = []
84
+ try {
85
+ for (const { target, link } of entries) {
86
+ if (existing(link)) {
87
+ if (!isExpectedLink(link, target)) throw new Error(`refusing to replace existing skill path: ${link}`)
88
+ continue
89
+ }
90
+ mkdirSync(dirname(link), { recursive: true })
91
+ try {
92
+ symlinkSync(target, link, 'dir')
93
+ } catch (error) {
94
+ if (error.code === 'EEXIST' && isExpectedLink(link, target)) continue
95
+ throw error
96
+ }
97
+ const stat = lstatSync(link)
98
+ created.push({ link, target, dev: stat.dev, ino: stat.ino })
99
+ linked++
100
+ }
101
+ } catch (error) {
102
+ for (const { link, target, dev, ino } of created.reverse()) {
103
+ const stat = existing(link)
104
+ if (stat?.dev === dev && stat?.ino === ino && isExpectedLink(link, target)) unlinkSync(link)
105
+ }
106
+ throw error
107
+ }
108
+ let pruned = 0
109
+ if (process.env.HERMES_PRUNE === '1') {
110
+ for (const link of stale) {
111
+ if (isManagedLink(link)) {
112
+ unlinkSync(link)
113
+ pruned++
114
+ }
115
+ }
116
+ }
117
+ console.log(`Hermes skills: ${entries.length} available, ${linked} linked, ${entries.length - linked} already linked, ${pruned} pruned`)
118
+ EOF