Skip to content

rzkmak/skills

v0.1.0Apache-2.0

Personal agent skills by rzkmak — verifiable, zero-MCP developer workflow skills with embedded evaluation gates.

skills

skills.sh

A personal collection of Zero-MCP agent skills (Agent Plugins 1.0) by rzkmak — verifiable developer workflow skills, each with an embedded evaluation gate, so agents prove their work with plain scripts instead of calling MCP servers at runtime.

Why Zero-MCP?

Runtime tooling here is deliberately boring: stateless bash/python3 scripts inside each skill's scripts/ directory, invoked through the agent's native shell tool. Nothing to install, no servers to keep alive, fully deterministic — and therefore testable in CI. The Context7 MCP server configured in opencode.json is a development-time aid for spec lookups inside OpenCode; it is never shipped with the plugin. The published artifact contains no mcp.json, and scripts/release.sh enforces that policy on every release.

Requirements

  • bash (runtime validators)
  • python3 (evaluation judges — zero third-party dependencies)
  • git (releases only)
  • An agent that supports the Agent Plugins 1.0 layout

Installation

Install a single skill into your agent with the skills CLI (works with OpenCode, Claude Code, Cursor, and 75+ other agents):

npx skills add rzkmak/skills --skill conventional-commit
npx skills add rzkmak/skills --skill implement-go-api
npx skills add rzkmak/skills --skill implement-spring-kotlin-core
npx skills add rzkmak/skills --skill unslop-ai-codebase

Or install every skill in this repo:

npx skills add rzkmak/skills

Or install as an Agent Plugin (for Agent Plugins 1.0 clients):

git clone https://github.com/rzkmak/skills ~/.agents/plugins/skills

The manifest is plugin.json; skills are auto-discovered from skills/.

Skills

SkillEntry pointWhat it does
conventional-commitmodel-invoked + /commit, /commit-pushDraft, split, and validate Conventional Commit messages before committing.
implement-go-apimodel-invokedEnforce a standard domain-modular layout for Go + Gin APIs.
implement-spring-kotlin-coremodel-invokedScaffold and implement Spring Boot 4 + Kotlin 2 backends (Java 25, Spring MVC, Virtual Threads, JPA) with the standard package layout, main / unitTest / functionalTest source sets, and Testcontainers / WireMock / Database Rider boundaries.
unslop-ai-codebase/unslop, /unslop-diff only (disable-model-invocation: true)Remove AI slop from comments, docs, and prose while preserving step markers, background context, and decisions; scripts/check.sh verifies pragmas and runtime code survive the rewrite.

Usage

Agents activate model-invocable skills by the description frontmatter. For example, when drafting a commit message, the conventional-commit skill requires the agent to verify itself before committing:

./skills/conventional-commit/scripts/check-commit-msg.sh "feat(auth): add jwt token refresh endpoint"
# PASS: Valid conventional commit

If the validator exits non-zero, the agent reads stderr, fixes the message, and re-runs — at most 5 times. After 5 failed retries it stops looping and falls back to its own judgment: proceed with stated reasoning that the validator is wrong for the case, or ask the user — never keep guessing.

For large diffs, the skill guides splitting into at most 5 single-purpose commits (from known context, or by inferring purpose from the changes) and validates the whole plan upfront:

./skills/conventional-commit/scripts/check-commit-plan.sh \
  "feat(auth): add jwt token refresh endpoint" \
  "fix(parser): handle empty payload" \
  "docs: explain token refresh flow"
# PASS: Valid commit plan (3 commits, max 5)

Commands (OpenCode & Claude Code)

Skills are invoked by the model when a task matches their description; commands are explicit entry points you type. Skills with disable-model-invocation: true (e.g. unslop-ai-codebase) never trigger on their own — their commands are the only way to run them. This repo serves both:

  • Command templates travel inside each skill (skills/<name>/commands/*.md) — npx skills add copies only skill folders, so that is how they ride along.
  • One installer installs every skill's commands in one action, for both agents:
# from anywhere (clones the repo if needed) — installs globally by default
curl -fsSL https://raw.githubusercontent.com/rzkmak/skills/main/scripts/install-commands.sh | bash

# or from a checkout: scope, agents, repo dir
./scripts/install-commands.sh global opencode,claude-code
./scripts/install-commands.sh project claude-code

Targets: OpenCode .opencode/commands/ (project) or ~/.config/opencode/commands/ (global); Claude Code .claude/commands/ (project) or ~/.claude/commands/ (global). Command filenames must be unique repo-wide; the eval gate keeps shipped templates and installed copies in sync.

Working inside this repo with OpenCode: opencode.json registers "skills": ["./skills"], and the commands work once installed — run ./scripts/install-commands.sh project in this checkout (the installed copies stay untracked, as local working files).

Development (OpenCode + Context7)

This repository is developed inside OpenCode with the Context7 MCP configured in opencode.json for live spec lookups (Agent Skills + Agent Plugins 1.0). That MCP server is a dev-time tool only and is never part of the published plugin. See AGENTS.md for the full authoring rules.

Add a new skill

./scripts/new-skill.sh my-skill "Use when doing X"
# implement rules + scripts + fixtures, then gate it:
./skills/my-skill/evals/run_eval.sh   # must exit 0

The scaffolder generates a working evaluation gate (a passing placeholder validator plus 4 starter fixtures) so every skill is born testable.

Run the eval suite

./skills/conventional-commit/evals/run_eval.sh
./skills/implement-go-api/evals/run_eval.sh
./skills/implement-spring-kotlin-core/evals/run_eval.sh

Optional LLM behavioral evals

Skills may also carry an LLM behavioral suite (evals/run_eval_llm.sh, pytest + deepeval GEval as the judge). The model under test generates behavior with SKILL.md in context; bundled deterministic checkers grade everything they can, and GEval judges only what checkers cannot express (boundary decisions, rationale quality). It is never wired into the deterministic gate, CI, or releases — run it explicitly when changing a skill's guidance:

export OPENAI_BASE_URL=...      # OpenAI-compatible endpoint
export OPENAI_API_KEY=...       # never echoed or written anywhere
export OPENAI_DEFAULT_MODEL=...
./skills/implement-go-api/evals/run_eval_llm.sh

Dependencies install into a gitignored per-skill venv (evals/llm/.venv); a missing environment variable is a loud error, never a silent fallback.

Release

./scripts/release.sh 0.2.0                 # run all skill evals, bump, commit, tag
./scripts/release.sh 0.2.1 --changed-only  # evaluate only skills changed since the last tag

release.sh refuses to run if mcp.json exists in the repo root (Zero-MCP policy), if plugin.json is not valid JSON, or if any skill eval fails.

Layout

.
├── opencode.json            # dev-time config: Context7 MCP + skills source registration
├── .opencode/
│   └── commands/
│       └── commit.md        # /commit — explicit entry into the conventional-commit skill
├── plugin.json              # Agent Plugins 1.0 manifest (Zero-MCP: no mcp.json)
├── AGENTS.md                # authoring guide for OpenCode agents
├── README.md
├── scripts/
│   ├── new-skill.sh         # scaffold a skill + eval gate
│   ├── install-commands.sh  # install all skills' commands for OpenCode/Claude Code
│   └── release.sh           # evals, version bump, git tag
└── skills/
    ├── conventional-commit/
    │   ├── SKILL.md
    │   ├── commands/
    │   │   ├── commit.md      # /commit template (travels with the skill)
    │   │   └── commit-push.md # /commit-push template
    │   ├── scripts/
    │   │   ├── check-commit-msg.sh
    │   │   └── check-commit-plan.sh
    │   └── evals/
    │       ├── dataset.jsonl
    │       ├── judge.py
    │       └── run_eval.sh
    ├── implement-go-api/
    │       ├── SKILL.md          # domain-modular layout standard for Go + Gin
    │       ├── scripts/
    │       │   ├── check_layout.sh   # validate a whole project directory
    │       │   └── check_snippet.sh  # validate a single Go file
    │       └── evals/
    │           ├── dataset.jsonl
    │           ├── fixtures/     # valid + invalid sample projects and snippets
    │           ├── judge.py
    │           ├── run_eval.sh   # deterministic gate (must exit 0)
    │           └── llm/          # optional behavioral suite (deepeval GEval)
    │               ├── test_implement_go_api.py
    │               └── .venv/    # gitignored, created by run_eval_llm.sh
    ├── implement-spring-kotlin-core/
    │   ├── SKILL.md          # Spring Boot 4 + Kotlin 2 layout and testing standard
    │   ├── references/
    │   │   └── architecture-and-examples.md  # layered architecture patterns + code examples
    │   ├── scripts/
    │   │   ├── check-layout.sh   # source sets + 10 standard packages, src/test forbidden
    │   │   └── check-source.sh   # layer boundaries, namespace + annotation rules
    │   └── evals/
    │       ├── dataset.jsonl
    │       ├── judge.py
    │       ├── run_eval.sh   # deterministic gate (must exit 0)
    │       └── llm/          # optional behavioral suite (deepeval GEval)
    │           ├── test_skill_behavior.py
    │           └── .venv/    # gitignored, created by run_eval_llm.sh
    └── unslop-ai-codebase/
        ├── SKILL.md          # prune AI slop from comments/docs; disable-model-invocation
        ├── commands/
        │   ├── unslop.md         # /unslop template
        │   └── unslop-diff.md    # /unslop-diff template (uncommitted changes only)
        ├── scripts/
        │   └── check.sh          # pragmas intact + runtime code unchanged after rewrite
        └── evals/
            ├── dataset.jsonl
            ├── fixtures/         # before/after rewrite samples (pass + fail)
            ├── judge.py
            └── run_eval.sh       # deterministic gate (must exit 0)