compile-cli — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited compile-cli (Agent Skill) and scored it 100/100 (green). The audit ran 55 deterministic rules across Security, Supply Chain, Maintenance, Transparency, and Community; it found 0 high-severity and 0 lower-severity findings. The full rule-by-rule trace and per-finding evidence are below. Free, methodology-open.
Findings & checks · 0 flagged
Every scanned point with the score it earned and what moved between them.
First recorded scan — no prior version to compare against.
The primary manifest — the file an agent reads to learn what this artifact does.
Turn any MCP server or SKILL.md file into a compiled standalone Python Click CLI using LiteCLI. This is the self-replicating multiplier — skills become runnable commands that work without Claude.
pip install litecli-compilerRegister any MCP server as a backend, then auto-generate Click commands from its tool schemas.
For a stdio MCP (npx-based):
litecli admin add --id filesystem --type stdio --cmd npx --args "@modelcontextprotocol/server-filesystem /tmp"For an HTTP MCP:
litecli admin add --id myserver --type http --url http://localhost:8200/mcpThe --id value becomes the command prefix. Keep it short and lowercase.
litecli admin discoverOutput shows all registered backends and their available tools:
Backend: filesystem (stdio)
Tools:
- read_file Read a file from the filesystem
- write_file Write content to a file
- list_directory List files in a directory
Backend: myserver (http)
Tools:
- search_docs Search documentation
- run_query Execute a database queryThe dynamic.py module auto-converts JSON Schema to Click commands at runtime. Tools are accessible immediately after registration:
litecli filesystem read-file --path /tmp/notes.txt
litecli filesystem list-directory --path /tmp/
litecli myserver search-docs --query "authentication" --limit 10Tool names use hyphens in CLI form (read_file becomes read-file). Arguments map directly from the JSON Schema properties.
Once you're satisfied with the dynamic commands, snapshot them as static Python:
litecli freezeThis generates compiled/<backend_id>.py for each registered backend — no runtime schema fetching needed, no MCP connection required to run the CLI.
# Register the Kuroryuu gateway
litecli admin add --id kuro --type http --url http://localhost:8200/mcp
# Verify tools discovered
litecli admin discover
# Use a tool
litecli kuro search --query "task management" --limit 5
# Freeze to static
litecli freeze
# → writes compiled/kuro.pyCompile a SKILL.md file into a standalone CLI that runs without LiteCLI or an AI.
Default target is TypeScript — compiled skills produce a .ts file with a defineCommand export compatible with the just-bash runtime. Use --target python to get the legacy Python Click CLI instead.
litecli compile path/to/SKILL.md
# equivalent:
litecli compile path/to/SKILL.md --target typescriptGenerates a .ts file in the same directory as the skill. The compiler reads the skill's steps, extracts API endpoints and parameters, and produces a defineCommand export from just-bash.
Output shape:
import { defineCommand } from "just-bash";
export const skill-name = defineCommand("skill-name", async (args, ctx) => {
// args — parsed from SKILL.md parameter definitions
// ctx.env — auth keys from the just-bash auth bridge (not process.env)
// fetch() — network calls to configured endpoints
// returns { stdout, stderr, exitCode }
});litecli compile path/to/SKILL.md --target pythonGenerates a .py file using Click. Use this when the skill targets environments without the just-bash runtime.
TypeScript-compiled skills run inside the just-bash runtime, which provides:
ctx.env; the runtime resolves keys from the LiteSuite auth store (never process.env)just-bash is an allowed external import; no arbitrary Node moduleslite__shell MCP tool over the agent bridgelitecli compile path/to/SKILL.md --output-dir ./compiled/ --register
# or explicitly:
litecli compile path/to/SKILL.md --target typescript --output-dir ./compiled/ --register--target typescript (default) or --target python selects the output format--output-dir puts the generated file in a specific folder--register adds the compiled CLI to LiteCLI's backend registry so it appears in litecli compiled listlitecli compiled listOutput:
Name Source Status
──────────────── ──────────────────────────── ──────
search-web skills/search-web/SKILL.md ok
send-email skills/send-email/SKILL.md ok
notion-pages skills/notion/SKILL.md oklitecli compiled run search-web --query "LiteCLI documentation"
litecli compiled run send-email --to [email protected] --subject "Hello" --body "Test"
litecli compiled run notion-pages --action list --database-id abc123litecli compiled remove search-webDeletes the generated file (.ts or .py) and removes it from the registry.
# Compile the skill
litecli compile ~/.claude/skills/notion/SKILL.md --output-dir ./compiled/ --register
# List to confirm
litecli compiled list
# Run it
litecli compiled run notion --action create-page --title "Meeting Notes" --parent-id abc123Compile an entire directory of SKILL.md files in one pass.
python scripts/build.py --skills-dir path/to/skills/What it does internally:
categorize.py — classifies each skill as COMPILE or SKIPCOMPILE skill in sequencebuild/compile_report.jsonSkills are marked SKIP when:
compile: false in their YAML frontmatterpython scripts/build.py --skills-dir ~/.claude/skills/
# Or target a specific category subfolder
python scripts/build.py --skills-dir ~/.claude/skills/productivity/Output:
Categorizing skills...
COMPILE notion/SKILL.md
COMPILE search-web/SKILL.md
SKIP brainstorm/SKILL.md (no API endpoints)
SKIP plan-w-quizmaster/SKILL.md (no API endpoints)
COMPILE send-email/SKILL.md
Compiling 3 skills...
[ok] notion → compiled/notion.py
[ok] search-web → compiled/search_web.py
[ok] send-email → compiled/send_email.py
Report written to build/compile_report.jsonCompiled CLIs handle authentication two ways:
Interactive keyring (first use): The first time you run a compiled CLI that needs credentials, it prompts interactively and stores the key in the system keyring. Subsequent runs use the stored key silently.
$ litecli compiled run notion --action list-pages
Notion token not found. Enter your NOTION_TOKEN: ••••••••••••
Token saved to keyring. Won't ask again.Environment variables (CI/scripts): Set the relevant env var to skip the prompt entirely:
export NOTION_TOKEN=secret_abc123
export OPENAI_API_KEY=sk-...
export GITHUB_TOKEN=ghp_...
litecli compiled run notion --action list-pagesStandard env var names are detected automatically from the skill's API configuration.
All compiled CLIs and pipeline errors output structured JSON:
{"error": "Authentication failed", "code": "AUTH_ERROR", "fix": "Set NOTION_TOKEN env var or run with --reset-auth"}
{"error": "Tool not found: read_flie", "code": "TOOL_NOT_FOUND", "fix": "Run 'litecli admin discover' to see available tools"}
{"error": "Connection refused at http://localhost:8200", "code": "BACKEND_UNREACHABLE", "fix": "Check that the MCP server is running"}"Compilation failed: too complex"
This means the skill has too many unrelated API endpoints or external URLs for the compiler to produce a clean CLI. The fix: keep it as a readable agent skill. Not everything needs to be compiled — skills that require judgment, iteration, or multi-step reasoning are better left as AI skills.
"No tools discovered"
# Check the backend is reachable
litecli admin discover --id myserver --verbose
# Re-register with correct args
litecli admin remove --id myserver
litecli admin add --id myserver --type http --url http://localhost:8200/mcp# MCP pipeline
litecli admin add --id <name> --type stdio --cmd npx --args <package>
litecli admin add --id <name> --type http --url <url>
litecli admin discover
litecli <name> <tool-name> [options]
litecli freeze
# SKILL.md pipeline (TypeScript default)
litecli compile path/to/SKILL.md # → .ts (default)
litecli compile path/to/SKILL.md --target typescript # explicit TS
litecli compile path/to/SKILL.md --target python # legacy .py
litecli compile path/to/SKILL.md --output-dir ./compiled/ --register
litecli compiled list
litecli compiled run <name> [args]
litecli compiled remove <name>
# Batch
python scripts/build.py --skills-dir path/to/skills/~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.