12 Commits

Author SHA1 Message Date
siujamo 9332e4cffa Merge pull request 'v0.2.0' (#2) from develop into main
Build / build (ccsm-darwin-amd64.tar.gz, ccsm, x86_64-apple-darwin) (release) Successful in 5m46s
Build / build (ccsm-linux-amd64.tar.gz, ccsm, x86_64-unknown-linux-gnu) (release) Successful in 2m25s
Build / build (ccsm-windows-amd64.zip, ccsm.exe, x86_64-pc-windows-gnu) (release) Successful in 6m47s
Reviewed-on: #2
2026-06-22 11:49:05 +08:00
siujamo eb05e27655 feat: support monorepo skills via path field
- Add optional path field to SkillEntry for subdirectory skills
- Deploy from subdirectory when path is specified in install and update
2026-06-22 11:46:16 +08:00
siujamo cdb593bca9 ci: upload build artifacts directly to release
- Replace upload-artifact with direct release upload via Gitea API
2026-06-22 11:13:54 +08:00
siujamo c53b23b6fd Merge pull request 'ci: trigger build on release published' (#1) from develop into main
Build / build (ccsm-darwin-amd64.tar.gz, ccsm, x86_64-apple-darwin) (release) Successful in 4m23s
Build / build (ccsm-linux-amd64.tar.gz, ccsm, x86_64-unknown-linux-gnu) (release) Successful in 2m27s
Build / build (ccsm-windows-amd64.zip, ccsm.exe, x86_64-pc-windows-gnu) (release) Successful in 6m17s
Reviewed-on: #1
2026-06-22 10:58:50 +08:00
siujamo f6be25415b ci: trigger build on release published
- Replace push, pull_request, and tag triggers with release published event
2026-06-22 10:56:38 +08:00
siujamo bcb27abb96 docs: add README, CONTRIBUTING, and LICENCE
- Add project overview, installation, and usage guide
- Add contributing guidelines with setup and PR process
- Add MIT licence
2026-06-22 10:50:08 +08:00
siujamo 2ebf392bd2 fix(ci): downgrade upload-artifact to v3
Build / build (ccsm-linux-amd64.tar.gz, ccsm, x86_64-unknown-linux-gnu) (push) Has been cancelled
Build / build (ccsm-windows-amd64.zip, ccsm.exe, x86_64-pc-windows-gnu) (push) Has been cancelled
Build / build (ccsm-darwin-amd64.tar.gz, ccsm, x86_64-apple-darwin) (push) Has been cancelled
- actions/upload-artifact@v4 is not supported on GHES
- v3 uses the older artifact protocol compatible with Gitea Actions
2026-06-22 10:41:30 +08:00
siujamo 5bef4ef2ee fix(ci): switch to zigbuild for cross-compilation
- Replace cross-rs with Zig toolchain and cargo-zigbuild
- Add rustup target installation step for all platforms
- Include --target flag in native Linux build for consistent output paths

cross-rs has no Docker image for macOS targets and the Windows image
ships with a broken cargo PATH, causing all non-Linux builds to fail.
Zig provides its own cross-linker and ships macOS/Win libc headers,
enabling cross-compilation for all three targets from a single Linux
runner.
2026-06-22 10:37:27 +08:00
siujamo 9df82f99b5 fix(ci): use rustup install script in CI pipeline 2026-06-22 10:37:26 +08:00
siujamo cfc20d4b89 ci: switch to cross-rs for cross-compilation 2026-06-22 10:37:26 +08:00
siujamo 23af3f9c1d ci: add Gitea Actions build workflow 2026-06-22 10:37:26 +08:00
siujamo aef7d973ec feat: add Claude Code Skill Marketplace manager 2026-06-22 10:37:26 +08:00
6 changed files with 181 additions and 13 deletions
+9 -10
View File
@@ -1,11 +1,8 @@
name: Build
on:
push:
branches: [main]
tags: ["*"]
pull_request:
branches: [main]
release:
types: [published]
jobs:
build:
@@ -64,8 +61,10 @@ jobs:
tar czf "${{ matrix.archive }}" "${{ matrix.binary }}"
fi
- name: Upload artifact
uses: actions/upload-artifact@v4
with:
name: ${{ matrix.archive }}
path: target/${{ matrix.target }}/release/${{ matrix.archive }}
- name: Upload to release
run: |
curl --fail -X POST \
-H "Authorization: Bearer ${{ secrets.GITEA_TOKEN }}" \
-H "Content-Type: application/octet-stream" \
--data-binary @"target/${{ matrix.target }}/release/${{ matrix.archive }}" \
"${{ github.server_url }}/api/v1/repos/${{ github.repository }}/releases/${{ github.event.release.id }}/assets?name=${{ matrix.archive }}"
+29
View File
@@ -0,0 +1,29 @@
# Contributing
## Setup
```bash
git clone https://onixbyte.dev/onixbyte/claude-code-skill-manager.git
cd claude-code-skill-manager
cargo build
```
## Before submitting
- Run `cargo fmt` to format your code
- Run `cargo clippy` and fix any warnings
- Ensure `cargo build` succeeds
## Pull requests
- Keep changes focused and atomic
- Write clear commit messages following the [conventional commits](https://www.conventionalcommits.org/) format
- Open PRs against the `main` branch
## Issues
Bug reports and feature requests are welcome. Please include steps to reproduce when reporting bugs.
## Licence
By contributing, you agree that your contributions will be licensed under the [MIT Licence](LICENCE).
+21
View File
@@ -0,0 +1,21 @@
MIT License
Copyright (c) 2025 OnixByte
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
+103
View File
@@ -0,0 +1,103 @@
# Claude Code Skill Manager (CCSM)
A CLI tool for discovering, installing, and managing [Claude Code](https://claude.ai/code) skills from Git-based marketplace repositories.
## Installation
### From source
```bash
git clone https://onixbyte.dev/onixbyte/claude-code-skill-manager.git
cd claude-code-skill-manager
cargo install --path .
```
### Pre-built binaries
Download the latest binary for your platform from the [Releases](https://onixbyte.dev/onixbyte/claude-code-skill-manager/releases) page.
## Quick start
```bash
# Register a skill marketplace
ccsm marketplace add https://github.com/example/skills
# Browse available skills
ccsm search
# Install a skill
ccsm install my-skill
# List installed skills
ccsm list
# See details about a skill
ccsm info my-skill
# Update installed skills
ccsm update
# Remove a skill
ccsm remove my-skill
```
## Commands
### Marketplace management
| Command | Description |
|---|---|
| `ccsm marketplace add <url>` | Register a Git repository as a skill marketplace |
| `ccsm marketplace remove <name>` | Unregister a marketplace |
| `ccsm marketplace list` | List registered marketplaces |
| `ccsm marketplace update [name]` | Refresh marketplace manifests |
### Skill management
| Command | Description |
|---|---|
| `ccsm search [query]` | Search available skills across all marketplaces |
| `ccsm install <name>` | Install a skill (supports `--copy` and `--link` modes) |
| `ccsm list` | Show installed skills |
| `ccsm info <name>` | Show details about an installed skill |
| `ccsm update [name]` | Update installed skills to latest |
| `ccsm remove <name>` | Uninstall a skill |
## How it works
Skills are directories placed under `~/.claude/skills/` that Claude Code reads at startup. CCSM manages these directories by pulling skill definitions from marketplace repositories that expose a `skills.json` manifest:
```json
{
"name": "My Marketplace",
"skills": [
{
"name": "example-skill",
"description": "An example Claude Code skill",
"repository": "https://github.com/user/skill-repo",
"branch": "main"
}
]
}
```
## Deploy modes
- **Copy** (default): Skill files are physically copied to `~/.claude/skills/<name>/`.
- **Link**: A symlink is created from `~/.claude/skills/<name>/` to the local store, useful for development.
## Building
```bash
cargo build --release
```
Cross-compilation targets: Linux (amd64), macOS (amd64), and Windows (amd64) via `cargo-zigbuild`.
## Contributing
See [CONTRIBUTING.md](CONTRIBUTING.md).
## Licence
[MIT](LICENCE)
+2
View File
@@ -19,6 +19,8 @@ pub struct SkillEntry {
pub repository: String,
#[serde(default)]
pub branch: Option<String>,
#[serde(default)]
pub path: Option<String>,
}
pub fn add(url: &str, name: Option<&str>) -> Result<MarketplaceEntry, String> {
+17 -3
View File
@@ -38,10 +38,20 @@ pub fn install(
let branch = entry.branch.as_deref().unwrap_or("main");
download::download_skill(&entry.repository, branch, &target)?;
// Deploy to Claude skills directory (copy or link)
let deploy_source = match &entry.path {
Some(subdir) => {
let p = target.join(subdir);
if !p.exists() {
return Err(format!("Path '{}' not found in skill repository", subdir));
}
p
}
None => target.clone(),
};
let config = Config::load().map_err(|e| format!("Cannot read config: {e}"))?;
let deploy_mode = mode.unwrap_or_else(|| config.default_mode.clone());
deploy_skill(name, &target, &deploy_mode)?;
deploy_skill(name, &deploy_source, &deploy_mode)?;
Ok(Skill {
name: name.to_string(),
@@ -233,12 +243,16 @@ pub fn update(name: Option<&str>) -> Result<Vec<(String, String)>, String> {
match download::download_skill(&skill_entry.repository, branch, &old_path) {
Ok(()) => {
let deploy_source = match &skill_entry.path {
Some(subdir) => old_path.join(subdir),
None => old_path.clone(),
};
// Redeploy if previously deployed
if deploy_mode.is_some() || config.default_mode != InstallMode::Copy {
let mode = deploy_mode
.clone()
.unwrap_or_else(|| config.default_mode.clone());
match deploy_skill(skill_name, &old_path, &mode) {
match deploy_skill(skill_name, &deploy_source, &mode) {
Ok(()) => results.push((skill_name.clone(), "Updated".to_string())),
Err(e) => results.push((skill_name.clone(), format!("Downloaded but deploy failed: {e}"))),
}