skills-portfolio-scaffold

Core

Set up a skills portfolio repo with categorized, ranked, sortable skills — the meta-skill for publishing portfolios.

Category: Meta Tier: Broadly empowering, nearly any user benefits Source: Newly authored Updated: 2026-07-20

What it does

The agent asks what you want your portfolio called, then creates a portfolio repo structure for your skills: a monorepo with one directory per skill, a that serves as the single source of truth (for both humans and agents), a sortable static site, CI validation, and a Hallmark-quality README. This is the meta-skill that reproduces the portfolio structure so anyone can publish their own skills the same way — under their own name, not a clone of this one.

How an agent uses it

  • The user wants to publish their own Hermes skills as a portfolio.
  • The user wants a structured, categorized, ranked collection of skills (not just a flat directory).
  • The user wants their skills to be discoverable by both humans (sortable site) and agents (structured index).
  • The user says "set up a skills portfolio", "I want to publish my skills", or "make my skills installable".

What you get

Install this skill and your Hermes agent can set up a skills portfolio repo with categorized, ranked, sortable skills — the meta-skill for publishing portfolios. No manual setup, no scripts to run — the agent handles it.

Install command

hermes skills install https://raw.githubusercontent.com/THEROCKSSS/hermes-skills-portfolio/main/skills/skills-portfolio-scaffold/SKILL.md
View SKILL.md on GitHub
---
name: skills-portfolio-scaffold
description: Use when a user wants to publish their own Hermes skills as a categorized, ranked, sortable skills portfolio — discoverable by both humans (sortable site) and agents (structured index) — or says "set up a skills portfolio" / "make my skills installable".
version: 1.0.0
author: Hermes Agent
license: MIT
metadata:
  hermes:
    tags: [skills-portfolio, scaffolding, skills-index, static-site]
    related_skills: [hallmark-readme, skill-publish, portfolio-upkeep]
---

# skills-portfolio-scaffold

## Overview

Scaffold a skills portfolio repository with the three-surface architecture: a monorepo of skills, a `skills-index.json` for agent-parseable metadata, a sortable static site, and CI validation. This is the meta-skill that reproduces the portfolio structure for anyone who wants to publish their own skills — under their own name and branding, never a clone of this one.

## When to Use

- The user wants to publish their own Hermes skills as a portfolio.
- The user wants a structured, categorized, ranked collection of skills (not just a flat directory).
- The user wants their skills to be discoverable by both humans (sortable site) and agents (structured index).
- The user says "set up a skills portfolio", "I want to publish my skills", or "make my skills installable".

## Prerequisites

- Git installed and configured
- A GitHub account (for the public shopfront)
- Hermes Agent installed (for `hermes skills install` to work for end users)
- Skills to publish — at least one `SKILL.md` with frontmatter

## Workflow

### Step 0: Name the portfolio

Before scaffolding anything, ask the user for three things: what they want their portfolio **called** (e.g. "Jane's Automation Skills," not "Hermes Skills Portfolio" — this is their shopfront, not a copy of this one), their **name or handle** as it should appear in the README/site footer, and a one-sentence **tagline**. Use their answers everywhere `portfolio.name` / `portfolio.owner` / `portfolio.tagline` appear in Step 2 — never leave a placeholder value or default to "Hermes" in the generated output.

### Step 1: Create the repo structure

```
<portfolio-name>/
├── README.md                    ← the shopfront (Hallmark quality)
├── skills-index.json            ← single source of truth
├── skills-index.schema.json     ← schema for the index
├── LICENSE                      ← MIT recommended
├── .gitignore
├── docs/adr/                    ← architecture decisions
├── skills/                      ← one directory per skill
│   └── <skill-name>/
│       ├── SKILL.md
│       └── README.md
└── site/                        ← sortable static site
    ├── index.html
    ├── styles.css
    └── app.js
```

### Step 2: Create skills-index.json

The index is the single source of truth. Both the README and the static site render from it. Schema:

```json
{
  "version": "1.0.0",
  "generated_at": "ISO-8601 timestamp",
  "portfolio": {
    "name": "Your Portfolio Name",
    "owner": "Your Name",
    "tagline": "One sentence. No filler.",
    "total_skills": 0,
    "github_url": "https://github.com/your-user/your-portfolio"
  },
  "categories": {
    "devops": { "name": "DevOps", "description": "...", "skill_count": 0 },
    "frontend": { "name": "Frontend", "description": "...", "skill_count": 0 }
  },
  "skills": [
    {
      "name": "skill-name",
      "category": "devops",
      "tier": "core",
      "description": "One line. What agent + skill delivers.",
      "install_url": "https://github.com/your-user/your-portfolio/blob/main/skills/skill-name/SKILL.md",
      "path": "skills/skill-name",
      "usage": { "hub_installs": 0, "github_clones": 0, "stars": 0 },
      "recency": "2026-01-01",
      "source": "new",
      "source_attribution": ""
    }
  ]
}
```

### Step 3: Assign usefulness tiers

Every skill gets one of three tiers at publish time:

| Tier | Meaning |
|---|---|
| `core` | Broadly empowering, nearly any user benefits |
| `featured` | Highly useful within a category |
| `utility` | Useful for specific workflows |

This is a curated judgment, not a metric. It's the day-one ranking — usage data enriches it later but never replaces it.

### Step 4: Create the static site

The `site/` directory contains a self-contained HTML/CSS/JS app that:
- Fetches `skills-index.json` on page load
- Renders skill cards in a responsive grid
- Supports sorting (tier-then-usage default, plus usage/recency/category/alphabetical)
- Supports filtering (category, tier) and search
- Uses OKLCH colors, a real font pairing, no AI-slop patterns

See the portfolio's own `site/` directory for a working reference implementation.

### Step 5: Add CI validation

Create `.github/workflows/validate.yml` (or `.forgejo/workflows/validate.yml` for Forgejo):

```yaml
name: validate
on: push
jobs:
  lint:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - name: Validate SKILL.md frontmatter
        run: |
          for skill_md in skills/*/SKILL.md; do
            name=$(grep -m1 '^name:' "$skill_md" | sed 's/^name:[[:space:]]*//')
            [ -z "$name" ] && echo "FAIL: $skill_md missing name" && exit 1
          done
```

### Step 6: Write the README

The portfolio README is the shopfront. It should include:
- A one-sentence tagline (no filler)
- Install instructions for individual skills
- A categories table
- The ranking explanation (tiers + usage)
- The repo structure
- Links to ADRs (if any)
- License info

### Step 7: Publish

```bash
git init
git add -A
git commit -m "Initial portfolio scaffold"
git remote add origin https://github.com/<user>/<portfolio-name>.git
git push -u origin main
```

### Step 8: Add skills incrementally

Each new skill:
1. Create `skills/<skill-name>/SKILL.md` with frontmatter
2. Create `skills/<skill-name>/README.md` (Hallmark quality)
3. Add an entry to `skills-index.json`
4. Commit and push
5. The CI validates the frontmatter

## Skill Entry Requirements

Every skill in the portfolio must have:

| Requirement | Where | Notes |
|---|---|---|
| `SKILL.md` with frontmatter | `skills/<name>/SKILL.md` | `name`, `description`, `version` minimum |
| `README.md` | `skills/<name>/README.md` | What it does, install, how to use, example |
| Index entry | `skills-index.json` | name, category, tier, description, install_url, path, source |

## Site Features

The portfolio static site includes:
- Dark mode default with light toggle (localStorage persistence)
- Sortable skill cards (by tier+usage, usage, recency, category, alphabetical)
- Category and tier filters with filter chips
- Search with keyboard shortcut (`/`)
- **Detail page overlay**: clicking a skill opens a full page with:
  - "What it does" (user-facing description)
  - "How an agent uses it" (agent-facing use cases)
  - SKILL.md tab (raw markdown rendered for reading)
  - README tab (raw markdown rendered for reading)
  - Install command with copy-to-clipboard
  - Close button (X icon), Esc key, click-outside-to-close
  - Shareable URL hash: `#skill/<name>`
- Category distribution bar
- Back-to-top button
- Toast notifications
- Keyboard: `/` search, `Esc` close detail, `t` toggle theme

### GitHub Pages deployment

GitHub Pages only serves from `/` or `/docs`. Deploy:
1. Copy site files + skills-index.json into `docs/`
2. Settings → Pages → Source → Deploy from branch → `main` → `/docs`
3. Site live at `https://<username>.github.io/<repo-name>/`

### skills-index.json enrichment

Each skill entry should include `agent_use`, `user_use`, `skillmd_content`, and `readme_content` fields so the detail page can show all content without fetching individual files.

## Common Pitfalls

1. **Index drift.** If you add a skill directory but forget to add an entry to `skills-index.json`, the site won't show it and the CI should warn. Keep them in sync.
2. **Relative links in README.** Links like `../other-skill/` break when a skill is published to its own repo via `skill-publish`. Use absolute URLs for cross-skill references.
3. **Tier inflation.** Don't mark everything `core`. If all skills are core, the tier is meaningless. Reserve `core` for skills that nearly any user benefits from.
4. **No categories.** Every skill must belong to a category. Uncategorized skills break the filter UI and the agent-parseable index.
5. **Invented usage data.** Start all usage counts at 0. Don't fabricate install numbers — they'll be overwritten by real data once the portfolio has traffic, and fake numbers erode trust.
6. **`skills-index.json` too large.** Embedding full SKILL.md and README.md content in the index makes it large (500KB+ for 50 skills). This is acceptable for a static site — it loads once and enables instant detail page rendering without per-skill fetches.
7. **`docs/` vs `site/` drift.** When you update site files, always copy them to `docs/` too. The `docs/` directory is what GitHub Pages serves. Use a sync script or the portfolio-upkeep skill.

## Verification Checklist

- [ ] `skills-index.json` validates against `skills-index.schema.json` and every skill directory under `skills/` has a matching index entry
- [ ] Every skill entry has a `tier` (`core`/`featured`/`utility`) and a `category`, and not everything is tagged `core`
- [ ] `site/` files are mirrored into `docs/` (what GitHub Pages actually serves)
- [ ] The CI validation workflow runs and fails a skill missing `name:` in its frontmatter
- [ ] All `usage` counts in newly added entries start at 0 — no fabricated install/star numbers
# skills-portfolio-scaffold



Scaffold a publishable skills portfolio with categorized, ranked, sortable skills and a static site — named and branded as *your own*, not a copy of this one.



## What it does



The agent asks what you want your portfolio called, then creates a portfolio repo structure for your skills: a monorepo with one directory per skill, a `skills-index.json` that serves as the single source of truth (for both humans and agents), a sortable static site, CI validation, and a Hallmark-quality README. This is the meta-skill that reproduces the portfolio structure so anyone can publish their own skills the same way — under their own name.



## Install



```bash

hermes skills install https://raw.githubusercontent.com/THEROCKSSS/hermes-skills-portfolio/main/skills/skills-portfolio-scaffold/SKILL.md

```



## How to use



```

"Set up a skills portfolio for my Hermes skills"

```



The agent:

1. Creates the repo structure (README, skills-index.json, site/, docs/adr/, skills/, CI workflow)

2. Sets up the JSON schema for the index

3. Generates the sortable static site (HTML/CSS/JS)

4. Creates the CI validation workflow

5. Shows you how to add skills incrementally



## What you get



| Component | Purpose |

|---|---|

| `skills-index.json` | Single source of truth — agents parse this, the site renders from it |

| `site/` | Sortable, filterable static site (sort by tier, usage, category, recency) |

| `skills/<name>/` | One directory per skill, each with SKILL.md + README.md |

| CI workflow | Validates every SKILL.md has required frontmatter |

| README.md | The shopfront — install instructions, categories, ranking explanation |



## The ranking model



Every skill gets a usefulness tier at publish time:



- **Core** — broadly empowering, nearly any user benefits

- **Featured** — highly useful within a category

- **Utility** — useful for specific workflows



Default sort: tier (Core → Featured → Utility), then usage within tier. Usage data accumulates over time from hub installs and GitHub clones.



## Example



```

User: "I have 15 Hermes skills I want to publish as a portfolio."



Agent:

  1. Creates the repo structure with skills-index.json schema

  2. Generates the sortable static site

  3. For each of the 15 skills: creates skills/<name>/ with SKILL.md + README.md

  4. Adds each skill to skills-index.json with category + tier

  5. Creates the CI workflow

  6. Returns: "Portfolio scaffolded. Push to GitHub when ready."



User pushes to GitHub → strangers can browse the site, install individual skills,

and agents can read skills-index.json to recommend skills.

```