skills/diataxis-categorizer/SKILL.md
Classify documentation files into domain-based sub-categories within Diátaxis top-level categories (tutorials, how-to, reference, explanation). Use when organizing wiki files into sub-folders like ralph/, copilot/, sdk/ within a Diátaxis category, determining where a file belongs using the three-rule heuristic (keyword extraction → reuse check → create check → fallback), reclassifying research/ staging files into standard categories, or performing batch wiki reorganization. Supplements the `diataxis` skill which handles top-level classification — this skill adds sub-category depth.
npx skillsauth add arisng/github-copilot-fc diataxis-categorizerInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
This skill adds sub-category classification to the Diátaxis framework. While the diataxis skill determines which top-level category a file belongs in (tutorials, how-to, reference, explanation), this skill determines which domain sub-folder within that category.
diataxis Skill| Concern | diataxis skill | diataxis-categorizer skill |
|---------|------------------|------------------------------|
| Top-level classification | ✅ Owns | ❌ Defers |
| Sub-category placement | ❌ Not covered | ✅ Owns |
| Templates & language patterns | ✅ Owns | ❌ Defers |
| Domain taxonomy | ❌ Not covered | ✅ Owns |
| Batch reorganization | ❌ Not covered | ✅ Owns |
Sub-categories are domain-based folders inside each Diátaxis top-level category:
.docs/
├── tutorials/
│ └── ralph/ # ≥3 ralph-related tutorials
├── how-to/
│ ├── ralph/ # ≥3 ralph-related how-to guides
│ └── copilot/ # ≥3 copilot-related how-to guides
├── reference/
│ ├── ralph/ # ≥3 ralph-related reference docs
│ └── copilot/ # ≥3 copilot-related reference docs
├── explanation/
│ ├── ralph/ # ≥3 ralph-related explanations
│ └── copilot/ # ≥3 copilot-related explanations
└── index.md
Naming convention: <category>/<domain>/filename.md
ralph, copilot, blazor-agui)reference/ralph/ can exist without tutorials/ralph/Primary domains for this workspace:
| Domain | Keyword patterns | Description |
|--------|-----------------|-------------|
| ralph | ralph, session, orchestrator, executor, reviewer, librarian, subagent | Ralph v2 orchestration system |
| copilot | copilot, copilot-fc, vscode, extension, agent, custom instruction | GitHub Copilot customization |
| sdk | sdk, copilot-sdk, acp, client | Copilot SDK / Agent Communication Protocol |
| blazor | blazor, ag-ui, blueprint, razor | Blazor UI framework |
Domains are extensible — new domains emerge when files naturally cluster around a keyword.
Given a file path and its content, determine the target sub-category:
Extract the primary domain keyword from the file using this priority chain:
ralph-subagent-contracts.md → ralphcategory field: category: copilot → copilot# Ralph v2 State Machine → ralphIf no single domain dominates, the file is cross-domain → stays at category root.
If an existing sub-category folder matches the extracted domain keyword:
reference/ralph/ exists and file domain is ralph → target is reference/ralph/filename.mdIf no matching sub-category folder exists:
The ≥3 threshold prevents premature sub-folder creation for one-off files.
File stays at the category root when:
Input: file path + metadata
│
┌────▼────┐
│ Rule 1: │
│ Extract │
│ keyword │
└────┬────┘
│
keyword found?
├── NO ──────────────────────────────► FALLBACK: category root
│
YES
│
┌────▼────┐
│ Rule 2: │
│ Reuse │
│ check │
└────┬────┘
│
sub-folder exists?
├── YES ─────────────────────────────► TARGET: <category>/<domain>/file.md
│
NO
│
┌────▼────┐
│ Rule 3: │
│ Create │
│ check │
└────┬────┘
│
≥3 peers share domain?
├── YES ─────────────────────────────► CREATE sub-folder + move all peers
│
NO ──────────────────────────────────► FALLBACK: category root
The research/ folder is a staging area, not a permanent 5th Diátaxis category.
research/ during active investigationresearch/ files as candidates for reclassificationdiataxis skill) and the sub-category (using this skill)A research file is ready for reclassification when:
This skill is designed to be invoked inline by the Librarian's PROMOTE workflow at Step 6.75 — Sub-Category Resolution, after top-level Diátaxis classification (Step 6) and content transformation (Step 6.5).
Input:
file_path: string # e.g., "reference/ralph-subagent-contracts.md"
metadata:
title: string # H1 or frontmatter title
category: string # Already determined by diataxis skill (Step 6)
frontmatter: object # Full frontmatter if available
body_preview: string # First 500 chars of body (for keyword scan)
Output:
target_path: string # e.g., "reference/ralph/ralph-subagent-contracts.md"
action: "place" | "create_and_place" | "stay"
domain: string | null # Extracted domain keyword, null if cross-domain
reason: string # Human-readable explanation
peers: string[] # Other files that share the domain (for create_and_place)
action is create_and_place, the caller should also move the listed peersFor retroactive reorganization of an existing .docs/ wiki:
.md files in a target category (e.g., reference/){
"category": "reference",
"scan_date": "2026-03-01",
"proposed_moves": [
{
"source": "reference/ralph-subagent-contracts.md",
"target": "reference/ralph/ralph-subagent-contracts.md",
"domain": "ralph",
"action": "create_and_place",
"reason": "5 files share domain 'ralph' — creating sub-folder"
},
{
"source": "reference/copilot-cli-help.md",
"target": "reference/copilot/copilot-cli-help.md",
"domain": "copilot",
"action": "create_and_place",
"reason": "4 files share domain 'copilot' — creating sub-folder"
}
],
"staying": [
{
"file": "reference/urls.md",
"domain": null,
"reason": "Cross-domain — no single domain dominates"
}
]
}
mv files)python skills/diataxis/scripts/generate_index.py to update index.mdFor each category in [tutorials, how-to, reference, explanation]:
files = list .md files at category root (not in sub-folders)
domain_counts = {}
For each file in files:
domain = extract_domain(file) # Rule 1
domain_counts[domain] += 1
For each file in files:
domain = extract_domain(file)
if sub-folder exists for domain: # Rule 2
propose move → <category>/<domain>/file
elif domain_counts[domain] >= 3: # Rule 3
propose create + move → <category>/<domain>/file
else:
mark as staying # Fallback
Output manifest JSON
devops
Programmatically create tldraw whiteboards and visualize them with a self-hosted tldraw instance. Create boards with shapes, text, and connectors, then deploy to a self-hosted server for collaborative editing and gallery management.
tools
Execute Google Cloud Platform operations using the gcloud CLI (and gsutil/bq where applicable). Use when the user wants to: authenticate with GCP, manage GCP resources, deploy applications, configure projects or IAM, view logs, run SQL/BigQuery, or interact with any GCP service from the command line. Triggers on phrases like "gcloud", "Google Cloud CLI", "deploy to GCP", "create a VM", "Cloud Run", "GKE cluster", "Cloud Storage bucket", "set GCP project", "service account", "Cloud Functions", "App Engine deploy", or any request to manage Google Cloud resources via command line.
testing
Grilling session that challenges your plan against the existing domain model, sharpens terminology, and updates documentation (CONTEXT.md, ADRs) inline as decisions crystallise. Use when user wants to stress-test a plan against their project's language and documented decisions.
development
Session-scoped git commit orchestrator that commits only current-session changes and leaves unrelated dirty worktree edits untouched. Inherits git-atomic-commit for atomic grouping and commit message execution, and git-commit-scope-constitution for scope governance and validation. Use when asked to commit this session only or isolate commits from mixed worktree state.