5 Commits

7 changed files with 166 additions and 3 deletions
+6
View File
@@ -24,6 +24,12 @@ jobs:
steps:
- uses: actions/checkout@v4
- name: Set version
run: |
VERSION="${{ github.event.release.tag_name }}"
VERSION="${VERSION#v}"
echo "CCSM_VERSION=$VERSION" >> "$GITHUB_ENV"
- name: Install Rust
run: |
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- -y --default-toolchain stable
+56
View File
@@ -0,0 +1,56 @@
# Changelog
## v0.3.0
### Added
- **Detailed `--version` output** — shows version, commit SHA, project name, and attribution (`by OnixByte`); version can be injected at build time via `CCSM_VERSION` env var
- **Marketplace creation guide** — README now documents how to create and publish a skill marketplace, including the `skills.json` format, skill entry fields, monorepo `path` support, and skill repository structure
## v0.2.0
### Added
- **Monorepo skill support** — skills can now live in subdirectories of a single repository via the `path` field in `skills.json`
- **Release-triggered CI** — workflow runs on `release: published` and uploads built artifacts directly to the release
- **Project documentation** — README, CONTRIBUTING, and LICENCE (MIT) files
### Fixed
- CI artifact upload compatibility with self-hosted Gitea (downgrade `upload-artifact` to v3)
- Cross-compilation for macOS and Windows targets via `cargo-zigbuild`
## v0.1.0
Initial release of Claude Code Skill Manager (CCSM) — a CLI tool for discovering, installing, and managing Claude Code skills from Git-based marketplace repositories.
### Features
- **Marketplace management** — register, list, update, and remove skill marketplaces from any Git repository exposing a `skills.json` manifest
- **Skill search** — browse and search available skills by name or description across all registered marketplaces
- **Skill installation** — download and deploy skills to `~/.claude/skills/` with copy or symlink modes
- **Skill lifecycle** — update installed skills to latest versions, remove unwanted skills, and inspect skill details
- **Cross-platform** — pre-built binaries for Linux, macOS, and Windows (amd64)
### Commands
| Command | Description |
|---|---|
| `ccsm marketplace add <url>` | Register a skill marketplace |
| `ccsm marketplace remove <name>` | Unregister a marketplace |
| `ccsm marketplace list` | List registered marketplaces |
| `ccsm marketplace update [name]` | Refresh marketplace manifests |
| `ccsm search [query]` | Search available skills |
| `ccsm install <name>` | Install a skill |
| `ccsm list` | Show installed skills |
| `ccsm info <name>` | Show skill details |
| `ccsm update [name]` | Update installed skills |
| `ccsm remove <name>` | Uninstall a skill |
### Installation
```bash
cargo install --path .
```
Or download a pre-built binary from the [Releases](https://onixbyte.dev/onixbyte/claude-code-skill-manager/releases) page.
Generated
+1 -1
View File
@@ -218,7 +218,7 @@ checksum = "c8d4a3bb8b1e0c1050499d1815f5ab16d04f0959b233085fb31653fbfc9d98f9"
[[package]]
name = "claude-code-skill-manager"
version = "0.1.0"
version = "0.3.0"
dependencies = [
"clap",
"dirs",
+1 -1
View File
@@ -1,6 +1,6 @@
[package]
name = "claude-code-skill-manager"
version = "0.1.0"
version = "0.3.0"
edition = "2021"
[[bin]]
+74
View File
@@ -81,6 +81,80 @@ Skills are directories placed under `~/.claude/skills/` that Claude Code reads a
}
```
## Creating a skill marketplace
A marketplace is simply a public Git repository that contains a `skills.json` manifest at its root. CCSM reads this file to discover what skills are available.
### Repository structure
```
your-marketplace-repo/
skills.json ← manifest (required)
README.md ← optional landing page
```
### skills.json format
```json
{
"name": "My Marketplace",
"version": "1.0.0",
"skills": [
{
"name": "my-skill",
"description": "A short description shown in search results",
"repository": "https://github.com/user/skill-repo",
"branch": "main"
},
{
"name": "another-skill",
"description": "A skill that lives in a monorepo subdirectory",
"repository": "https://github.com/user/monorepo",
"branch": "main",
"path": "skills/another-skill"
}
]
}
```
| Field | Required | Description |
|---|---|---|
| `name` | Yes | Marketplace display name |
| `version` | No | Arbitrary version string for your own tracking |
| `skills` | No | Array of skill entries (defaults to `[]`) |
**Skill entry fields:**
| Field | Required | Description |
|---|---|---|
| `name` | Yes | Unique skill identifier (used with `ccsm install <name>`) |
| `description` | Yes | One-line summary shown in `ccsm search` output |
| `repository` | Yes | Public Git repository URL for the skill |
| `branch` | No | Git branch to install from (defaults to `main` or `master`, auto-detected by the marketplace host) |
| `path` | No | Subdirectory within the repository where the skill files live — use for monorepos hosting multiple skills |
### What goes in a skill repository
Each skill repository (the one referenced by `repository`) is a standard Claude Code skill directory. At minimum it should contain one of:
- `SKILL.md` — the skill manifest (preferred)
- `CLAUDE.md` — alternative manifest filename
- Supporting files referenced by the manifest (scripts, templates, etc.)
See the [Claude Code skills documentation](https://docs.anthropic.com/en/docs/claude-code/skills) for details on writing skill manifests.
### Publishing your marketplace
1. Create a public Git repository with a `skills.json` following the format above.
2. Push it — make sure `skills.json` is at the repository root.
3. Anyone can register it with:
```bash
ccsm marketplace add https://github.com/your-username/your-marketplace
```
CCSM fetches `skills.json` from the raw `main` or `master` branch automatically, so both of those branch names work out of the box.
## Deploy modes
- **Copy** (default): Skill files are physically copied to `~/.claude/skills/<name>/`.
+19
View File
@@ -0,0 +1,19 @@
use std::process::Command;
fn main() {
let version = std::env::var("CCSM_VERSION")
.unwrap_or_else(|_| env!("CARGO_PKG_VERSION").to_string());
let commit = Command::new("git")
.args(["rev-parse", "--short", "HEAD"])
.output()
.ok()
.and_then(|o| String::from_utf8(o.stdout).ok())
.map(|s| s.trim().to_string())
.unwrap_or_else(|| "unknown".to_string());
println!("cargo:rustc-env=CCSM_VERSION={version}");
println!("cargo:rustc-env=GIT_COMMIT_SHORT={commit}");
println!("cargo:rerun-if-changed=.git/HEAD");
println!("cargo:rerun-if-env-changed=CCSM_VERSION");
}
+9 -1
View File
@@ -1,10 +1,18 @@
use clap::{Args, Parser, Subcommand};
const VERSION_TEXT: &str = concat!(
env!("CCSM_VERSION"),
" -- Claude Code Skill Manager",
" -- ",
env!("GIT_COMMIT_SHORT"),
"\nby OnixByte"
);
#[derive(Parser)]
#[command(
name = "ccsm",
about = "Claude Code Skill Marketplace — discover and install skills from Git marketplaces",
version
version = VERSION_TEXT,
)]
pub struct Cli {
#[command(subcommand)]