Skip to content

feat(registry): full width Skill page with a file explorer - #335

Merged
harlan-zw merged 19 commits into
mainfrom
proto/skill-explorer
Sep 30, 2026
Merged

harlan-zw merged 19 commits into
mainfrom
proto/skill-explorer

Conversation

@harlan-zw

@harlan-zw harlan-zw commented Sep 30, 2026 •

Copy link
Copy Markdown
Collaborator

❓ Type of change

  • 👌 Enhancement

📚 Description

This started from a look at upm.sh's package page. The Skill page had two problems. First, it sat in a 1024px column. Second, the right rail stacked nine sections: Use it, Files, License, Topics, Capability, Provenance, History, Checks and the badge. Files came fourth below 1536px and had no sizes. The header said "Updated yesterday", which was the repository push date, while Provenance said "updated 8 months ago" for SKILL.md.

Layout:

  • The header keeps its 1024px column. The body below is full width up to 1680px. From 1280px, Files sits on the left, the Skill in the middle (up to 56rem), and a slim rail on the right. Between 1024 and 1279px there are two columns.
  • The right rail keeps what a visitor acts on: "Run once off", then "Install as a Skill" with tabs for Local agent, Claude and ChatGPT, then what the Skill can do. History sits under the files on the left. Checks, provenance, capability detail, topics and the badge sit under the Skill. Related Skills keep the 1024px width.
  • Claude and ChatGPT on the web take a Skill as an uploaded ZIP. The browser builds that ZIP from raw GitHub files at the pinned commit. skilld serves no bytes, and fflate loads only on click.
  • The file tree lists folders first, collapsed, then SKILL.md, with LICENSE last.
  • A Skill that is only SKILL.md drops the explorer.

Taken from upm:

  • The file tree has sizes and folder counts. On mobile it opens from the viewer bar.
  • One sticky viewer bar (pdf › reference.md · 16.3 KB · source · copy · raw) replaces three stacked rows.
  • The header has chips for files, size, license, SKILL.md date, GitHub and checks. The license chip opens LICENSE when there is one.
  • @4e6907a sits next to the name, in upm's version slot.
  • A star trend with week and month, from 1024px up. Stars, because VISION rules out installs as a signal.
  • Context cost in tokens, shown beside the open file. For SKILL.md it lists always (name and description), when used (the body) and on demand (Markdown and data files). A reference file says it loads on demand, and a script says only its output enters context. This is our version of install size.

It also fixes two bugs that are on production:

  • Links inside SKILL.md opened with the whole /gh/.../-/ route as the file path.
  • Skill card descriptions in the shared list never clamped, because block overrode line-clamp. On a phone the cards ran past the screen edge.

Open questions:

  • GLOSSARY bans "use once" for run. If "Run once off" stays, GLOSSARY needs the descriptor added.
  • "tokens", "always", "when used", "on demand" are new UI words, and none is in GLOSSARY. Is "context cost" the right name for the concept?
  • Tokens are estimated as bytes ÷ 4, shown with ≈. Is that enough, or do we want a tokenizer count at sync time?
  • fix(registry): render Skill file deep links #338 fixes /-/ deep links and edits SkillFileTreeNode.vue too, so whichever merges second needs a small conflict fix. After both merge, opening a file can update the URL.

🤖 AI disclosure: Harlan Agent Kit modified this description. My AI open-source policy.

The Skill page buried its files: below 1536px the tree sat fourth in the
rail with no sizes, and the header showed the repository push date while
Provenance showed the SKILL.md date. Borrowed from upm.sh's package page:
the tree now sits under Use it with sizes, one sticky viewer bar replaces
three stacked header rows, and the header carries fact chips, the commit
SHA, and a star trend. Context cost in tokens per loading stage is the
Skill equivalent of install size.
The tokens label took the width the third cell needed, so it wrapped without its divider.
A 16 KB reference file put its sideways scrollbar at the very bottom of the page. Code files keep their line breaks and still scroll.
@harlan-zw

Copy link
Copy Markdown
Collaborator Author

Checked in a local dev server against production Skill data (anthropics/skills/pdf), since CI has no browser check for this page:

  • Opening reference.md from the tree updates the breadcrumb, size, and highlighted row. The source toggle shows the Markdown wrapped.
  • The viewer bar stays pinned under the site header while a long file scrolls.
  • At 390px the files button in the viewer bar opens the tree. The page has no horizontal scroll.
Before After
Before After
File opened, source view Mobile files popover
Source view Mobile files

Opening a file from deep inside a long SKILL.md left the new file mid-page. Folder rows now say how many files they hold, since a collapsed scripts folder gave no hint of its size.
Review of the prototype found:
- The token tooltips opened on hover only.
- The late star trend shifted the header between 768 and 890px.
- Scoped chip CSS beat the warning tone.
- Rose text fell to 3.76:1.
- Server-rewritten links opened with the whole route as the file path.

The token stages now open one popover that explains the loading model.
A sentence licence such as "Complete terms in LICENSE.txt" was cut to
"Complete terms in LICEN…". The breadcrumb cut the file name before the
folder name. The extension beside the size repeated the file name.
The page sat in a 1024px column, and the rail stacked nine sections, most
of them reference data. From 1280px, files sit on the left and the Skill
in the middle. The right rail keeps only what a visitor acts on: run,
install, and what the Skill can do. Checks, provenance, capability
detail, history, topics, and the badge move under the Skill. A Skill that
is only SKILL.md drops the explorer and takes the width.
@harlan-zw harlan-zw changed the title feat(registry): add file explorer and context cost to Skill pages feat(registry): full width Skill page with a file explorer Sep 30, 2026
Only the body below the header needs the desktop width. The header reads as one block, and at full width it spread into the corners.
A row of "≈111 always · ≈1.9k when used" in the header needed a popover
to make sense. The viewer now says what the open file costs: SKILL.md
lists the three loading stages, a reference file says it loads on demand,
and a script says only its output enters context. LICENSE no longer
counts as an on-demand file.
Review feedback on the wide layout:
- The file tree lists folders first, collapsed, then SKILL.md. LICENSE
  goes last.
- The rail drops its "Use it" heading. It shows run, then install as the
  opt-in, with History below.
- The checks chip opens the checks it links to.
- Related Skills keep their contained width.
- The description stops at two lines behind "more".

Related card descriptions never clamped: `block` overrode the display
that line-clamp needs, and the phone grid track grew to the full width of
the truncated names.
"Run" as a bare heading lost the point of the block. "Hand it to your agent" says what to do, and one full-width outline button gives it the weight. The session labels repeated what the blurbs already say.
Run's main difference from install is that it leaves nothing behind. "This session only" now leads its blurb in the rail and in the mobile tabs. GLOSSARY bans "use once" and "ephemeral", so the wording stays with session.
- History moves to the left column, under the files. On smaller screens
  it follows the Skill.
- The official badge set 10px text on solid rose and could not be read.
  It is now an outlined chip at 12px.
- "Check it worked" leaves the command panel.
# Conflicts:
#	layers/registry/app/components/SkillFileTreeNode.vue
Claude and ChatGPT on the web take a Skill as an uploaded ZIP. skilld had
no download, so those users had no install path. The rail now has
"Run once off" and "Install as a Skill", with tabs for Local agent,
Claude, and ChatGPT. The browser builds the ZIP from raw GitHub files at
the pinned commit, so skilld serves no bytes and pays no Worker time.
fflate loads on click. A row of monochrome agent marks shows that run
works in any agent. The homepage and this page now share one logo list.
A /-/<file> link rendered a separate bare page. It now renders the Skill
page with that file open, on the server. It stays noindex, and its
canonical points at the Skill. Opening a file on the Skill page updates
the address bar to that file's link with replaceState, so the link can
be shared, and nothing remounts.
- A failed file stuck the ZIP button at "Packing 5 of 12" until reload.
  The first failure now aborts the other fetches.
- Back or a client navigation to a file link showed SKILL.md. The file
  fetch finishes after setup, so it now applies when it lands. A missing
  file answers 404.
- The rail comes before the Skill in the markup. Run takes 22 Tab presses
  instead of 59.
- Light mode: the warning chip and the stale provenance line fell under
  4.5:1.
- The tree dropped tree roles it had no arrow keys for. It marks the open
  file with aria-current, and long names wrap.
- A single-file Skill lines up with the header.
- "Local agent" became "Terminal": GLOSSARY uses local as a source status.
@harlan-zw
harlan-zw marked this pull request as ready for review September 30, 2026 16:33
@harlan-zw
harlan-zw merged commit f1455be into main Sep 30, 2026
5 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant