Methodology

Skills, For Real

I called them skills. The runtime never did. Three iterations, one cutover commit, and 46 markdown fragments finally became something a fresh agent could actually discover.

Methodology5 min read

I — The folder that lied to me

For months, my repo had a folder it called a skills folder.

It looked like a skill library. It read like a skill library. It even shipped four production Marketplace apps.

There was just one problem.

Nothing in it was actually a skill.

No runtime auto-discovered any of it. The filenames were wrong. The metadata fields were wrong. The location was wrong. Every single file violated the agentskills.io spec — quietly, invisibly, and 46 times in a row.

The illusion held because this repo's commands knew exactly where to look. The day I tried installing the same files in a fresh agent session elsewhere, the trick collapsed: empty available-skills listing. Skill tool refusing to invoke. Four shipped apps' worth of knowledge, structurally dead.

II — The bake-off

Three attempts. Two screenshots. One survivor.

One bag, terse names
Attempt 01 · ✕

Single plugin, every skill at the top with bare names — auth, client, pages, setup. Killed on first read: install-all-or-nothing, and the bare names collided across domains.

Five-plugin marketplace
Attempt 02 · ✕

Split by domain — content-sdk / marketplace-sdk / blok / sitecoreai / sitecore-setup. Looked tidy. The first CLI listing screenshot ended the conversation: bare names, no context, four different auths.

One plugin, prefix-clustered
Shipped · ✓

Single sitecore plugin, 46 flat folders, domain-prefixed names. Sortable, scannable, collision-free. The CLI listing finally read like a table of contents.

The lesson hiding inside the bake-off: when the loader refuses to give you nested folders, the prefix sort is the directory hierarchy.

III — The before / after

BEFORE
46
fragments
called “skills”
0
actually
auto-discoverable
copies in flight
(per project snapshot)
?
which copy
is canonical?
AFTER
46
real skills
in one plugin
5
domain prefixes
(content-sdk · marketplace-sdk · blok · sitecoreai · setup)
1
install command
per consumer
0
stale
copies

IV — The cutover

Half-migrated is worse than not migrated. So the move was atomic.

The cutover · 2026-05-01

One commit. Two repos. Zero stragglers.

A single atomic move from in-repo skills to a published plugin.

The plugin became canonical and the local source tree disappeared on the same day. Nobody had to remember to clean up later.

  • Orchestration rewired in one pass — every place that used to read a local skill file was rewritten to invoke the published plugin. Every command, every agent, every rule, in the same commit.
  • Local source tree deleted — same commit. No grace period. Stale copies are bugs waiting to happen.
  • Wrapper sync re-run — the Claude Code and Cursor mirrors picked up the new shape automatically with no second commit.
  • Dual distribution — Claude Code plugin for this repo’s agents; a CLI installer for Cursor, Codex, Cline, and Gemini CLI consumers. One source of truth, every audience.

V — The proof

Three throwaway reruns, the same week. Full pipeline, fresh scaffolds, no lifelines.

3
products rerun
against the plugin
28
Skill tool
invocations
0
invocation
failures
8
fold-back
patches captured

The friction loop finally compounded the right way. A patch from PageShot v1 landed in the published Agent skill. PageShot v2 picked it up automatically. No copy-paste. No re-discovery. The first build paid for the second.

VI — The takeaways

Hook 01

If it doesn’t announce itself, it’s not a skill.

Open a fresh session. Look at the available-skills listing. If your file isn’t there, it’s domain knowledge in costume — no matter how skill-shaped the markdown reads.

Hook 02

Naming is the architecture.

Flat loaders turn the prefix sort into the directory hierarchy. A long, domain-prefixed name isn’t verbose — it’s self-organising.

Hook 03

Whiteboards lie. CLI listings don’t.

Two of three packaging shapes looked right on paper. Both died the moment a real install + a real listing happened. The screenshot is the spec.

Hook 04

Migrate atomically — or don’t.

One commit. Every consumer rewired, the old source tree deleted, and the wrapper sync re-run together. The worst possible state is half-migrated and nothing failing loudly.

Hook 05

One channel strands half your audience.

The Claude Code plugin reaches this repo’s agents. The CLI installer reaches Cursor, Codex, Cline, and Gemini CLI. Dual-channel makes the same skill file portable everywhere with zero duplication.

Hook 06

Move the patch surface. Watch it compound.

Before: every patch copy-pasted into per-project snapshots that started rotting on contact. After: patches accrue in one published plugin, and every future install gets them for free.

Related case studies

PageShot

PageShot

A one-button screenshot panel inside the SitecoreAI Pages editor — built end-to-end against a real iframe, real OAuth, and a real Agent API.

Case StudyMarketplaceSitecoreAI
QuickCopy

QuickCopy

Five copy buttons and a share-link split — the second Marketplace product through the agentic pipeline, built end-to-end on the patches PageShot left behind.

Case StudyMarketplaceSitecoreAI
Component Atlas

Component Atlas

A live, tenant-wide view of where every rendering and datasource is used — running entirely in the Pages iframe with no backend and no persisted index.

Case StudyMarketplaceSitecoreAI
Lessons learnedLast-Edit Trail

Last-Edit Trail

A Page Context Panel that shows the last 5 versions of the active page in the current language — newest-first, with age and (when surfaced) author. "git log for this page" instead of a Slack ping.

Case StudyMarketplaceSitecoreAI