@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.
Files changed (2) hide show
  1. package/README.md +64 -13
  2. 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 a **project-local** directory wherever each vendor loads them from. Nothing spm generates is committed to your repo, and nothing is written into a user-global vendor location.
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** β€” the repo is **internal**, so release assets require
123
- authentication. Download with the [GitHub CLI](https://cli.github.com/) (you must
124
- be signed in via `gh auth login` and be a Camunda org member), then put the binary
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 ...] # scaffold ai.json (repeatable / comma-separated)
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> # drop a skill
158
- spm update [name] # re-resolve branches/tags to latest
159
- spm install # rebuild from ai.lock (after clone)
160
- spm list # show skills + pinned commits
161
- spm status # check skills are materialized in this checkout
162
- spm clean # remove generated vendor config
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.4.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.4.0",
37
- "@camunda8/spm-linux-arm64": "0.4.0",
38
- "@camunda8/spm-darwin-x64": "0.4.0",
39
- "@camunda8/spm-darwin-arm64": "0.4.0",
40
- "@camunda8/spm-win32-x64": "0.4.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
  }