ccski 1.1.0 → 2.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -1,22 +1,32 @@
1
1
  # ccski – Claude Code Skills Manager
2
2
 
3
- ccski is a CLI + MCP server that lets any AI coding assistant discover, install, enable/disable, and serve Claude Code-compatible skills. It is purpose-built to be lightweight, type-safe, and easy to embed in your editor or agent toolchain.
3
+ ccski is a CLI + MCP server to discover, install, enable/disable, and serve Claude Code-compatible skills. This README covers install and usage. For architecture and UX philosophy, see `SPEC.md`.
4
4
 
5
- ## 1) Positioning & MCP quick start
5
+ ## Install
6
6
 
7
- - **What it is**: a thin, batteries-included manager for SKILL.md–based skill packs (local folders, git repos, plugin marketplaces).
8
- - **Who it’s for**: humans running CLI workflows and agents connecting over MCP.
7
+ Requires Node.js >= 20.
9
8
 
10
- ### Start MCP in one line
9
+ ```bash
10
+ # run directly
11
+ npx ccski --help
12
+
13
+ # or install locally
14
+ pnpm install ccski
15
+ ccski --help
16
+ ```
17
+
18
+ ## Quick start
19
+
20
+ ### Run MCP server
11
21
 
12
22
  ```bash
13
23
  npx ccski mcp
14
24
  ```
15
25
 
16
- Common MCP registrations:
26
+ - Add extra skill roots: `npx ccski mcp --skill-dir /extra/skills`
27
+ - Disable auto refresh: `npx ccski mcp --no-refresh`
17
28
 
18
- - **Codex CLI**: `codex mcp add skills -- npx ccski mcp`
19
- - **Cursor / Windsurf / VS Code MCP plugins** (config excerpt):
29
+ MCP plugin config example (Codex/Cursor/Windsurf/VS Code):
20
30
 
21
31
  ```json
22
32
  {
@@ -29,100 +39,44 @@ Common MCP registrations:
29
39
  }
30
40
  ```
31
41
 
32
- Run with `--skill-dir` to add extra roots, or `--no-refresh` to disable live reload.
33
-
34
- ## 2) Core CLI surface (human-friendly)
35
-
36
- | Command | Purpose |
37
- | ------------------------------------------- | ---------------------------------------------------------------------------------------- |
38
- | `ccski list` | Show discovered skills (projects, home, plugin marketplace) with status badges |
39
- | `ccski info <name>` | Inspect metadata and preview content |
40
- | `ccski install <source> [-i\|--all\|--path]` | Install skills from git/dir/marketplace; interactive picker shows final one-shot command |
41
- | `ccski enable [names...] [-i\|--all]` | Restore `.SKILL.md` → `SKILL.md`; interactive defaults **unchecked** |
42
- | `ccski disable [names...] [-i\|--all]` | Disable skills by flipping to `.SKILL.md` |
43
- | `ccski mcp` | Start MCP server (stdio/http/sse) |
44
- | `ccski validate <path>` | Validate SKILL.md or directory structure |
45
-
46
- Interactive pickers across install/enable/disable share the same layout, colors, and live “Command:” preview so you can copy/paste the equivalent non-interactive invocation.
42
+ ### Core CLI commands
47
43
 
48
- ### Install deep dive
44
+ | Command | Purpose |
45
+ | --- | --- |
46
+ | `ccski list` | List discovered skills (project, user, plugin) |
47
+ | `ccski info <name>` | Show metadata and content preview |
48
+ | `ccski install <source> [-i|--all|--path]` | Install from git/dir/marketplace/SKILL.md; interactive picker available |
49
+ | `ccski enable [names...] [-i|--all]` | Enable skills (`.SKILL.md` -> `SKILL.md`) |
50
+ | `ccski disable [names...] [-i|--all]` | Disable skills (`SKILL.md` -> `.SKILL.md`) |
51
+ | `ccski validate <path>` | Validate SKILL.md or skill directory |
52
+ | `ccski mcp` | Start MCP server (stdio/http/sse) |
49
53
 
50
- - **Sources**: git URL (with `--branch`, `--path`, `--mode git` default for http/https), local dir/file (`--mode file`), `marketplace.json`, or direct `SKILL.md`.
51
- - **Granular selection**: `-i/--interactive` to pick; `--all`; positional filters for fuzzy name matching.
52
- - **Where it lands**: project `.claude/skills` by default, or `--global` to `~/.claude/skills`.
53
- - **Force/overwrite**: `--force`/`--override` to replace existing skill folder.
54
+ ### Install examples
54
55
 
55
- #### Examples
56
-
57
- - Repo root(default branch, auto-detect marketplace)
56
+ - Git repo (auto-detect marketplace):
58
57
  `ccski install https://github.com/wshobson/agents`
59
-
60
- - Repo branch with marketplace
61
- `ccski install https://github.com/wshobson/agents/tree/main` or `--branch main`
62
-
63
- - Specific file inside repo (auto clone, blob path)
64
- `ccski install https://github.com/wshobson/agents/blob/main/.claude-plugin/marketplace.json`
65
-
66
- - Local directory (no git)
58
+ - Specific branch or path:
59
+ `ccski install https://github.com/wshobson/agents/tree/main --branch main`
60
+ `ccski install https://github.com/wshobson/agents --path skills/foo/SKILL.md`
61
+ - Local directory or single file:
67
62
  `ccski install /path/to/skills --mode file`
68
-
69
- - Direct SKILL.md
70
63
  `ccski install ./plugins/foo/SKILL.md`
64
+ - Overwrite existing skill: add `--force` (or `--override`).
71
65
 
72
- ### How this differs from “claude plugin install”
73
-
74
- - **Install target**: ccski copies **SKILL.md skills** into `.claude/skills`; `claude plugin install` pulls a **Claude plugin package** (commands + metadata) into the Claude app. Two different ecosystems.
75
- - **Sources**: ccski supports git / local dir / marketplace.json / direct SKILL.md. Claude plugins come from the Claude plugin directory/store.
76
- - **Flexibility**: ~ccski can mix many repos (including private git) and expose them via MCP; Claude plugin installs can’t be combined this way.~
77
-
78
- ## 3) Thanks & lineage
79
-
80
- - **openskills** — established the SKILL.md authoring pattern; we align with that spec for compatibility.
81
- - **universal-skills** — offers a curated, ready-to-use skill set; ccski focuses on management and transport, not bundling content.
82
-
83
- Key differences and what we fused:
84
- - We blend **universal-skills’ MCP-first philosophy** with **openskills’ CLI ergonomics** so the same tool serves both agents and humans.
85
- - ccski uniquely **scans skills shipped inside Claude Code plugins**, which universal-skills and openskills don’t cover.
86
- - The `install` command accepts flexible sources (git URLs, marketplace, SKILL.md paths) and `-i` provides an interactive picker with a live one-shot command preview.
87
-
88
- Bottom line: ccski is a manager/server (no baked-in corpus), MCP-first, multi-root-aware, with a friendlier install/enable/disable workflow.
89
-
90
- ## 4) Contributing & architecture at a glance
91
-
92
- ### Fast start
93
-
94
- - `pnpm install`
95
- - `pnpm test` (Vitest)
96
- - `pnpm ts` (type-check)
97
- - `pnpm build` (tsdown)
98
-
99
- ### Architecture map
100
-
101
- - Entry: `src/cli.ts` (yargs CLI, shared color flags)
102
- - Commands: `src/cli/commands/*.ts`
103
- - Interactive UI: `src/cli/prompts/multiSelect.ts` (shared checkbox with live command preview)
104
- - Formatting: `src/utils/format.ts` (tone helpers; avoid ad-hoc colors)
105
- - Skill core: `src/core/*` (discovery, registry, parsing)
106
- - Tests: `tests/*.test.ts` (Vitest + bun runtime for CLI e2e)
107
-
108
- Suggested reading order: `src/utils/format.ts` → `src/cli/prompts/multiSelect.ts` → command files (install, toggle) → `src/core/registry.ts`.
109
-
110
- ### Code style highlights
111
-
112
- - TypeScript strict; no `any`/`as any`/`@ts-nocheck` unless unavoidable for third-party types.
113
- - Keep CLI colors via `tone/heading/warn/info/success/error`; don’t hardcode colorette directly.
114
- - Prefer small files (<200 lines) or refactor into folders when complexity grows.
115
- - Tests: Vitest with jsdom where needed; integration tests exercise CLI via bun runner.
116
- - Package manager: pnpm; scripts live in `package.json`.
117
-
118
- ### Development scripts
66
+ ### Enable/disable
119
67
 
120
68
  ```bash
121
- pnpm install # deps
122
- pnpm test # full test suite
123
- pnpm ts # type check
124
- pnpm build # bundle with tsdown
125
- pnpm fmt # prettier + organize imports + tailwind plugin
69
+ # Enable via interactive picker
70
+ ccski enable -i
71
+
72
+ # Disable all enabled skills
73
+ ccski disable --all
126
74
  ```
127
75
 
128
- Happy hacking — PRs welcome!
76
+ ## More
77
+
78
+ - Claude users: prefer `ccski mcp --exclude=claude` to avoid echoing built-in Claude skills.
79
+ - Codex users: prefer `ccski mcp --exclude=codex` when avoid echoing built-in Codex skills.
80
+ - All commands support `--json` for scripting.
81
+ - Use `--no-color` to disable colors or `--color` to force them.
82
+ - Read `SPEC.md` for deep technical details and design philosophy.
@@ -0,0 +1,34 @@
1
+ import { createRequire } from "node:module";
2
+
3
+ //#region rolldown:runtime
4
+ var __create = Object.create;
5
+ var __defProp = Object.defineProperty;
6
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
7
+ var __getOwnPropNames = Object.getOwnPropertyNames;
8
+ var __getProtoOf = Object.getPrototypeOf;
9
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
10
+ var __commonJS = (cb, mod) => function() {
11
+ return mod || (0, cb[__getOwnPropNames(cb)[0]])((mod = { exports: {} }).exports, mod), mod.exports;
12
+ };
13
+ var __copyProps = (to, from, except, desc) => {
14
+ if (from && typeof from === "object" || typeof from === "function") {
15
+ for (var keys = __getOwnPropNames(from), i = 0, n = keys.length, key; i < n; i++) {
16
+ key = keys[i];
17
+ if (!__hasOwnProp.call(to, key) && key !== except) {
18
+ __defProp(to, key, {
19
+ get: ((k) => from[k]).bind(null, key),
20
+ enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable
21
+ });
22
+ }
23
+ }
24
+ }
25
+ return to;
26
+ };
27
+ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", {
28
+ value: mod,
29
+ enumerable: true
30
+ }) : target, mod));
31
+ var __require = /* @__PURE__ */ createRequire(import.meta.url);
32
+
33
+ //#endregion
34
+ export { __require as n, __toESM as r, __commonJS as t };