Best for
- Activation Triggers
- When NOT to Use
- Creating a canonical feature inventory for a skill, system, MCP surface, CLI surface, or documentation family.
MichelKerkmeester/opencode--skilled-agent-loops-with-spec-kit-memory/.opencode/skills/sk-doc/sk-create-feature-catalog/SKILL.md
Create sk-doc feature-catalog packages with a root catalog, category folders, per-feature files, and auditable source anchors.
Decision brief
create-feature-catalog is the feature-inventory workflow packet of the sk-doc parent hub. It authors canonical current-state catalogs rooted at feature-catalog/feature-catalog.md, with category folders and one per-feature reference file per root catalog entry.
Compatibility matrix
| Platform | Status | Evidence | What to check |
|---|---|---|---|
| Codex | Not declared | No explicit evidence | Portability before use |
| Claude Code | Not declared | No explicit evidence | Portability before use |
| Cursor | Not declared | No explicit evidence | Portability before use |
| Gemini CLI | Not declared | No explicit evidence | Portability before use |
Installation
The source command is displayed only when detected. A safe inspection prompt is always available so your agent can explain every action before execution.
npx skills add https://github.com/MichelKerkmeester/opencode--skilled-agent-loops-with-spec-kit-memory --skill ".opencode/skills/sk-doc/sk-create-feature-catalog"Inspect the Agent Skill "sk-create-feature-catalog" from https://github.com/MichelKerkmeester/opencode--skilled-agent-loops-with-spec-kit-memory/blob/3d386ee21366523774d89c0aff3ebbbc8fa7ff10/.opencode/skills/sk-doc/sk-create-feature-catalog/SKILL.md at commit 3d386ee21366523774d89c0aff3ebbbc8fa7ff10. List every install step, command, network request, credential, file read/write, external action, and rollback step. Explain whether it fits my task. Do not install or execute anything until I approve.
Workflow
Follow this workflow in order.
Use this workflow when the request involves:
Use this workflow when the request involves:
Use another sk-doc packet when:
Create a feature catalog when the system needs a canonical capability inventory.
Permission review
The documentation asks the agent to create, modify, or delete local files.
Create one category folder per root section using a descriptive kebab-case slug such as `category-name`; the root catalog listing defines display order.The documentation asks the agent to create, modify, or delete local files.
Create one per-feature file for each root entry using `assets/feature-catalog-snippet-template.md`.The documentation asks the agent to run terminal commands or scripts.
python3 .opencode/skills/sk-doc/shared/scripts/check_no_hyphenated_catalog_content.py <new-content-staging-root>The documentation asks the agent to run terminal commands or scripts.
python3 .opencode/skills/sk-doc/shared/scripts/validate_document.py <target-skill>/feature-catalog/feature-catalog.mdEvidence record
| Signal | Value | Evidence type | Meaning |
|---|---|---|---|
| Quality score | 92/100 | Computed | Documentation, specificity, maintenance, and trust rules |
| Repository stars | 34 | Source | Repository attention, not individual Skill quality |
| Compatibility | 0 platforms | Source | Declared in the catalog source record |
| Usage guide | automated source guide | Editorial | Generated or reviewed according to the visible evidence level |
Pinned source
create-feature-catalog is the feature-inventory workflow packet of the sk-doc parent hub. It authors canonical current-state catalogs rooted at feature-catalog/feature-catalog.md, with category folders and one per-feature reference file per root catalog entry.
Feature catalogs are the canonical inventory for what a system does today. They organize capabilities by category, summarize current behavior in a root catalog, and link to per-feature files that carry implementation anchors, tests, and metadata.
Core principle: use the root catalog for stable inventory and navigation, and use per-feature files for implementation truth and traceable source anchors.
This packet owns /create:feature-catalog, its references/ set (indexed by references/README.md), and assets/. It consumes shared sk-doc validation and writing standards from ../shared/.
Use this workflow when the request involves:
feature-catalog/feature-catalog.md.retrieval/ or mutation/.unified-context-retrieval.md under category folders.Keyword triggers: feature catalog, feature inventory, catalog package, per-feature files, source anchors, root catalog, capability inventory, capabilities, /create:feature-catalog.
Use another sk-doc packet when:
create-manual-testing-playbook.create-readme.create-changelog, create-benchmark, create-command, create-agent, create-skill, or create-flowchart.create-quality-control.Create a feature catalog when the system needs a canonical capability inventory.
Strong signals:
Use a lighter alternative when:
Decision rule:
Need a stable, reviewable current-state inventory?
YES -> Create a feature catalog package
NO -> Keep capability summary in README or install guide
This is a nested workflow packet under sk-doc. It carries its own SKILL.md, README.md, references/, assets/, and changelog/, but it must not define a packet-local graph-metadata.json; advisor identity lives at the sk-doc hub root.
This packet routes by whether the target needs a stable, reviewable current-state feature inventory. It does not use runtime keyed resource discovery through references/<key>/ because its references are flat.
references/README.md as the fallback route map when catalog necessity or target feature scope is unclear.references/<key>/ or assets/<key>/ runtime-key router unless this packet gains real keyed resource subdirectories.For this flat-reference packet, the canonical resilient router discovers resources at call time, guards and loads only what exists, scores the root-catalog vs per-feature-file intent, and returns a disambiguation checklist rather than silently loading nothing:
from pathlib import Path
SKILL_ROOT = Path(__file__).resolve().parent
RESOURCE_BASES = (SKILL_ROOT / "references", SKILL_ROOT / "assets")
DEFAULT_RESOURCE = "references/README.md"
# Two routing targets; keywords come from this packet's activation triggers.
INTENT_MODEL = {
"root_catalog": {"weight": 4, "keywords": ["root catalog", "feature catalog", "capability inventory", "catalog package"]},
"per_feature_file": {"weight": 4, "keywords": ["per-feature files", "source anchors", "feature inventory", "/create:feature-catalog"]},
}
UNKNOWN_FALLBACK_CHECKLIST = [
"Confirm the target system, skill, or surface the catalog should cover",
"Confirm whether the request needs the root catalog, per-feature files, or the full package",
"Confirm where implementation source anchors and validation/test anchors live for the claimed features",
]
def discover_markdown_resources() -> set[str]:
docs = []
for base in RESOURCE_BASES:
if base.exists():
docs.extend(path for path in base.rglob("*.md") if path.is_file())
return {doc.relative_to(SKILL_ROOT).as_posix() for doc in docs}
def _guard_in_skill(relative_path: str) -> str:
resolved = (SKILL_ROOT / relative_path).resolve()
resolved.relative_to(SKILL_ROOT)
if resolved.suffix.lower() != ".md":
raise ValueError(f"Only markdown resources are routable: {relative_path}")
return resolved.relative_to(SKILL_ROOT).as_posix()
def load_if_available(relative_path, inventory, loaded, seen) -> None:
guarded = _guard_in_skill(relative_path)
if guarded in inventory and guarded not in seen:
load(guarded)
loaded.append(guarded)
seen.add(guarded)
def score_intents(request) -> dict:
text = request.text.lower()
scores = {intent: 0 for intent in INTENT_MODEL}
for intent, cfg in INTENT_MODEL.items():
for kw in cfg["keywords"]:
if kw in text:
scores[intent] += cfg["weight"]
return scores
def route_feature_catalog_request(request):
inventory = discover_markdown_resources()
loaded, seen = [], set()
scores = score_intents(request)
if max(scores.values() or [0]) < 4: # Tier 1: low confidence
load_if_available(DEFAULT_RESOURCE, inventory, loaded, seen)
return {
"load_level": "UNKNOWN_FALLBACK",
"needs_disambiguation": True,
"disambiguation_checklist": UNKNOWN_FALLBACK_CHECKLIST,
"resources": loaded,
}
intent = max(scores, key=scores.get) # Tier 2: happy path
# Flat resource topology: no references/<key>/ subdirectories. The intent selects the
# root-catalog or per-feature template already documented below, not a keyed subtree.
for path in sorted(inventory):
load_if_available(path, inventory, loaded, seen)
return {"intent": intent, "resources": loaded}
feature-catalog/
├── feature-catalog.md
├── category-name/
│ ├── feature-name.md
│ └── another-feature-name.md
└── another-category/
└── feature-name.md
Invariants:
feature-catalog.md in lowercase.category-name (no numeric prefix).feature-name.md without numeric prefixes.feature-catalog.md), not the folder name.Use these packet resources while authoring:
assets/feature-catalog-template.md for the root catalog scaffold.assets/feature-catalog-snippet-template.md for each per-feature file.../shared/references/quick-reference.md and ../shared/references/validation.md before delivery.../shared/references/frontmatter-versioning.md when checking frontmatter version fields.references/README.md to route the reference overflow — examples.md (worked live-catalog walkthrough) and common-pitfalls.md (deep-dive pitfalls, template-versus-reference split) — only for depth beyond this inline workflow.The source assets keep the filenames feature-catalog-template.md and feature-catalog-snippet-template.md until their separate source-file migration. Those filenames are authoring inputs, not emitted package names.
Follow this workflow in order.
feature-catalog/feature-catalog.md from assets/feature-catalog-template.md.category-name; the root catalog listing defines display order.assets/feature-catalog-snippet-template.md.## 2. HOW IT WORKS section with current behavior.HOW IT WORKS sections and H3 subheadings for sections longer than three paragraphs.## 4. SOURCE METADATA, including group, canonical file path, and related references.Authoring order matters:
The root catalog is the top-level inventory and navigation layer.
It owns:
## 1. OVERVIEW.Root summaries should answer:
Package highlights for root catalogs:
trigger_phrases.<!-- ANCHOR --> navigation comments.## 1. OVERVIEW.Do not overload the root catalog with:
That information belongs in per-feature files, playbooks, or specs.
Each per-feature file is the detailed reference entry for one catalog item.
Required structure:
## 1. OVERVIEW## 2. HOW IT WORKS## 3. SOURCE FILES## 4. SOURCE METADATAEach per-feature file must include:
title, one-line description, trigger_phrases, and a four-part version.HOW IT WORKS section.File | Layer | Role columns.File | Type | Role columns.HOW IT WORKS subheading rule:
### Core Behavior, ### Quality Gates, ### Configuration, ### Edge Cases, and ### Async & Safety.Content rule:
Feature catalogs and manual testing playbooks serve different purposes.
| Document | Primary Question |
|---|---|
| Feature catalog | What does the system do today? |
| Manual testing playbook | How do we validate that behavior manually? |
Cross-reference rule:
Validation workflow — run from the repo root so the validator resolves the feature_catalog doc type on per-feature leaves (leaf detection accepts the canonical feature-catalog/<category>/ path during the bounded compatibility window):
# New-content naming guard. The staging root must contain only the newly authored
# canonical feature-catalog package, never an ancestor with shipped legacy roots.
python3 .opencode/skills/sk-doc/shared/scripts/check_no_hyphenated_catalog_content.py <new-content-staging-root>
# Root catalog (detected as the readme doc type)
python3 .opencode/skills/sk-doc/shared/scripts/validate_document.py <target-skill>/feature-catalog/feature-catalog.md
python3 .opencode/skills/sk-doc/shared/scripts/extract_structure.py <target-skill>/feature-catalog/feature-catalog.md
# Each per-feature leaf (detected as the feature_catalog doc type; validates the Validation And Tests table taxonomy)
python3 .opencode/skills/sk-doc/shared/scripts/validate_document.py <target-skill>/feature-catalog/<category-name>/feature-name.md
The staging scope is mandatory until shipped underscore roots are migrated. Do not run this guard against .opencode/skills or another ancestor containing legacy feature_catalog/ or manual_testing_playbook/ trees.
The validator machine-checks the root-catalog structure and each leaf's Validation And Tests table, but not cross-file link targets or source-anchor accuracy. Manually verify:
scripts/validate_catalog_package.py is the package-level enforcement surface. Discovery is presence-based: every canonical feature-catalog/ directory below .opencode/skills/ is a package, keyed by its path relative to that root. The measured starting corpus is 26 packages and 804 leaves. The validator carries explicit runtime-data exclusion rulings for any root that could gain a same-named directory without a skill contract.
The validator compares root filenames and root-link targets case-insensitively. This preserves the mcp-click-up package's uppercase FEATURE-CATALOG.md without counting the root itself as an orphan.
The initial enforcement ladder is staged. Promoted packages fail closed immediately. The explicit WARN tier is system-spec-kit, mcp-tooling/mcp-refero, mcp-tooling/mcp-click-up, and system-deep-loop/deep-research, the four packages carrying the measured 104-orphan backlog. Repair children remove a package from the map when it is repaired; a clean package reports a promoted PASS. Use --report-only for advisory output; --strict remains an alias for the default.
The enforced roster is:
Catalog prose may describe structural rosters derived from links or source tables, but it must not freeze measured counts or dated snapshots. The validator reports those snapshots so the catalog stays current-state evidence rather than stale census data.
Validator boundary:
validate_document.py checks root-catalog structure and, for per-feature leaves reached by a repo-root path, the Validation And Tests table taxonomy.check-markdown-links.cjs.assets/feature-catalog-template.md for the root catalog scaffold.assets/feature-catalog-snippet-template.md for per-feature files.feature-catalog/feature-catalog.md.category-name; let the root catalog index own display order.../shared/ instead of duplicating them here.graph-metadata.json.HOW IT WORKS sections as unbroken walls of prose.trigger_phrases from per-feature frontmatter.../shared/scripts/validate_document.py and the safe fix is not obvious.| Mistake | Why It Breaks | Correct Fix |
|---|---|---|
| Treating the catalog like a roadmap | Readers cannot trust current-state claims | Keep speculative material out or label it explicitly |
| Unstable renaming of category or feature slugs | Breaks links from playbooks and other docs | Keep published slugs stable unless there is a deliberate rename migration |
| Missing source anchors | Catalog claims become hard to audit | Add implementation and validation file references in the per-feature file |
| Writing execution-heavy scenario detail in the catalog | Blurs the boundary with playbooks | Keep execution matrices in playbooks, not the catalog |
| Playbook cross-references drifting from catalog names | Inventory and validation no longer match | Update catalog and playbook links together when a feature name changes |
Wall of prose in HOW IT WORKS | Long unbroken sections lose scannability and navigation anchors | Add H3 subheadings whenever the section exceeds three paragraphs |
Missing trigger_phrases in frontmatter | Feature is invisible to doc-trigger routing | Add at least three trigger phrases matching the H3 heading in the root catalog |
The catalog package is complete when:
feature-catalog/feature-catalog.md and was built from the packet template.trigger_phrases, and a four-part version, plus source-file and validation or test anchors for every feature claim.The primary contract is this SKILL.md. Load the resources below only for overflow depth, worked examples, or schema checks beyond the inline workflow.
references/README.md - route map for the packet reference set.references/examples.md - annotated walkthrough of a shipped feature-catalog package.references/common-pitfalls.md - deep-dive pitfalls with before/after fixes and the template-versus-reference split.assets/feature-catalog-template.md - root catalog scaffold.assets/feature-catalog-snippet-template.md - per-feature file scaffold.../shared/references/quick-reference.md - condensed commands and file locations.../shared/references/validation.md - shared validation and quality-scoring workflow.../shared/references/frontmatter-versioning.md - four-part version field rules.Frequently asked questions
create-feature-catalog is the feature-inventory workflow packet of the sk-doc parent hub. It authors canonical current-state catalogs rooted at feature-catalog/feature-catalog.md, with category folders and one per-feature reference file per root catalog entry.
The source record exposes this install command: npx skills add https://github.com/MichelKerkmeester/opencode--skilled-agent-loops-with-spec-kit-memory --skill ".opencode/skills/sk-doc/sk-create-feature-catalog". Inspect the command and pinned source before running it.
Static rules flagged write-files, exec-script in the source; the page lists the matching lines and excerpts.
Alternatives
oaustegard/claude-skills
Generate hierarchical _FEATURES.md files that describe what a codebase DOES from a user/consumer perspective, anchored to source symbols via tree-sitting. Supports large complex codebases through feature-driven decomposition into sub-feature files. Uses a multi-pass synthesis: orientation → detail → overview rewrite. Use when someone says "what does this do", "document features", "feature inventory", "_FEATURES.md", or needs to understand a codebase's purpose before modifying it. Complements tre
dancingteeth/unified-code-review
Risk-first code review for PRs and branch audits: blast-radius triage, agent-authored discipline (tests first, intent evidence), call-graph pincer for integration defects between modules, then structural code-judo bar. Use when reviewing PRs, auditing agent-written diffs, catching rubber-stamp green CI, or wiring bugs single-file review misses. Prefer over structure-only thermo-nuclear review alone. Do not use for unrelated coding tasks or as an always-on rule.
Postpartum-genushyacinthus29/dotnet-skills
Build long-running .NET background services with `BackgroundService`, Generic Host, graceful shutdown, configuration, logging, and deployment patterns suited to workers and daemons.
PaulRBerg/agent-skills
Create/scaffold/init a project-local agent skill under `.agents/skills` in an ordinary repository; defer to repository instructions that define a source catalog and lifecycle.