@camunda8/spm 0.4.0 β 0.6.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 +64 -13
- package/package.json +6 -6
package/README.md
CHANGED
|
@@ -5,6 +5,9 @@ AI tool (Claude Code and GitHub Copilot CLI) **without ever committing skills to
|
|
|
5
5
|
your repo**. Anything spm materializes into the working tree is gitignored β no
|
|
6
6
|
symlinks, no skills under version control.
|
|
7
7
|
|
|
8
|
+
π **Documentation:** <https://camunda.github.io/spm-cli/> (built from
|
|
9
|
+
[`docs/`](docs/) and deployed via GitHub Pages).
|
|
10
|
+
|
|
8
11
|
## How it works
|
|
9
12
|
|
|
10
13
|
```
|
|
@@ -16,7 +19,7 @@ ai.json ββresolveβββΆ ai.lock ββfetchβββΆ ~/.spm/store/<repo>@
|
|
|
16
19
|
- **`ai.json`** β you author it, commit it. Declares target vendors + skill deps.
|
|
17
20
|
- **`ai.lock`** β generated, commit it. Pins every version selector to an immutable commit SHA β reproducible installs.
|
|
18
21
|
- **Global store** (`~/.spm/store`) β a **fetch cache only**: each repo@commit is cloned once and shared across all projects. Nothing is *registered* or *materialized* here β it exists purely so repeated installs don't re-clone.
|
|
19
|
-
- **Vendor projection** β spm copies the store's skills into
|
|
22
|
+
- **Vendor projection** β spm copies the store's skills into the directory where each vendor loads them from. In the default **project** scope that is a **project-local**, gitignored dir β nothing spm generates is committed. With `-g`/`--global` (see [Global skills](#global-skills--g----global)) it materializes into a **user-global** location shared across all your projects instead.
|
|
20
23
|
- **Registration** differs per vendor:
|
|
21
24
|
- **Claude** β spm assembles a self-contained plugin marketplace in the **project-local**, gitignored `.spm/claude/` dir and writes a pointer to it into `.claude/settings.local.json` (gitignored by convention). The dir sits outside `.agents/skills/` so Copilot's scanner never picks it up. Declarative, per-project, zero VCS footprint.
|
|
22
25
|
- **Copilot CLI** β spm copies the resolved skills into a **project-local** directory, `.agents/skills/spm-managed-skills/<name>/`, where Copilot CLI auto-discovers them (`.agents/skills/**/SKILL.md`). That directory is added to the project's `.gitignore` (with an explanatory comment) so the materialized skills stay truly local and are never committed. No user-global state, no `copilot` CLI required.
|
|
@@ -89,6 +92,16 @@ spm add git@github.com:org/repo.git --branch main # SSH (scp-style)
|
|
|
89
92
|
spm add ssh://git@github.com/org/repo.git --branch main # SSH (url form)
|
|
90
93
|
```
|
|
91
94
|
|
|
95
|
+
**Any git host works** β spm shells out to `git` and never detects or
|
|
96
|
+
special-cases a provider, so GitHub, GitLab, Bitbucket, and self-hosted servers
|
|
97
|
+
are all supported with no extra config:
|
|
98
|
+
|
|
99
|
+
```bash
|
|
100
|
+
spm add git@bitbucket.org:org/repo.git --branch main # Bitbucket
|
|
101
|
+
spm add https://gitlab.com/org/repo.git --tag v1.0.0 # GitLab
|
|
102
|
+
spm add ssh://git@git.internal.example.com:7999/p/repo.git --branch main # self-hosted
|
|
103
|
+
```
|
|
104
|
+
|
|
92
105
|
SSH auth goes through your ssh-agent / keys β spm never handles credentials.
|
|
93
106
|
Private HTTPS repos use your git credential helper. spm runs git with
|
|
94
107
|
`GIT_TERMINAL_PROMPT=0`, so a missing credential fails with a clear error
|
|
@@ -119,10 +132,9 @@ toolchain). The crate is `spm-cli`; the installed binary is `spm`:
|
|
|
119
132
|
cargo install spm-cli
|
|
120
133
|
```
|
|
121
134
|
|
|
122
|
-
**Prebuilt binary** β
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
on your `PATH`:
|
|
135
|
+
**Prebuilt binary** β download a release asset directly; no authentication
|
|
136
|
+
required (the repo is public). The easiest way is the
|
|
137
|
+
[GitHub CLI](https://cli.github.com/):
|
|
126
138
|
|
|
127
139
|
```bash
|
|
128
140
|
# pick the asset for your platform (see list below); example: Apple Silicon macOS
|
|
@@ -134,6 +146,15 @@ chmod +x spm && sudo mv spm /usr/local/bin/
|
|
|
134
146
|
`--repo camunda/spm-cli` with no tag grabs the latest release; add
|
|
135
147
|
`v0.1.0` as the first positional arg to pin a specific version.
|
|
136
148
|
|
|
149
|
+
Without `gh`, download straight from the public release URL with `curl`:
|
|
150
|
+
|
|
151
|
+
```bash
|
|
152
|
+
# latest release; swap the asset name for your platform
|
|
153
|
+
curl -fsSL -o spm \
|
|
154
|
+
https://github.com/camunda/spm-cli/releases/latest/download/spm-aarch64-apple-darwin
|
|
155
|
+
chmod +x spm && sudo mv spm /usr/local/bin/
|
|
156
|
+
```
|
|
157
|
+
|
|
137
158
|
Assets: `spm-x86_64-unknown-linux-gnu`, `spm-aarch64-unknown-linux-gnu`,
|
|
138
159
|
`spm-x86_64-apple-darwin`, `spm-aarch64-apple-darwin`,
|
|
139
160
|
`spm-x86_64-pc-windows-msvc.exe`.
|
|
@@ -150,18 +171,48 @@ make install PREFIX=~/.local # or a custom prefix
|
|
|
150
171
|
## Commands
|
|
151
172
|
|
|
152
173
|
```bash
|
|
153
|
-
spm init [--target claude|copilot ...]
|
|
174
|
+
spm init [--target claude|copilot ...] [-g] # scaffold ai.json (repeatable / comma-separated)
|
|
154
175
|
spm add <git> (--tag|--branch|--commit <v>) \ # add + install a skill
|
|
155
|
-
[--path <subdir>] [--name <local-name>] [--all] # --all: add every skill under --path
|
|
176
|
+
[--path <subdir>] [--name <local-name>] [--all] [-g] # --all: add every skill under --path
|
|
156
177
|
spm target add [vendor ...] # add target vendor(s); no arg = pick interactively
|
|
157
|
-
spm remove <name>
|
|
158
|
-
spm update [name]
|
|
159
|
-
spm install
|
|
160
|
-
spm list
|
|
161
|
-
spm status
|
|
162
|
-
spm clean
|
|
178
|
+
spm remove <name> [-g] # drop a skill
|
|
179
|
+
spm update [name] [-g] # re-resolve branches/tags to latest
|
|
180
|
+
spm install [-g] # rebuild from ai.lock (after clone)
|
|
181
|
+
spm list [-g] # show skills + pinned commits
|
|
182
|
+
spm status [-g] # check skills are materialized in this checkout
|
|
183
|
+
spm clean [-g] # remove generated vendor config
|
|
184
|
+
spm prune [--yes] # wipe the global fetch cache ($SPM_HOME/store, default ~/.spm/store)
|
|
185
|
+
```
|
|
186
|
+
|
|
187
|
+
## Global skills (`-g` / `--global`)
|
|
188
|
+
|
|
189
|
+
By default every command operates on the **project** in the current directory.
|
|
190
|
+
Pass `-g` (`--global`) to instead manage a **user-global** set of skills that is
|
|
191
|
+
available to your AI tools in *every* project:
|
|
192
|
+
|
|
193
|
+
```bash
|
|
194
|
+
spm init -g --target copilot # create the global manifest ($SPM_HOME/ai.json)
|
|
195
|
+
spm add -g <git> --tag v1.0.0 --name reviewer # install a skill globally
|
|
196
|
+
spm list -g # list global skills
|
|
197
|
+
spm remove -g reviewer # drop a global skill
|
|
198
|
+
spm clean -g # remove global vendor config
|
|
163
199
|
```
|
|
164
200
|
|
|
201
|
+
- The global **manifest + lock** live under `$SPM_HOME` (default `~/.spm/ai.json`
|
|
202
|
+
and `~/.spm/ai.lock`) β commit/sync them with your dotfiles for a reproducible
|
|
203
|
+
personal setup. They reuse the same fetch cache as project installs.
|
|
204
|
+
- **Where global skills materialize:**
|
|
205
|
+
- **Copilot CLI** β `~/.copilot/skills/<name>/` (its personal-skills dir). This
|
|
206
|
+
directory is *shared* with skills you author by hand, so spm only ever
|
|
207
|
+
touches the entries it manages and never wipes the whole directory.
|
|
208
|
+
- **Claude** β a self-contained marketplace under `$SPM_HOME/claude-global/`,
|
|
209
|
+
registered in `~/.claude/settings.json` under the marketplace name
|
|
210
|
+
`spm-global` (skills invoked as `/spm-global:<name>`). A distinct name keeps
|
|
211
|
+
it from colliding with a project's `spm` marketplace.
|
|
212
|
+
- A skill installed in **both** scopes collides by name at discovery time
|
|
213
|
+
(`/spm:foo` vs `/spm-global:foo` for Claude; a duplicate `foo` dir for
|
|
214
|
+
Copilot). `spm status` warns when it detects such a global/project shadow.
|
|
215
|
+
|
|
165
216
|
## Worktrees & fresh clones
|
|
166
217
|
|
|
167
218
|
spm materializes skills into **gitignored** project-local dirs (`.spm/claude/`,
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@camunda8/spm",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.6.0",
|
|
4
4
|
"description": "Skill package manager (spm): declare AI skills in ai.json and materialize them for Claude/Copilot.",
|
|
5
5
|
"license": "Apache-2.0",
|
|
6
6
|
"homepage": "https://github.com/camunda/spm-cli#readme",
|
|
@@ -33,10 +33,10 @@
|
|
|
33
33
|
"node": ">=18"
|
|
34
34
|
},
|
|
35
35
|
"optionalDependencies": {
|
|
36
|
-
"@camunda8/spm-linux-x64": "0.
|
|
37
|
-
"@camunda8/spm-linux-arm64": "0.
|
|
38
|
-
"@camunda8/spm-darwin-x64": "0.
|
|
39
|
-
"@camunda8/spm-darwin-arm64": "0.
|
|
40
|
-
"@camunda8/spm-win32-x64": "0.
|
|
36
|
+
"@camunda8/spm-linux-x64": "0.6.0",
|
|
37
|
+
"@camunda8/spm-linux-arm64": "0.6.0",
|
|
38
|
+
"@camunda8/spm-darwin-x64": "0.6.0",
|
|
39
|
+
"@camunda8/spm-darwin-arm64": "0.6.0",
|
|
40
|
+
"@camunda8/spm-win32-x64": "0.6.0"
|
|
41
41
|
}
|
|
42
42
|
}
|