Best for
- Activation Triggers
- When NOT to Use
- Packet Boundary
MichelKerkmeester/opencode--skilled-agent-loops-with-spec-kit-memory/.opencode/skills/sk-doc/sk-create-skill/SKILL.md
Scaffold OpenCode skills and two-axis sk-doc parent hubs, including standalone, nested workflow, and surface packets.
Decision brief
create-skill is the skill-authoring workflow packet of the sk-doc parent hub. It owns standalone OpenCode skill scaffolding and parent-hub scaffolding through two workflow modes: create-skill and create-skill-parent.
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-skill"Inspect the Agent Skill "sk-create-skill" from https://github.com/MichelKerkmeester/opencode--skilled-agent-loops-with-spec-kit-memory/blob/3d386ee21366523774d89c0aff3ebbbc8fa7ff10/.opencode/skills/sk-doc/sk-create-skill/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 these steps in order, skipping only when the target skill already exists and the skipped step is plainly not applicable.
Use the parent-hub path when one public skill identity must dispatch to multiple packets.
Use this packet when the request involves: - Creating or rebuilding an OpenCode skill under .opencode/skills/. - Running /create:skill for a standalone skill with its own advisor identity. - Running /create:skill-parent for a parent hub with nested workflow or surface packets. -…
Use this packet when the request involves: - Creating or rebuilding an OpenCode skill under .opencode/skills/. - Running /create:skill for a standalone skill with its own advisor identity. - Running /create:skill-parent for a parent hub with nested workflow or surface packets. -…
Use another sk-doc packet when: - The user asks for agent scaffolding, command scaffolding, README or install-guide creation, benchmark packages, feature catalogs, manual testing playbooks, flowcharts, or changelogs. Use create-agent, create-command, create-readme, create-benchm…
Permission review
The documentation asks the agent to create, modify, or delete local files.
[`create-benchmark`](../sk-create-benchmark/SKILL.md) owns the run-folder grammar, the report file setThe documentation asks the agent to create, modify, or delete local files.
Never create new folder/name mismatches for convenience.Evidence record
| Signal | Value | Evidence type | Meaning |
|---|---|---|---|
| Quality score | 95/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-skill is the skill-authoring workflow packet of the sk-doc parent hub. It owns standalone OpenCode skill scaffolding and parent-hub scaffolding through two workflow modes: create-skill and create-skill-parent.
Use this packet when the request involves:
.opencode/skills/./create:skill for a standalone skill with its own advisor identity./create:skill-parent for a parent hub with nested workflow or surface packets.SKILL.md, README.md, references/, assets/, scripts/, or changelog/ for a skill package.mode-registry.json, hub-router.json, description.json, or hub-level graph-metadata.json.scripts/package_skill.py.Keyword triggers: create skill, /create:skill, /create:skill-parent, new skill, skill scaffold, SKILL.md scaffold, OpenCode skill, sk-skill, create sk-, reusable capability, reusable helper, starter reference docs, parent skill, parent hub, mode packet, nested workflow packet, package skill.
Use another sk-doc packet when:
create-agent, create-command, create-readme, create-benchmark, create-feature-catalog, create-manual-testing-playbook, create-flowchart, or create-changelog.create-quality-control.sk-code.This packet may create and edit skill artifacts. It does not own the sk-doc hub identity, and this nested workflow packet must not carry its own graph-metadata.json.
SKILL AUTHORING REQUEST
|
+- Standalone skill -> workflowMode: sk-create-skill
| +- scripts/init_skill.py
| +- assets/skill/skill-md-template.md
| +- assets/skill/skill-readme-template.md
| +- assets/skill/skill-sync-manifest-template.md
|
+- Parent hub -> workflowMode: sk-create-skill-parent
+- assets/parent-skill/parent-skill-hub-template.md
+- assets/parent-skill/parent-skill-registry-template.json
+- assets/parent-skill/parent-skill-hub-router-template.json
Choose create-skill when the artifact is one skill with one advisor identity and one runtime contract.
Choose create-skill-parent when the artifact is one advisor-routable hub that dispatches to nested workflow packets or read-only surface packets.
Ask one focused clarification before authoring if it is unclear whether the user wants a standalone skill or a parent hub.
| Domain | Core Resources | Use |
|---|---|---|
| Scaffolding | scripts/init_skill.py, assets/skill/skill-md-template.md, assets/skill/skill-readme-template.md | Create or normalize standalone skill files. |
| Resource templates | assets/skill/skill-reference-template.md, assets/skill/skill-asset-template.md, assets/skill/skill-smart-router.md | Create routed references, assets, and resilient smart-router pseudocode. |
| Runtime sync manifests | assets/skill/skill-sync-manifest-template.md | Document how a runtime config dir derives from the canonical .opencode tree (SYNC manifest). |
| Procedure cards | assets/skill/skill-procedure-template.md | Add a private, triggerable internal procedure to a skill or mode without a new public identity. |
| Parent hubs | assets/parent-skill/parent-skill-* | Create hub SKILL, registry, router, description, and graph metadata files. |
| Validation | scripts/package_skill.py, ../shared/scripts/extract_structure.py | Check completion, package distribution zips, and inspect structure. |
| Overflow detail | references/README.md, references/{shared,skill,parent-skill}/, ../shared/ | Load only for edge cases, exhaustive examples, or schema details beyond this SKILL.md. |
from pathlib import Path
SKILL_ROOT = Path(__file__).resolve().parent
RESOURCE_BASES = (SKILL_ROOT / "references", SKILL_ROOT / "assets")
DEFAULT_RESOURCE = "references/README.md"
RESOURCE_KEY_BY_MODE = {
"sk-create-skill": "skill",
"sk-create-skill-parent": "parent-skill",
}
UNKNOWN_FALLBACK_CHECKLIST = [
"Confirm whether the artifact is a standalone skill or parent hub",
"Confirm the target skill folder and intended advisor identity",
"Provide one concrete trigger, output contract, or resource example",
"Confirm the validation command before completion",
]
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: str, inventory: set[str], loaded: list[str], seen: set[str]) -> 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 route_skill_authoring_request(request):
inventory = discover_markdown_resources()
loaded, seen = [], set()
if asks_for_parent_hub_or_mode_registry(request):
workflow_mode = "sk-create-skill-parent"
elif asks_for_nested_workflow_or_surface_packets(request):
workflow_mode = "sk-create-skill-parent"
elif asks_for_one_skill_package(request):
workflow_mode = "sk-create-skill"
elif unclear_standalone_vs_parent(request):
load_if_available(DEFAULT_RESOURCE, inventory, loaded, seen)
return {
"load_level": "UNKNOWN_FALLBACK",
"needs_disambiguation": True,
"disambiguation_checklist": UNKNOWN_FALLBACK_CHECKLIST,
"resources": loaded,
}
else:
load_if_available(DEFAULT_RESOURCE, inventory, loaded, seen)
return {"load_level": "DEFER", "next": "matching sk-doc packet", "resources": loaded}
routing_key = RESOURCE_KEY_BY_MODE[workflow_mode]
shared_refs = sorted(path for path in inventory if path.startswith("references/shared/"))
keyed_refs = sorted(path for path in inventory if path.startswith(f"references/{routing_key}/"))
keyed_assets = sorted(path for path in inventory if path.startswith(f"assets/{routing_key}/"))
if not keyed_refs and not keyed_assets:
load_if_available(DEFAULT_RESOURCE, inventory, loaded, seen)
return {
"workflowMode": workflow_mode,
"routing_key": routing_key,
"notice": f"No create-skill resources found for routing key '{routing_key}'",
"resources": loaded,
}
for path in shared_refs + keyed_refs + keyed_assets:
load_if_available(path, inventory, loaded, seen)
return {"workflowMode": workflow_mode, "routing_key": routing_key, "resources": loaded}
Follow these steps in order, skipping only when the target skill already exists and the skipped step is plainly not applicable.
scripts/, references/, or assets/.scripts/.references/.assets/.references/procedures/ using assets/skill/skill-procedure-template.md when the skill has multiple distinct, individually-selected internal processes rather than one dominant workflow.scripts/init_skill.py <skill-name> --path <output-directory>.assets/skill/skill-reference-template.md.assets/skill/skill-asset-template.md..claude/, .codex/, .cursor/, .devin/, .pi/, or a new runtime), author or update that dir's SYNC.md from assets/skill/skill-sync-manifest-template.md and cross-link it from every sibling manifest.references/, assets/, and other authored resource trees. Keep Python filenames, Python import-package directories, and tool-mandated names such as SKILL.md and README.md unchanged.README.md from assets/skill/skill-readme-template.md when operators need quick start, examples, troubleshooting, or a package map.SKILL.md as the executable runtime contract, not as a link farm.WHEN TO USE limited to activation triggers, use cases, keyword triggers, and when-not-to-use boundaries.SMART ROUTING, including detection signals, resource domains, loading levels, and smart-router pseudocode.HOW IT WORKS.RULES.SUCCESS CRITERIA.node .opencode/skills/sk-doc/sk-create-skill/scripts/ci-skill-root-metadata.cjs --fix after authoring so the manifest and derived aliases are generated and the root passes its class gate.graph-metadata.json domains and intent_signals plus the SKILL.md keyword comment are the fields the advisor's scorers actually read, so fill them with phrases a user would genuinely type, not the skill name repeated.node .opencode/bin/skill-advisor.cjs skill_graph_scan --trusted. Smoke-test routing with node .opencode/bin/skill-advisor.cjs advisor_recommend --json '{"prompt":"<a phrase from your intent signals>"}' --warm-only --format json and confirm your skill appears in the recommendations.scripts/validate_skill_package.py <path/to/skill-folder> before claiming the skill is complete.scripts/package_skill.py <path/to/skill-folder> <output-directory>.SKILL.md content into references, and improving trigger descriptions.skill-name/
├── SKILL.md
├── graph-metadata.json
├── leaf-manifest.config.json
├── leaf-manifest.json # generated
├── leaf-aliases.json # generated identity projection
├── README.md
├── references/
├── assets/
├── scripts/
├── manual-testing-playbook/ # the scenario corpus — an input
│ └── manual-testing-playbook.md # the index; per-feature files in category folders
└── benchmark/ # what running that corpus produced — output
├── README.md # layout and how to run
└── reports/
├── README.md # run index, appended by the harness
└── <YYYY-MM-DD>--<subject>--<variant>/
SKILL.md is the root marker. Root JSON requirements are class-specific; the complete authored/generated matrix is skill-root-metadata-contract.md. README.md, references/, assets/, and scripts/ are optional only when they are genuinely unnecessary.
A standalone skill is class S under the root-metadata contract, so beyond graph-metadata.json it authors exactly one more metadata file — leaf-manifest.config.json, naming its single workflow mode and leaf roots — and generates the rest. Required, forbidden, and generated-versus-authored rules for every root JSON live in references/shared/skill-root-metadata-contract.md; do not infer them from a sibling skill.
The last two directories are a pair: manual-testing-playbook/ holds the corpus a run reads, and
benchmark/ holds what the run wrote. Keeping them apart is what lets a run be re-executed against
the same scenarios later and compared, so neither one is optional once a skill is benchmarked.
The scaffolder creates both. Their interiors are owned elsewhere and are not restated here:
create-benchmark owns the run-folder grammar, the report file set
and the index shape; create-manual-testing-playbook
owns the corpus layout and the results-storage contract. Consult those rather than inferring the rules
from an example.
Every SKILL.md must include:
name: lowercase hyphen-case and matching the folder name.description: single-line, specific, non-placeholder routing description.allowed-tools: YAML array format such as [Read, Write, Edit, Bash, Grep, Glob].version: four-part X.Y.Z.W.Every authored references/*.md and markdown asset should carry the full reference/asset frontmatter block from the packet templates, including version. README.md is exempt from the full reference block but still uses the README template frontmatter.
Use the parent-hub path when one public skill identity must dispatch to multiple packets.
legacy or ready; do not silently choose in the authoring workflow. Existing CLI calls remain backward-compatible and default to legacy.scripts/init_skill.py <hub-name> --path <parent-directory> --kind parent --compiled-routing legacy|ready.SKILL.md, mode-registry.json, hub-router.json, root ROUTER.md, description.json, graph-metadata.json, and generated leaf-manifest.json, plus changelog/, manual-testing-playbook/, and benchmark/. Add command-metadata.json only when the hub owns slash commands; when present, it has one entry per owned command.init_skill.py --kind parent always emits the root ROUTER.md with router_state: stage1-only — empty stage-two maps and a root SKILL.md pointer. Keep it stage1-only until a concrete leaf map is authored; only then replace router_state with active with non-empty equal-key INTENT_SIGNALS/RESOURCE_MAP whose paths resolve and map to typed leaf-manifest.json pairs. Never synthesize placeholder intents.SKILL.md, README.md, and changelog/.references/ and assets/ to surface packets when they carry evidence material.procedures/ folder, using assets/skill/skill-procedure-template.md, when it has multiple distinct, individually-triggered internal processes; use shared/procedures/ only for a card that genuinely coordinates two or more packets.graph-metadata.json to nested workflow packets or surface packets.mode-registry.json > modes[] array.packetKind: "workflow" for lifecycle or process packets.packetKind: "surface" for read-only evidence packets.modes[] entry, define workflowMode, packetKind, backendKind, toolSurface, packet, packetSkillName, grandfatheredFolderMismatch, aliases, and advisorRouting.folder == packetSkillName for all new packets.grandfatheredFolderMismatch: false unless preserving an existing mismatch.modes[]; never create a second array such as surfacePackets[].hub-router.json with routerPolicy, routerSignals, and vocabularyClasses.routerSignals keys match mode-registry.json > modes[].workflowMode exactly.routerPolicy.tieBreak lists every registry mode once, with workflow modes before surface packets.single, orderedBundle, and defer; add surfaceBundle only when the hub has surface packets (surface-axis).extensions only when real routing semantics require them; do not add extra directory tiers for extensions.legacy (no manifest) as complete only when no canonical manifest was emitted. For ready, the initializer calls compiled-route-manifest.cjs mint after the final router inputs exist and then calls freshness against the same hub root.compiled-ready (fresh manifest verified) only from a valid, fresh canonical result. A missing minter, failed mint, malformed manifest, or stale manifest is a failed generation and retains legacy fallback; never synthesize a digest or author an activation manifest.node scripts/ci-skill-root-metadata.cjs --fix, then rerun node scripts/ci-skill-root-metadata.cjs to prove cleanliness. Declaring mode-registry.json and hub-router.json is what makes a root a hub; declaring only one of them is a half-written declaration the gate rejects. Required, forbidden, and generated-versus-authored rules are in references/shared/skill-root-metadata-contract.md.graph-metadata.json domains and intent_signals, description.json keywords, and per-mode registry aliases are the fields the advisor's scorers read — fill them with phrases a user would genuinely type.node .opencode/bin/skill-advisor.cjs skill_graph_scan --trusted. Smoke-test with node .opencode/bin/skill-advisor.cjs advisor_recommend --json '{"prompt":"<a phrase from your intent signals>"}' --warm-only --format json.parent-hub/
├── SKILL.md
├── mode-registry.json
├── hub-router.json
├── ROUTER.md # stage-two control; stage1-only on a fresh scaffold
├── description.json
├── graph-metadata.json
├── command-metadata.json # optional; only when the hub owns slash commands
├── leaf-manifest.json # generated
├── changelog/
├── manual-testing-playbook/ # the scenario corpus — an input
│ └── manual-testing-playbook.md # the index; per-feature files in category folders
├── benchmark/ # what running that corpus produced — output
│ ├── README.md # layout and how to run
│ └── reports/
│ ├── README.md # run index, appended by the harness
│ └── <YYYY-MM-DD>--<subject>--<variant>/
├── workflow-packet/
│ ├── SKILL.md
│ ├── README.md
│ ├── procedures/ (optional - only if the packet has multiple distinct, triggered procedures)
│ └── changelog/
└── surface-packet/
├── SKILL.md
├── README.md
├── references/
├── assets/
└── changelog/
Class-H root metadata follows the skill-root-metadata-contract.md matrix, including authored versus generated files.
A packet may carry its own benchmark/ in the same shape when it is measured separately from its
hub. The corpus/output pairing and the owning-skill references described under the standalone shape
apply identically here.
Run the completion gate before any completion claim:
scripts/validate_skill_package.py <path/to/skill-folder>
It auto-detects skill kind — standalone skills run the package check; parent hubs additionally run the parent-hub structural check and the canonical manifest freshness check. A missing manifest reports the valid legacy state; a valid fresh manifest reports compiled-ready; malformed or stale manifests fail validation.
--check hard-fails on missing SKILL frontmatter or required fields, non-four-part versions, folder/name mismatches, missing required sections, malformed names, and descriptions that are missing, multiline, or contain angle brackets. Generated package paths that are not kebab-case remain advisory during a debt-tolerant --check; --strict and actual packaging promote them to blocking errors. Python filenames, Python import-package directories, frozen/generated subtrees, and tool-mandated names are exempt.
Use structure extraction when quality evidence is needed:
../shared/scripts/extract_structure.py <path/to/skill/SKILL.md>
Package only after validation passes:
scripts/package_skill.py <path/to/skill-folder> <output-directory>
create-skill or create-skill-parent before authoring.assets/skill/ rather than inventing file shapes from memory.SKILL.md under 5k words and focused on activation, routing, core workflow, rules, and success criteria.references/.WHEN TO USE free of file references and navigation tables.SMART ROUTING.scripts/validate_skill_package.py <path> before calling the scaffold complete.assets/skill/skill-procedure-template.md for a private, triggerable internal procedure; use assets/skill/skill-reference-template.md when no trigger-based selection is needed.SKILL.md.graph-metadata.json to a nested workflow or surface packet.surfacePackets[] or another parallel registry array.name or packetSkillName rules.create-skill or create-skill-parent.SKILL.md workflow content, useful resources, and no placeholder examples.modes[] registry, valid router metadata, one root ROUTER.md in a valid stage1-only or active state, and nested packets without packet-local graph metadata.scripts/validate_skill_package.py <path> exits clean, or exact blockers are reported.../shared were applied when quality evidence was needed.Use these only for overflow detail, exhaustive examples, or schema checks beyond the core workflow above.
references/README.md - route map for the full reference set.references/shared/overview.md - deeper anatomy, layered-doc structure, and resource placement guidance.references/skill/creation-workflow.md - expanded examples for the six-step standalone workflow.references/skill/upgrading-a-skill-to-v4.md - adopter guide for reconciling a customized skill to the v4 parent-hub format (convert-vs-keep-single decision, single→parent procedure, sk-code/sk-git cases).references/shared/validation-and-packaging.md - detailed validation, packaging, and distribution notes.references/shared/common-pitfalls.md - examples of recurring trigger, YAML, style, and context-budget defects.references/parent-skill/parent-skills-nested-packets.md - detailed parent-hub and nested-packet model.references/parent-skill/parent-hub-router-schema.md - full router and registry schema.references/parent-skill/compiled-routing-architecture.md - which hubs the compiled router serves, the shadow-child-to-cohort chain, and why --compiled-routing ready mints onboarding evidence, not compiled-serving.assets/skill/skill-md-template.md - standalone skill SKILL.md template.assets/skill/skill-readme-template.md - skill README template.assets/skill/skill-reference-template.md - reference markdown template.assets/skill/skill-asset-template.md - asset markdown template.assets/skill/skill-smart-router.md - resilient smart-router pattern.assets/skill/skill-procedure-template.md - private procedure card templates and guidelines.assets/parent-skill/parent-skill-* - parent hub templates.scripts/init_skill.py - standalone skill scaffold helper.scripts/package_skill.py - validation and packaging helper.../shared/references/core-standards.md - shared markdown standards.../shared/references/validation.md - shared validation workflow.Frequently asked questions
create-skill is the skill-authoring workflow packet of the sk-doc parent hub. It owns standalone OpenCode skill scaffolding and parent-hub scaffolding through two workflow modes: create-skill and create-skill-parent.
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-skill". Inspect the command and pinned source before running it.
Static rules flagged write-files in the source; the page lists the matching lines and excerpts.
Alternatives
garrytan/gbrain
End-to-end discipline for turning any large data source (audio libraries, email takeouts, document corpora, chat exports, API dumps) into brain pages at scale. The lifecycle spine: SCHEMA → ACCESS → TRIAL → EVALUATE → IMPROVE → CODIFY → TEST → SKILLIFY → BULK → MONITOR. State is tracked in a durable JSON manifest (see MANIFEST-PATTERN.md) so any crash, session boundary, or subagent fan-out resumes from ground truth instead of memory.
alirezarezvani/claude-skills
App Store Optimization (ASO) toolkit for researching keywords, analyzing competitor rankings, generating metadata suggestions, and improving app visibility on Apple App Store and Google Play Store. Use when the user asks about ASO, app store rankings, app metadata, app titles and descriptions, app store listings, app visibility, or mobile app marketing on iOS or Android. Supports keyword research and scoring, competitor keyword analysis, metadata optimization, A/B test planning, launch checklist
wanshuiyin/Auto-claude-code-research-in-sleep
Use it for operations and research tasks; the detail page covers purpose, installation, and practical steps.
prowler-cloud/prowler
PostgreSQL indexing best practices for Prowler: index design, partial indexes, partitioned table indexing, EXPLAIN ANALYZE validation, concurrent operations, monitoring, and maintenance. Trigger: When creating or modifying PostgreSQL indexes, analyzing query performance with EXPLAIN, debugging slow queries, reviewing index usage statistics, reindexing, dropping indexes, or working with partitioned table indexes. Also trigger when discussing index strategies, partial indexes, or index maintenance