Skip to main content
Reference · Information

senkani skill

Live

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

senkani skill lint <path> [--json]
senkani skill export --target <harness> <path>

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_confirmtools[], 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

Flag
Description
--json
false
lint only — emit issues as JSON (array of {severity, path, message}).
--target
enum
required
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

Source: Sources/Core/HandManifest.swift, Sources/Core/HandManifestLinter.swift, Sources/Core/HandManifestExporter.swift, Sources/CLI/SkillCommand.swift