{"id":40185543,"url":"https://github.com/iwillig/clojure-skills","last_synced_at":"2026-01-19T19:04:40.479Z","repository":{"id":322911363,"uuid":"1091392962","full_name":"iwillig/clojure-skills","owner":"iwillig","description":"A collection of Skills and Prompts for working with Clojure","archived":false,"fork":false,"pushed_at":"2025-12-05T13:33:15.000Z","size":5349,"stargazers_count":13,"open_issues_count":1,"forks_count":2,"subscribers_count":0,"default_branch":"main","last_synced_at":"2025-12-05T23:05:23.406Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"Clojure","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/iwillig.png","metadata":{"files":{"readme":"readme.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":"AGENTS.md","dco":null,"cla":null}},"created_at":"2025-11-07T00:37:43.000Z","updated_at":"2025-12-05T19:26:06.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/iwillig/clojure-skills","commit_stats":null,"previous_names":["iwillig/clojure-skills"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/iwillig/clojure-skills","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/iwillig%2Fclojure-skills","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/iwillig%2Fclojure-skills/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/iwillig%2Fclojure-skills/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/iwillig%2Fclojure-skills/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/iwillig","download_url":"https://codeload.github.com/iwillig/clojure-skills/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/iwillig%2Fclojure-skills/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":28580690,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-01-19T18:52:07.356Z","status":"ssl_error","status_checked_at":"2026-01-19T18:49:52.190Z","response_time":67,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.6:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2026-01-19T19:04:39.412Z","updated_at":"2026-01-19T19:04:40.467Z","avatar_url":"https://github.com/iwillig.png","language":"Clojure","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Clojure Skills\n\nA searchable knowledge base of Clojure development skills with a\npowerful CLI for finding, viewing, and managing reusable prompt\nfragments for AI coding agents.\n\n**Warning** This project is using itself, and therefor is more \"vibe\"\ncoded then it should be. I need a test bed for the project and as a\nresult some things are messy. Contributions welcome!\n\n**Quick Links:**\n\n  - [Quick Start](#quick-start) - Get started in 5 minutes\n  - [Installation](#installation) - Detailed installation guide\n  - [CLI Usage](#cli-usage) - Search and explore 78 skills\n  - [REPL-Driven Development](#repl-driven-development-with-mcp-light) - Using clj-nrepl-eval\n  - [For LLM Agents](AGENTS.md) - Comprehensive agent guide\n  - [Creating Skills](SKILL_CREATION_GUIDE.md) - Guide for adding new skills\n\n---\n\n## What Is This?\n\n**Clojure Skills** is a curated collection of 78 skills covering\nClojure development, organized in a SQLite database with full-text\nsearch. Each skill is a focused markdown document teaching a specific\ntopic:\n\n- **Language fundamentals** - Clojure intro, REPL-driven development\n- **Libraries** (50+) - Malli, next.jdbc, http-kit, Ring, Kaocha, and more\n- **Testing frameworks** - Kaocha, test.check, scope-capture\n- **Development tools** - clj-kondo, CIDER, nRepl, Babashka\n\nSkills can be searched, viewed individually, or composed together into\ncomplete teaching prompts for AI agents.\n\n**Core features:**\n\n - Full-text search with SQLite FTS5\n - 78 skills across 29 categories\n - **CLI tool with JSON output** - pipe to `jq` for easy processing\n - Build system for composing custom prompts\n - **REPL-driven development workflow with clj-nrepl-eval**\n\n### Designed for REPL-Driven Development\n\nThis project is built around [clojure-mcp-light](https://github.com/bhauman/clojure-mcp-light),\nwhich provides `clj-nrepl-eval` - a command-line tool for evaluating Clojure code via nREPL.\n**All skills and prompts assume you're using this workflow.**\n\n**Why MCP-light?**\n\n- **Instant feedback** - Evaluate code directly from command line\n- **Test before committing** - Validate code in REPL before editing files\n- **AI agent integration** - Perfect for LLM-driven development\n- **Automatic delimiter repair** - Fixes common syntax errors\n- **Persistent sessions** - State maintained across invocations\n\n**Install MCP-light:**\n\n```bash\nbbin install https://github.com/bhauman/clojure-mcp-light.git --tag v0.2.0\nbbin install https://github.com/bhauman/clojure-mcp-light.git --tag v0.2.0 \\\n  --as clj-nrepl-eval \\\n  --main-opts '[\"-m\" \"clojure-mcp-light.nrepl-eval\"]'\n```\n\nLets also install clj-paren-repair\n\n```bash\nbbin install https://github.com/bhauman/clojure-mcp-light.git --as clj-paren-repair --main-opts '[\"-m\"  \"clojure-mcp-light.paren-repair\"]'\n```\n\nSee the [REPL-Driven Development](#repl-driven-development-with-mcp-light) section below for details.\n\n---\n\n## Quick Start\n\nGet started searching and using skills in 5 minutes:\n\n### 1. Install Clojure and Babashka (2 minutes)\n\n```bash\n# macOS\nbrew install clojure babashka\n\n# Fedora/RHEL/CentOS\nsudo dnf install clojure java-latest-openjdk\n\n# Ubuntu/Debian\nsudo apt install clojure openjdk-21-jdk\n```\n\nYou will also need to\n[install](https://www.graalvm.org/latest/getting-started/macos/) the\nGraalVM.\n\nIf you have `sdkman` install, you can install\n\n```bash\nsdk install java 25.0.1-graal\nsdk env\n```\n\n**Verify installation:**\n\n```bash\nclojure --version\n# Should show: Clojure CLI version...\n\nbb --version\n# Should show: babashka v...\n```\n\n### 2. Install MCP-light for REPL workflow (1 minute)\n\n```bash\nbbin install https://github.com/bhauman/clojure-mcp-light.git --tag v0.2.0\nbbin install https://github.com/bhauman/clojure-mcp-light.git --tag v0.2.0 \\\n  --as clj-nrepl-eval \\\n  --main-opts '[\"-m\" \"clojure-mcp-light.nrepl-eval\"]'\n```\n\n**Verify installation:**\n\n```bash\nclj-nrepl-eval --help\n# Should show: clojure-mcp-light nREPL client...\n```\n\n### 3. Install clojure-skills CLI (1 minute)\n\n```bash\n# Clone repository\ngit clone https://github.com/yourusername/clojure-skills.git\ncd clojure-skills\n\n# Initialize database\nclojure -M:main db init\n\n# Sync skills to database\nclojure -M:main db sync\n```\n\n**Verify installation:**\n\n```bash\nclojure -M:main db stats\n# Should show: 78 skills, 7 prompts, 29 categories\n```\n\n### 4. Search for a skill (30 seconds)\n\n```bash\n# Search returns JSON with matching skills\nclojure -M:main skill search \"validation\"\n\n# Format with jq to show just names\nclojure -M:main skill search \"validation\" | jq -r '.skills[].name'\n# Output: malli, spec, schema...\n\n# Use human-readable format\nclojure -M:main -H skill search \"validation\"\n```\n\n### 5. View a skill (30 seconds)\n\n```bash\n# Show skill (returns JSON with full content)\nclojure -M:main skill show malli -c libraries/data_validation\n\n# Extract just the markdown content\nclojure -M:main skill show malli | jq -r '.data.content'\n# Displays full Malli validation skill\n\n# Use human-readable format\nclojure -M:main -H skill show malli\n```\n\n**Next steps:**\n- See [CLI Usage](#cli-usage) for all available commands (all output JSON)\n- Learn [JSON Output and jq Integration](#json-output-and-jq-integration) for processing results\n- Read [REPL-Driven Development](#repl-driven-development-with-mcp-light) to use clj-nrepl-eval\n- Explore [Building Prompts](#building-prompts) to compose custom agents\n\n---\n\n## Installation\n\nDetailed installation instructions for different use cases.\n\n### Prerequisites\n\n**For basic usage (searching skills):**\n- Clojure CLI\n- Babashka (optional but recommended)\n- MCP-light (clj-nrepl-eval)\n\n**For building prompts:**\n- All of the above, plus:\n- pandoc\n- yq\n\n**For development (contributing):**\n- All of the above, plus:\n- GraalVM (for native binary)\n- typos-cli (spell checking)\n\n### System Dependencies\n\n**macOS (Homebrew):**\n\n```bash\nbrew install clojure babashka pandoc yq typos-cli\n\n# Or use the Brewfile\nbrew bundle\n```\n\n**Fedora/RHEL/CentOS:**\n\n```bash\nsudo dnf install clojure java-latest-openjdk pandoc\n```\n\n**Ubuntu/Debian:**\n\n```bash\nsudo apt install clojure openjdk-21-jdk pandoc\n```\n\n**Note:** Babashka is optional but recommended for running build tasks. If you skip it, you can use `make` instead.\n\n### MCP-light Installation\n\nInstall clojure-mcp-light for REPL-driven development:\n\n```bash\nbbin install https://github.com/bhauman/clojure-mcp-light.git --tag v0.2.0\nbbin install https://github.com/bhauman/clojure-mcp-light.git --tag v0.2.0 \\\n  --as clj-nrepl-eval \\\n  --main-opts '[\"-m\" \"clojure-mcp-light.nrepl-eval\"]'\n```\n\nSee: https://github.com/bhauman/clojure-mcp-light#readme\n\n**Verify:**\n\n```bash\nclj-nrepl-eval --version\n# Should show version information\n```\n\n### Build and Install CLI\n\n```bash\n# Clone repository\ngit clone https://github.com/yourusername/clojure-skills.git\ncd clojure-skills\n\n# Initialize the database (creates schema)\nclojure -M:main db init\n\n# Sync skills to database (loads all skills from filesystem)\nclojure -M:main db sync\n\n# Build native binary (recommended for speed)\nbb build-cli\n\n# Or create an alias to use directly\nalias clojure-skills='clojure -M:main'\n```\n\nThe native binary will be created at `target/clojure-skills` and can be moved to your PATH.\n\n**Verify installation:**\n\n```bash\nclojure-skills db stats\n\n# Should show (JSON output):\n# {\n#   \"type\": \"database-statistics\",\n#   \"database\": {\n#     \"skills\": 78,\n#     \"prompts\": 7,\n#     \"categories\": 29,\n#     \"total-size-bytes\": 1018000,\n#     \"total-tokens\": 250000\n#   }\n# }\n\n# Or use human-readable format:\nclojure-skills -H db stats\n```\n\n---\n\n## CLI Usage\n\nThe `clojure-skills` CLI provides hierarchical subcommands for managing skills, prompts, and the database. All commands output structured JSON by default, making it easy to pipe to `jq` for filtering and processing.\n\n### Command Structure\n\n```bash\nclojure-skills [global-options] \u003ccommand\u003e [command-options] [arguments...]\n```\n\n**Main commands:**\n- `db` - Database operations (init, sync, reset, stats)\n- `skill` - Skill operations (search, list, show)\n- `prompt` - Prompt operations (search, list, show, render)\n\n**Global options:**\n- `-j, --json` - Output as JSON (default)\n- `-H, --human` - Output in human-readable format\n- `-?, --help` - Show help\n\n### Quick Reference\n\n**Most common commands:**\n\n```bash\n# Search for skills\nclojure-skills skill search \"topic\"\n\n# List skills in a category\nclojure-skills skill list -c libraries/database\n\n# View a skill's content\nclojure-skills skill show malli | jq -r '.data.content'\n\n# Search prompts\nclojure-skills prompt search \"agent\"\n\n# Render a prompt as markdown\nclojure-skills prompt render clojure_build\n\n# Database operations\nclojure-skills db sync\nclojure-skills db stats\n```\n\n### Quick Start\n\n```bash\n# Get help for any command\nclojure-skills --help\nclojure-skills db --help\nclojure-skills skill --help\nclojure-skills prompt --help\n\n# Search for skills about a topic (returns JSON)\nclojure-skills skill search \"validation\"\nclojure-skills skill search \"validation\" | jq '.count'\n\n# List all skills in a category\nclojure-skills skill list -c libraries/database\nclojure-skills skill list -c libraries/database | jq '.skills[].name'\n\n# View a skill's full content (returns JSON)\nclojure-skills skill show malli -c libraries/data_validation\nclojure-skills skill show malli | jq -r '.data.content'\n\n# Get database statistics\nclojure-skills db stats\nclojure-skills db stats | jq '.database'\n\n# Render a prompt as plain markdown (new in v0.1.0)\nclojure-skills prompt render clojure_build\nclojure-skills prompt render clojure_skill_builder \u003e my-prompt.md\n\n# Use human-readable output format\nclojure-skills -H skill list\nclojure-skills --human db stats\n```\n\n**All commands output JSON by default** - pipe to `jq` for human-readable formatting or use `-H` flag for human-readable output.\n\n### Database Commands\n\n**Initialize and manage the database:**\n\n```bash\n# Initialize database (first time setup)\nclojure-skills db init\n\n# Sync skills and prompts from filesystem to database\nclojure-skills db sync\n\n# Show database statistics\nclojure-skills db stats\n\n# Reset database (WARNING: destructive - requires --force flag)\nclojure-skills db reset --force\n```\n\n### Searching Skills\n\n**Full-text search using SQLite FTS5:**\n\n```bash\n# Search all skills (returns JSON)\nclojure-skills skill search \"http server\"\n\n# Search within a specific category\nclojure-skills skill search \"query\" -c libraries/database\nclojure-skills skill search \"validation\" -c libraries/data_validation\n\n# Limit number of results (default: 50)\nclojure-skills skill search \"database\" -n 10\nclojure-skills skill search \"testing\" --max-results 20\n\n# Search prompts\nclojure-skills prompt search \"agent\"\nclojure-skills prompt search \"builder\"\n```\n\n**Search command options:**\n- `-c, --category CATEGORY` - Filter by category (e.g., 'libraries/database')\n- `-n, --max-results N` - Maximum results to return (default: 50)\n\n**Example output (JSON):**\n\n```json\n{\n  \"type\": \"skill-search-results\",\n  \"query\": \"validation\",\n  \"category\": null,\n  \"count\": 5,\n  \"skills\": [\n    {\n      \"name\": \"malli\",\n      \"category\": \"libraries/data_validation\",\n      \"size-bytes\": 11059,\n      \"token-count\": 2772\n    },\n    {\n      \"name\": \"spec\",\n      \"category\": \"libraries/data_validation\",\n      \"size-bytes\": 21161,\n      \"token-count\": 5291\n    }\n  ]\n}\n```\n\n**Format with jq for readability:**\n\n```bash\n# Get just the skill names\nclojure-skills skill search \"validation\" | jq -r '.skills[].name'\n# malli\n# spec\n# buddy\n# cli_matic\n\n# Count results\nclojure-skills skill search \"validation\" | jq '.count'\n# 5\n\n# Format as table\nclojure-skills skill search \"validation\" | \\\n  jq -r '.skills[] | \"\\(.name)\\t\\(.category)\\t\\(.\\\"token-count\\\")\"'\n```\n\n### Listing Skills\n\n**List all skills with metadata (returns JSON):**\n\n```bash\n# Get all skills as JSON\nclojure-skills skill list\n\n# Count total skills\nclojure-skills skill list | jq '.count'\n\n# Get skill names only\nclojure-skills skill list | jq -r '.skills[].name'\n\n# Calculate total tokens\nclojure-skills skill list | jq '[.skills[].\"token-count\"] | add'\n```\n\n**List by category:**\n\n```bash\n# Database skills\nclojure-skills skill list -c libraries/database\nclojure-skills skill list --category libraries/database | jq '.skills'\n\n# Testing skills\nclojure-skills skill list -c testing | jq '.skills[].name'\n\n# Language fundamentals\nclojure-skills skill list -c language | jq '.skills'\n```\n\n**List command options:**\n- `-c, --category CATEGORY` - Filter by category\n\n**Available categories:**\n\n```\nlanguage/              - Core Clojure concepts\nclojure_mcp/           - REPL tools (clj-nrepl-eval)\nlibraries/async/       - core.async, manifold\nlibraries/cli/         - cli-matic\nlibraries/database/    - next.jdbc, honeysql, ragtime, sqlite\nlibraries/data_validation/ - malli, spec\nlibraries/http_servers/    - http-kit, ring, pedestal\nlibraries/rest_api/    - reitit, liberator, bidi\nlibraries/testing/     - kaocha, test.check\ntooling/               - cider, clj-kondo, babashka\n... and 20 more categories\n```\n\n### Viewing Skills\n\n**Show a skill's full content (returns JSON):**\n\n```bash\n# Basic usage - show skill by name (returns JSON)\nclojure-skills skill show malli\nclojure-skills skill show next_jdbc\n\n# Specify category to avoid ambiguity\nclojure-skills skill show malli -c libraries/data_validation\nclojure-skills skill show malli --category libraries/data_validation\n\n# Extract just the content as markdown\nclojure-skills skill show malli | jq -r '.data.content'\n\n# Get metadata only\nclojure-skills skill show malli | jq '.data | {name, category, size: .size_bytes, tokens: .token_count}'\n\n# Extract specific fields\nclojure-skills skill show malli | jq -r '.data.description'\nclojure-skills skill show malli | jq '.data.token_count'\n```\n\n**Show command options:**\n- `-c, --category CATEGORY` - Filter by category (useful when skill names are ambiguous)\n\n**Output is JSON with:**\n- `.type` - Always \"skill\"\n- `.data` - Skill object containing:\n  - `.content` - Full markdown content\n  - `.name` - Skill name\n  - `.category` - Category path\n  - `.size_bytes` - File size in bytes\n  - `.token_count` - Estimated token count\n  - `.created_at`, `.updated_at` - Timestamps\n  - `.file_hash` - SHA256 hash of content\n\n### Working with Prompts\n\n**Search prompts:**\n\n```bash\n# Search all prompts\nclojure-skills prompt search \"agent\"\nclojure-skills prompt search \"builder\"\n\n# Limit results\nclojure-skills prompt search \"clojure\" -n 5\n```\n\n**List all prompts:**\n\n```bash\n# Get all prompts as JSON\nclojure-skills prompt list\n\n# Extract prompt names\nclojure-skills prompt list | jq -r '.prompts[].name'\n\n# Count prompts\nclojure-skills prompt list | jq '.count'\n```\n\n**Show prompt details (JSON):**\n\n```bash\n# Show prompt with metadata and associated skills\nclojure-skills prompt show clojure_build\nclojure-skills prompt show clojure_skill_builder\n\n# Extract just the content\nclojure-skills prompt show clojure_build | jq -r '.data.content'\n\n# View associated skills\nclojure-skills prompt show clojure_build | jq '.data.skills'\n```\n\n**Render prompt as plain markdown:**\n\n```bash\n# Render prompt with all skills composed together\nclojure-skills prompt render clojure_build\n\n# Save to file\nclojure-skills prompt render clojure_skill_builder \u003e my-prompt.md\n\n# Combine with other tools\nclojure-skills prompt render clojure_build | wc -l\n```\n\n**Difference between `show` and `render`:**\n- `prompt show` - Returns JSON with metadata, content, and skill list\n- `prompt render` - Returns plain markdown with all skills composed together (useful for copying to clipboard or saving to file)\n\n### Database Statistics\n\n**View overall statistics (returns JSON):**\n\n```bash\n# Get all stats as JSON\nclojure-skills db stats\n\n# Extract specific stats\nclojure-skills db stats | jq '.database'\nclojure-skills db stats | jq '.database.skills'\nclojure-skills db stats | jq '.configuration'\n\n# Format nicely\nclojure-skills db stats | jq '{\n  skills: .database.skills,\n  prompts: .database.prompts,\n  categories: .database.categories,\n  total_tokens: .database.\"total-tokens\"\n}'\n```\n\n**JSON output includes:**\n\n- Database stats (skills, prompts, categories, total size/tokens)\n- Configuration (database path, directories, settings)\n- Category breakdown with counts\n\n### Output Formats\n\n**The CLI supports two output formats:**\n\n1. **JSON format** (default, `-j` or `--json`)\n   - Structured data for programmatic processing\n   - Easy to pipe to `jq`\n   - All fields available\n\n2. **Human-readable format** (`-H` or `--human`)\n   - Formatted for terminal display\n   - Tables and readable layout\n   - Useful for quick browsing\n\n**Examples:**\n\n```bash\n# JSON output (default)\nclojure-skills skill list\nclojure-skills -j skill list    # Explicit\n\n# Human-readable output\nclojure-skills -H skill list\nclojure-skills --human db stats\n\n# Format applies to all subcommands\nclojure-skills -H skill search \"validation\"\nclojure-skills -H prompt show clojure_build\n```\n\n### JSON Output and jq Integration\n\n**All CLI commands output structured JSON by default** making it easy to process programmatically or pipe to `jq`.\n\n**Common jq patterns:**\n\n```bash\n# Extract specific fields\nclojure-skills skill list | jq '.count'\nclojure-skills skill list | jq '.skills[0].name'\n\n# Filter by condition\nclojure-skills skill list | jq '.skills[] | select(.category | startswith(\"libraries\"))'\n\n# Get array of values\nclojure-skills skill list | jq '[.skills[].name]'\n\n# Calculate aggregates\nclojure-skills skill list | jq '[.skills[].\"token-count\"] | add'\n\n# Format as table\nclojure-skills skill list | jq -r '.skills[] | \"\\(.name)\\t\\(.category)\"'\n\n# Pretty print with colors\nclojure-skills skill show malli | jq '.'\n```\n\n**Example: Find all database-related skills**\n\n```bash\nclojure-skills skill list | \\\n  jq '.skills[] | select(.category | contains(\"database\")) | {name, tokens: .\"token-count\"}'\n```\n\n**Example: Compare skill sizes**\n\n```bash\n# Top 10 largest skills by token count\nclojure-skills skill list | \\\n  jq -r '.skills | sort_by(.\"token-count\") | reverse | .[0:10] | .[] | \"\\(.\"token-count\")\\t\\(.name)\"'\n\n# Skills over 3000 tokens\nclojure-skills skill list | \\\n  jq '.skills[] | select(.\"token-count\" \u003e 3000) | {name, tokens: .\"token-count\"}'\n```\n\n**Testing JSON output:**\n\n```bash\n# Run integration tests\n./test-jq-integration.sh\n# Tests all commands work correctly with jq\n```\n\n### CLI Command Reference\n\n**Complete command reference table:**\n\n| Command | Description | Options |\n|---------|-------------|---------|\n| **Database Commands** |\n| `db init` | Initialize database with schema | None |\n| `db sync` | Sync skills/prompts from filesystem | None |\n| `db stats` | Show database statistics | None |\n| `db reset --force` | Reset database (destructive) | `--force` (required) |\n| **Skill Commands** |\n| `skill search QUERY` | Search skills using FTS5 | `-c, --category`, `-n, --max-results` |\n| `skill list` | List all skills | `-c, --category` |\n| `skill show NAME` | Display skill content | `-c, --category` |\n| **Prompt Commands** |\n| `prompt search QUERY` | Search prompts using FTS5 | `-n, --max-results` |\n| `prompt list` | List all prompts | None |\n| `prompt show NAME` | Display prompt with metadata | None |\n| `prompt render NAME` | Render prompt as plain markdown | None |\n| **Global Options** |\n| `-j, --json` | Output as JSON (default) | All commands |\n| `-H, --human` | Output in human-readable format | All commands |\n| `-?, --help` | Show help | All commands |\n\n### Database Management\n\n**Sync skills from filesystem:**\n\n```bash\n# After adding or modifying skill files\nclojure-skills db sync\n\n# Check sync results\nclojure-skills db stats\n```\n\n**Reset database (destructive):**\n\n```bash\n# Requires --force flag for safety\nclojure-skills db reset --force\n\n# Re-initialize after reset\nclojure-skills db init\nclojure-skills db sync\n```\n\n### Common CLI Issues\n\n**\"No such skill found\"**\n\n```bash\n# Problem: Skill name might be ambiguous or in a different category\nclojure-skills skill show http_kit\n# ERROR: Multiple skills found with name 'http_kit'\n\n# Solution: Specify category\nclojure-skills skill show http_kit -c http_servers\n```\n\n**\"Database not initialized\"**\n\n```bash\n# Problem: Database hasn't been created yet\nclojure-skills skill search \"test\"\n# ERROR: Database file not found\n\n# Solution: Initialize and sync\nclojure-skills db init\nclojure-skills db sync\n```\n\n**\"Empty search results\"**\n\n```bash\n# Problem: Search term too specific or no matches\nclojure-skills skill search \"nonexistent-library\"\n# Returns: {\"count\": 0, \"skills\": []}\n\n# Solution: Try broader search terms\nclojure-skills skill search \"database\"\nclojure-skills skill search \"validation\"\n```\n\n**\"jq: parse error\"**\n\n```bash\n# Problem: Command doesn't output JSON\nclojure-skills prompt render clojure_build | jq '.'\n# ERROR: parse error (render outputs plain markdown, not JSON)\n\n# Solution: Use show instead for JSON output\nclojure-skills prompt show clojure_build | jq '.'\n\n# Or don't pipe render to jq\nclojure-skills prompt render clojure_build \u003e output.md\n```\n\n### Command Permissions\n\nYou can disable specific CLI commands by configuring permissions in your config file. This is useful for restricting dangerous operations in shared environments or creating custom CLI distributions.\n\n**Configuration format:**\n\nAdd a `:permissions` section to your `~/.config/clojure-skills/config.edn` file:\n\n```edn\n{:permissions\n {:db {:reset false}}}\n```\n\nIn this example:\n- `clojure-skills db reset` will be completely hidden from the CLI\n- All other commands remain available\n\n**Permission rules:**\n- Commands are identified by their full path (e.g., `:db :reset`)\n- `false` disables the command (completely hides it)\n- `true` or omitting the key enables the command\n- Nested command structures are preserved\n\n**Top-level command disabling:**\n\nYou can also disable entire command trees with a single setting:\n\n```edn\n{:permissions\n {:db {:reset false}}}\n```\n\nWith this configuration:\n- `clojure-skills db reset` will be hidden\n- The entire `db` command will be completely removed from the CLI\n\n**Example configuration to disable all destructive operations:**\n\nUsing top-level disabling for simpler configuration:\n\n```edn\n{:permissions\n {:db {:reset false}}}\n```\n\n**Applying configuration:**\n\n1. Edit your config file:\n   ```bash\n   # Create config if it doesn't exist\n   clojure-skills db init\n\n   # Edit the config file\n   nano ~/.config/clojure-skills/config.edn\n   ```\n\n2. Add the permissions configuration as shown above\n\n3. The changes take effect immediately - no restart required\n\n**Verification:**\n\nAfter applying permissions, disabled commands will no longer appear in help text:\n\n```bash\n# Before permissions - shows reset command\nclojure-skills db --help\n\n# After permissions - reset command is hidden\nclojure-skills db --help\n```\n\n---\n\n## REPL-Driven Development with MCP-Light\n\nThis project is designed around a REPL-first workflow using `clj-nrepl-eval` from\n[clojure-mcp-light](https://github.com/bhauman/clojure-mcp-light). **All skills and\nprompts assume you're using this tool for interactive development.**\n\n### What is clj-nrepl-eval?\n\n`clj-nrepl-eval` is a command-line nREPL client that lets you evaluate Clojure code\nfrom the terminal with automatic delimiter repair and persistent sessions.\n\n**Key features:**\n\n- **Command-line REPL** - Evaluate code without opening an editor\n- **Automatic delimiter repair** - Fixes missing/mismatched parentheses using parinfer\n- **Persistent sessions** - State maintained across command invocations\n- **Server discovery** - Automatically finds running nREPL servers\n- **Perfect for AI agents** - Ideal for LLM-driven development workflows\n\n### Quick Example\n\n```bash\n# Start an nREPL server\nbb nrepl\n# Started nREPL server on port 7889\n\n# Discover running servers\nclj-nrepl-eval --discover-ports\n# localhost:7889 (bb)\n\n# Evaluate code directly\nclj-nrepl-eval -p 7889 \"(+ 1 2 3)\"\n# =\u003e 6\n\n# Automatic delimiter repair\nclj-nrepl-eval -p 7889 \"(defn add [x y] (+ x y\"\n# Automatically fixed to: (defn add [x y] (+ x y))\n# =\u003e #'user/add\n\n# Test the function\nclj-nrepl-eval -p 7889 \"(add 10 20)\"\n# =\u003e 30\n```\n\n### Typical Workflow\n\n1. **Start nREPL server:**\n   ```bash\n   bb nrepl  # Starts on port 7889\n   ```\n\n2. **Explore and prototype:**\n   ```bash\n   # Discover what's available\n   clj-nrepl-eval -p 7889 \"(all-ns)\"\n\n   # Test your hypothesis\n   clj-nrepl-eval -p 7889 \"(require '[clojure.string :as str])\"\n   clj-nrepl-eval -p 7889 \"(str/upper-case \\\"hello\\\")\"\n   # =\u003e \"HELLO\"\n   ```\n\n3. **Build incrementally:**\n   ```bash\n   # Define a function\n   clj-nrepl-eval -p 7889 \"(defn validate-email [email]\n     (re-matches #\\\".+@.+\\\\..+\\\" email))\"\n\n   # Test it immediately\n   clj-nrepl-eval -p 7889 \"(validate-email \\\"user@example.com\\\")\"\n   # =\u003e \"user@example.com\"\n\n   clj-nrepl-eval -p 7889 \"(validate-email \\\"invalid\\\")\"\n   # =\u003e nil\n   ```\n\n4. **Only after validation, edit files** - Use your editor to save validated code\n\n5. **Reload and verify:**\n   ```bash\n   clj-nrepl-eval -p 7889 \"(require '[my.namespace :reload])\"\n   clj-nrepl-eval -p 7889 \"(my.namespace/validate-email \\\"test@example.com\\\")\"\n   ```\n\n### Why This Workflow?\n\n**Traditional approach:** Write code → Save file → Reload → Test → Fix → Repeat\n\n**REPL-first approach:** Test in REPL → Validate works → Save to file → Done\n\n**Benefits:**\n\n- **Faster feedback** - Know immediately if code works\n- **Fewer errors** - Test before committing to files\n- **Better understanding** - Explore libraries interactively\n- **AI-friendly** - Perfect for LLM-generated code validation\n\n### Integration with Skills\n\nEvery skill in this repository includes REPL-based examples. When learning a new\nlibrary or technique:\n\n1. Search for the skill: `clojure-skills skill search \"validation\"`\n2. View the skill content: `clojure-skills skill show malli`\n3. Copy examples to test with `clj-nrepl-eval`\n4. Adapt to your use case interactively\n5. Save working code to your project\n\n### Installation\n\nSee the [MCP-light Installation](#mcp-light-installation) section above for installation instructions.\n\n**Full documentation:** https://github.com/bhauman/clojure-mcp-light#readme\n\n---\n\n\n\n---\n\n## Skills Organization\n\nSkills are organized by category in the `skills/` directory:\n\n```\nskills/\n├── language/              # Clojure fundamentals (2 skills)\n│   ├── clojure_intro.md      - Immutability, functions, data structures\n│   └── clojure_repl.md       - REPL-driven development\n│\n├── clojure_mcp/           # REPL tools (1 skill)\n│   └── clojure_eval.md       - Using clj-nrepl-eval for REPL evaluation\n│\n├── libraries/             # Library guides (50+ skills)\n│   ├── async/\n│   │   ├── core_async.md\n│   │   └── manifold.md\n│   ├── cli/\n│   │   └── cli_matic.md\n│   ├── database/\n│   │   ├── next_jdbc.md      - JDBC database access\n│   │   ├── honeysql.md       - SQL as Clojure data\n│   │   ├── ragtime.md        - Database migrations\n│   │   └── sqlite_jdbc.md    - SQLite driver\n│   ├── data_validation/\n│   │   ├── malli.md          - Schema validation\n│   │   └── spec.md           - clojure.spec\n│   ├── http_servers/\n│   │   ├── http_kit.md       - Async HTTP server\n│   │   ├── ring.md           - Web abstractions\n│   │   └── pedestal.md       - Full web framework\n│   └── ... (27 more categories)\n│\n├── testing/               # Test frameworks (9 skills)\n│   ├── kaocha.md             - Modern test runner\n│   ├── test_check.md         - Property-based testing\n│   └── scope_capture.md      - Debug test failures\n│\n└── tooling/               # Development tools (15 skills)\n    ├── babashka.md           - Fast scripting\n    ├── clj_kondo.md          - Linting\n    ├── cider.md              - Emacs integration\n    └── nrepl.md              - REPL protocol\n```\n\n### Skill Structure\n\nEach skill is a self-contained markdown document with:\n\n```markdown\n---\nname: skill_name\ndescription: |\n  Brief description. When to use: key terms users might mention.\n---\n\n# Skill Title\n\n## Quick Start\n[5-minute working example]\n\n## Core Concepts\n[Essential understanding]\n\n## Common Workflows\n[3-5 practical patterns with code]\n\n## Best Practices\n[Do's and don'ts]\n\n## Troubleshooting\n[Common issues and solutions]\n```\n\n---\n\n## Building Prompts\n\nSkills can be composed into complete prompts for AI agents.\n\n### Prompt Templates\n\nCreate a prompt template in `prompts/`:\n\n```markdown\n---\ntitle: My Custom Agent\nauthor: Your Name\ndate: 2025-11-17\nsections:\n  - skills/language/clojure_intro.md\n  - skills/libraries/data_validation/malli.md\n  - skills/libraries/database/next_jdbc.md\n  - skills/testing/kaocha.md\n---\n\n# You are a Clojure Data Validation Specialist\n\nYou help developers build applications with proper validation and database access.\n\nYour approach:\n- Validate all external data with Malli\n- Use next.jdbc for database operations\n- Write tests with Kaocha\n- Follow REPL-driven development\n```\n\n### Building\n\n```bash\n# Build with Babashka\nbb build my_agent\n\n# Or use make\nmake _build/my_agent.md\n\n# View output\ncat _build/my_agent.md\n```\n\nThe build process:\n1. Reads `prompts/my_agent.md`\n2. Extracts YAML frontmatter (sections list)\n3. Combines all referenced skills\n4. Outputs to `_build/my_agent.md`\n\n### Using Built Prompts with OpenCode\n\n[OpenCode](https://opencode.ai/) is an AI coding agent platform that lets you create custom\nagents with specialized system prompts. It's the primary way to use clojure-skills prompts\nfor interactive development.\n\n**Why use OpenCode with clojure-skills?**\n\n- Create specialized Clojure agents with specific skill combinations\n- Interactive TUI for conversational development\n- Integrates with MCP-light for REPL-driven workflow\n- Switch between different agent configurations easily\n\nOnce you've built a prompt, you can use it directly with the OpenCode CLI to create a custom agent:\n\n```bash\n# Build your prompt first\nbb build my_agent\n\n# Create an OpenCode agent from the built prompt\nopencode agent create\n\n# When prompted:\n# - Agent name: my-clojure-agent\n# - Select \"Load from file\"\n# - File path: /path/to/clojure-skills/_build/my_agent.md\n\n# Or use the agent in a one-off run\nopencode run --agent my-clojure-agent \"Help me validate this data structure\"\n\n# Start TUI with your custom agent\nopencode --agent my-clojure-agent\n```\n\n**OpenCode CLI commands:**\n\n```bash\n# Create a new agent with custom system prompt\nopencode agent create\n\n# List available models for your agent\nopencode models\n\n# Run a one-off command with your agent\nopencode run --agent my-clojure-agent \"Your prompt here\"\n\n# Start interactive TUI\nopencode --agent my-clojure-agent\n\n# Continue a previous session\nopencode --continue --agent my-clojure-agent\n\n# Use a specific model\nopencode --model anthropic/claude-3-5-sonnet-20241022 --agent my-clojure-agent\n```\n\n**Example workflow:**\n\n```bash\n# 1. Search for relevant skills\nclojure-skills skill search \"validation database testing\"\n\n# 2. Create a custom prompt with those skills\ncat \u003e prompts/data_specialist.md \u003c\u003c'EOF'\n---\ntitle: Data Validation Specialist\nauthor: Your Name\ndate: 2025-11-17\nsections:\n  - skills/language/clojure_intro.md\n  - skills/language/clojure_repl.md\n  - skills/libraries/data_validation/malli.md\n  - skills/libraries/database/next_jdbc.md\n  - skills/testing/kaocha.md\n---\n\n# You are a Clojure Data Validation Specialist\n\nYou help developers build robust applications with proper validation.\nEOF\n\n# 3. Build the prompt\nbb build data_specialist\n\n# 4. Create OpenCode agent from built prompt\nopencode agent create\n# Follow prompts to load _build/data_specialist.md\n\n# 5. Use your custom agent\nopencode --agent data-specialist\n```\n\n**Tip:** Built prompts in `_build/` are ready to use directly as OpenCode system prompts. You can also manually configure agents in `~/.config/opencode/agents/` by creating a JSON file with your prompt.\n\n### Using the Skill Builder Agent\n\nThe clojure-skills repository includes a specialized `clojure_skill_builder` agent designed to create new skill documents from library documentation. This agent is already built and ready to use with OpenCode.\n\n**Quick start - Generate a skill in one command:**\n\n```bash\n# Generate a skill for Promesa (promise library)\nopencode run --agent clojure-skill-builder \\\n  \"Create a skill for the Promesa library (https://github.com/funcool/promesa). \\\n   Focus on core promise operations, async/await patterns, executors, and practical \\\n   examples. Use the documentation at https://funcool.github.io/promesa/latest/. \\\n   Save the skill to skills/libraries/async/promesa.md\"\n```\n\n**What the skill builder agent does:**\n\n1. Fetches documentation from the provided URL\n2. Analyzes the library's core concepts and API\n3. Creates a well-structured skill document following the template:\n   - YAML frontmatter with metadata\n   - Quick Start section with working examples\n   - Core Concepts explanation\n   - Common Workflows with practical patterns\n   - Best Practices (do's and don'ts)\n   - Troubleshooting section\n4. Saves the skill to the specified path\n5. Syncs it to the database automatically\n\n**The skill builder is trained on:**\n\n- 73+ existing skill examples showing the expected format\n- Clojure best practices and REPL-driven development\n- Documentation patterns from libraries like Malli, next.jdbc, http-kit\n- Integration with the clojure-skills database structure\n\n**After the skill is generated:**\n\n```bash\n# Verify the skill was created\nls -lh skills/libraries/async/promesa.md\n\n# Sync to database\nclojure-skills db sync\n\n# Search for your new skill\nclojure-skills skill search \"promesa\"\n\n# View the skill content\nclojure-skills skill show promesa -c libraries/async\n```\n\n**Interactive mode for refinement:**\n\n```bash\n# Start interactive session with skill builder\nopencode --agent clojure-skill-builder\n\n# Then provide detailed instructions:\n# \"I want to create a skill for Promesa. Here's what I need:\n#  - Focus on the promise/deferred abstraction\n#  - Include examples of p/let, p/chain, p/all\n#  - Show how to use executors for virtual threads\n#  - Add troubleshooting for common blocking issues\n#  - Save to skills/libraries/async/promesa.md\"\n```\n\n**More examples:**\n\n```bash\n# Generate skill for any Clojure library\nopencode run --agent clojure-skill-builder \\\n  \"Create a skill for Datalevin (https://github.com/juji-io/datalevin). \\\n   Focus on the Datalog query API, entity API, and schema definition. \\\n   Save to skills/libraries/database/datalevin.md\"\n\n# Generate skill for a testing library\nopencode run --agent clojure-skill-builder \\\n  \"Create a skill for Lazytest (https://github.com/noahtheduke/lazytest). \\\n   Focus on the test definition syntax, fixtures, and REPL workflow. \\\n   Save to skills/testing/lazytest.md\"\n\n# Generate skill for a tool\nopencode run --agent clojure-skill-builder \\\n  \"Create a skill for Depot (https://github.com/Olical/depot). \\\n   Focus on checking outdated dependencies and updating deps.edn. \\\n   Save to skills/tooling/depot.md\"\n```\n\n**Skill builder agent is located at:** `prompts/clojure_skill_builder.md`\n\nTo customize or rebuild it:\n\n```bash\n# View the prompt configuration\ncat prompts/clojure_skill_builder.md\n\n# Rebuild after modifications\nbb build clojure_skill_builder\n\n# Use the rebuilt version\nopencode agent create\n# Load from: _build/clojure_skill_builder.md\n```\n\n### Available Tasks\n\n```bash\n# Build specific prompt\nbb build clojure_build\n\n# Build all prompts\nbb build-all\n\n# List built prompts with sizes\nbb list-prompts\n\n# Watch for changes and auto-rebuild\nbb watch\nbb watch clojure_build    # Watch specific prompt\n\n# Clean build artifacts\nbb clean\n```\n\n---\n\n## Development\n\n### Running Tests\n\n```bash\n# Run all tests\nbb test\n\n# Or use Clojure directly\nclojure -M:jvm-base:dev:test\n```\n\n### Code Quality\n\n```bash\n# Lint\nbb lint\n\n# Format\nbb fmt           # Auto-format\nbb fmt-check     # Check only\n\n# Spell check\nbb typos         # Find typos\nbb typos-fix     # Auto-fix\n\n# Full CI pipeline\nbb ci            # Runs: clean, fmt-check, lint, typos, test\n```\n\n### REPL-Driven Development\n\n**Using MCP-light (Recommended):**\n\n```bash\n# Start nREPL server (port 7889)\nbb nrepl\n\n# Evaluate code with clj-nrepl-eval\nclj-nrepl-eval -p 7889 \"(+ 1 2 3)\"\n# =\u003e 6\n```\n\nSee the [REPL-Driven Development](#repl-driven-development-with-mcp-light) section for complete workflow.\n\n**Traditional editor integration:**\n\n```bash\n# Connect from your editor:\n# - Emacs (CIDER): M-x cider-connect\n# - VSCode (Calva): Connect to REPL\n# - IntelliJ (Cursive): Connect to Remote REPL\n```\n\n### Creating New Skills\n\n1. **Choose category** - `skills/libraries/`, `skills/testing/`, etc.\n\n2. **Follow template:**\n\n```markdown\n---\nname: my_skill_name\ndescription: |\n  Brief description with key terms for search.\n---\n\n# Skill Title\n\n## Quick Start\n...\n```\n\n3. **Test skill:**\n\n```bash\n# Validate syntax\nbb typos skills/your_category/your_skill.md\n\n# Sync to database\nclojure-skills db sync\n\n# Verify it appears\nclojure-skills skill search \"your skill topic\"\n```\n\n### Database Migrations\n\n```bash\n# Run migrations\nbb migrate\n\n# Rollback last migration\nbb rollback\n\n# Rollback all migrations\nbb rollback-all\n```\n\nMigration files are in `resources/migrations/` using Ragtime format.\n\n---\n\n## Project Structure\n\n```\nclojure-skills/\n├── skills/                   # 75 skill markdown files\n│   ├── language/\n│   ├── clojure_mcp/\n│   ├── libraries/            # 29 categories\n│   ├── testing/\n│   └── tooling/\n│\n├── prompts/                  # Prompt templates\n│   ├── clojure_build.md\n│   └── clojure_skill_builder.md\n│\n├── _build/                   # Generated prompts (git-ignored)\n│\n├── src/                      # CLI source code\n│   └── clojure_skills/\n│       ├── cli.clj           # CLI commands\n│       ├── search.clj        # FTS5 search\n│       ├── sync.clj          # Sync skills to DB\n│       └── db/               # Database operations\n│           ├── core.clj\n│           ├── plans.clj     # Implementation plans\n│           └── tasks.clj     # Task tracking\n│\n├── test/                     # Test files\n├── resources/\n│   └── migrations/           # Ragtime migrations\n│\n├── bb.edn                    # Babashka tasks\n├── deps.edn                  # Clojure dependencies\n├── Makefile                  # Build automation (pandoc)\n└── readme.md                 # This file\n```\n\n---\n\n## Philosophy\n\n### Modularity\n\nSkills are atomic units - one concept, one library, one workflow. This enables:\n- Write once, reuse in multiple prompts\n- Update one skill, improve all prompts using it\n- Easy to find and compose\n\n### Progressive Disclosure\n\nEach skill provides multiple levels:\n1. **Quick Start** (5 min) - Get working immediately\n2. **Core Concepts** (10 min) - Understand essentials\n3. **Workflows** (20 min) - Practical patterns\n4. **Advanced** (30+ min) - Deep knowledge\n\n### Quality Over Quantity\n\nAll code examples are:\n- Validated in the REPL\n- Lint-checked\n- Spell-checked\n- Reviewed for best practices\n\n**Better 75 excellent skills than 200 mediocre ones.**\n\n### Searchability First\n\nFull-text search with SQLite FTS5 means:\n- Find skills by any keyword\n- Search across content, not just titles\n- Fast results even with 75+ skills\n- No external dependencies\n\n---\n\n## Advanced Features\n\n### Compression (Optional)\n\nFor large prompts, compression can reduce token usage by 10-20x using LLMLingua:\n\n```bash\n# Setup Python dependencies (one-time)\nbb setup-python\n\n# Build and compress\nbb build-compressed clojure_build --ratio 10\n\n# Or compress existing file\nbb compress _build/clojure_build.md --ratio 10\n```\n\nSee [COMPRESSION.md](COMPRESSION.md) for details.\n\n### Native Binary\n\nBuild a fast native binary with GraalVM:\n\n```bash\n# Requires GraalVM with native-image\nbb build-cli\n\n# Creates: target/clojure-skills\n```\n\nNative binary starts instantly (no JVM startup time).\n\n---\n\n## Resources\n\n### Documentation\n\n- **[AGENTS.md](AGENTS.md)** - Complete guide for working with this repository\n- **[SKILL_CREATION_GUIDE.md](SKILL_CREATION_GUIDE.md)** - Step-by-step guide for creating new skills with planning system\n- **[COMPRESSION.md](COMPRESSION.md)** - Prompt compression strategies\n- **[scripts/README.md](scripts/README.md)** - Build script documentation\n\n### External Links\n\n- [OpenCode](https://opencode.ai/) - AI coding agent (primary target)\n- [Anthropic Skills API](https://docs.anthropic.com/en/docs/build-with-claude/prompt-engineering/skills)\n- [Clojure](https://clojure.org/)\n- [Babashka](https://babashka.org/)\n\n---\n\n## Contributing\n\nContributions welcome! Areas that benefit most:\n\n- New skills for uncovered libraries\n- Improved examples in existing skills\n- Bug fixes\n- Testing feedback with different LLMs\n\n**Before contributing:**\n\n1. Read [AGENTS.md](AGENTS.md) for development guidelines\n2. Install [MCP-light](#mcp-light-installation) for REPL-driven development\n3. Run `bb ci` to ensure quality\n4. Test code examples with `clj-nrepl-eval` before committing to files\n5. Check spelling with `bb typos`\n\n**Development workflow:**\n\n```bash\n# 1. Start nREPL server\nbb nrepl\n\n# 2. Test your code with clj-nrepl-eval\nclj-nrepl-eval -p 7889 \"(defn my-function [x] (process x))\"\nclj-nrepl-eval -p 7889 \"(my-function test-data)\"\n\n# 3. Only after validation, edit files\n# 4. Run quality checks\nbb ci\n```\n\n**Note:** This project uses professional language throughout - no emojis please.\n\n---\n\n## License\n\nMIT License - see LICENSE file for details.\n\nCopyright (c) 2025 Ivan Willig\n\n---\n\n## Acknowledgments\n\nBuilt with:\n- **Clojure** - The language we're teaching\n- **Babashka** - Fast task automation\n- **SQLite** - Database with FTS5 search\n- **Pandoc** - Document assembly\n- **OpenCode** - AI coding agent platform\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fiwillig%2Fclojure-skills","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fiwillig%2Fclojure-skills","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fiwillig%2Fclojure-skills/lists"}