senkani skill
Manage HandManifest skill packages — Senkani's canonical capability-package shape. lint validates a manifest against schema v1; export round-trips one manifest into per-harness output (Claude Code, Cursor, Codex, OpenCode, Senkani).
Syntax
Behavior
lint reads a JSON file, decodes it as a HandManifest, and runs 12 invariants the Codable layer can't catch — schema-version pin, identity-field non-empty + kebab-case warning, system_prompt.phases non-empty, guardrails.requires_confirm ⊆ tools[], known cadence.triggers, non-empty egress_allow hosts. Decode failures surface as a single error-severity issue at path (decode). Exit code is 1 on any error-severity issue, 0 otherwise (warnings don't block).
export picks a harness via --target and emits per-harness output to stdout. The exporter gates on the linter — it refuses to emit when lint reports errors. Two targets are first-class: claude-code emits a SKILL.md (YAML frontmatter + ## <Phase> sectioned body); senkani emits a WARP.md with tools: + sandbox: frontmatter so SkillScanner can route the skill without parsing the body. The other three targets emit canonical envelopes pending V.10/V.11 hardening: cursor emits a .mdc rule (frontmatter + body); codex and opencode emit a JSON envelope {harness, manifest} for installer round-trip.
Example
$ senkani skill lint ./code-quality.json OK ./code-quality.json $ senkani skill lint ./broken.json error name: name must be non-empty error system_prompt.phases: system_prompt must have at least one phase error guardrails.requires_confirm[0]: requires_confirm references tool 'exec' that is not declared in tools[] $ senkani skill export --target claude-code ./code-quality.json --- name: code-quality description: Run the project lint + format pipeline. --- ## Preamble You run lint + format and report failures. ## Rules Never modify files without confirmation.
Flags
lint only — emit issues as JSON (array of {severity, path, message}).export only — one of claude-code, cursor, codex, opencode, senkani.Schema v1
The full field list, lint matrix, and exporter status table live at spec/skills.md. Schema v1 is frozen — schema bumps land as HandManifestV2, not in-place edits.
See also
spec/skills.md— schema reference- MCP tools (the
tools[]field references these by name)
Sources/Core/HandManifest.swift, Sources/Core/HandManifestLinter.swift, Sources/Core/HandManifestExporter.swift, Sources/CLI/SkillCommand.swift