@anytio/pspm 0.1.1 → 0.2.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/CHANGELOG.md +221 -0
- package/CLI_GUIDE.md +465 -0
- package/LICENSE +176 -109
- package/README.md +31 -93
- package/bin/pspm.js +2 -0
- package/dist/index.js +374 -329
- package/dist/index.js.map +1 -1
- package/package.json +41 -38
package/CHANGELOG.md
ADDED
|
@@ -0,0 +1,221 @@
|
|
|
1
|
+
# Changelog
|
|
2
|
+
|
|
3
|
+
All notable changes to the PSPM CLI will be documented in this file.
|
|
4
|
+
|
|
5
|
+
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
|
|
6
|
+
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
|
7
|
+
|
|
8
|
+
## [0.2.0] - 2026-01-23
|
|
9
|
+
|
|
10
|
+
### Changed
|
|
11
|
+
|
|
12
|
+
- **License changed to The Artistic License 2.0** - Same license used by npm, providing a balance between open source availability and artistic control
|
|
13
|
+
- **Version reset to 0.2.0** - First public open source release
|
|
14
|
+
|
|
15
|
+
## [0.1.1] - 2026-01-23
|
|
16
|
+
|
|
17
|
+
### Added
|
|
18
|
+
|
|
19
|
+
- **Multiple package support for `add` command**: Install multiple packages in a single command
|
|
20
|
+
- `pspm add pkg1 pkg2 pkg3` - Add multiple packages at once
|
|
21
|
+
- Continues with remaining packages if one fails
|
|
22
|
+
- Shows summary of successes/failures when adding multiple packages
|
|
23
|
+
|
|
24
|
+
- **Multiple package support for `install` command**: npm-like behavior
|
|
25
|
+
- `pspm install pkg1 pkg2` - Add and install specific packages (delegates to `add`)
|
|
26
|
+
- `pspm install` (no args) - Install from lockfile (original behavior)
|
|
27
|
+
- Mirrors npm's install command behavior
|
|
28
|
+
|
|
29
|
+
### Changed
|
|
30
|
+
|
|
31
|
+
- **Validation before agent selection**: Packages are now validated before prompting for agent selection
|
|
32
|
+
- Resolves and validates all packages first
|
|
33
|
+
- Only prompts for agents after validation succeeds
|
|
34
|
+
- Prevents wasted time selecting agents for non-existent packages
|
|
35
|
+
|
|
36
|
+
- **Default agents changed to all agents**: When using `-y` flag or defaults
|
|
37
|
+
- Previously defaulted to `claude-code` only
|
|
38
|
+
- Now defaults to all built-in agents: `claude-code`, `codex`, `cursor`, `gemini`, `kiro`, `opencode`
|
|
39
|
+
- Use `--agent claude-code` to install for a single agent
|
|
40
|
+
|
|
41
|
+
## [0.1.0] - 2026-01-23
|
|
42
|
+
|
|
43
|
+
### Added
|
|
44
|
+
|
|
45
|
+
- **GitHub dependencies**: Install skills directly from GitHub repositories
|
|
46
|
+
- `pspm add github:owner/repo` - Install entire repository
|
|
47
|
+
- `pspm add github:owner/repo/path` - Install specific subdirectory
|
|
48
|
+
- `pspm add github:owner/repo@ref` - Pin to branch, tag, or commit
|
|
49
|
+
- GitHub packages stored in `.pspm/skills/_github/{owner}/{repo}/`
|
|
50
|
+
- `githubDependencies` section in `pspm.json`
|
|
51
|
+
- `githubPackages` section in lockfile (version 3)
|
|
52
|
+
|
|
53
|
+
- **Multi-agent symlink support**: Link skills to multiple AI agent configurations
|
|
54
|
+
- `--agent` flag on `add`, `install`, and `link` commands
|
|
55
|
+
- Default agents: `claude-code` (`.claude/skills/`), `cursor` (`.cursor/skills/`), `codex` (`.codex/skills/`)
|
|
56
|
+
- Custom agent configurations in `pspm.json` under `agents` field
|
|
57
|
+
- Relative symlinks for portability across machines
|
|
58
|
+
- `--agent none` to skip symlink creation
|
|
59
|
+
|
|
60
|
+
- **New `link` command**: Recreate agent symlinks without reinstalling
|
|
61
|
+
- `pspm link` - Recreate symlinks for all installed skills
|
|
62
|
+
- `pspm link --agent claude-code,cursor` - Link to specific agents
|
|
63
|
+
|
|
64
|
+
- **Enhanced `list` command**: Shows source type and linked agents
|
|
65
|
+
- Displays whether skill is from registry or GitHub
|
|
66
|
+
- Shows which agents have symlinks to each skill
|
|
67
|
+
|
|
68
|
+
### Changed
|
|
69
|
+
|
|
70
|
+
- Lockfile version bumped to 3 to support `githubPackages`
|
|
71
|
+
- `install` command now processes both registry and GitHub dependencies
|
|
72
|
+
- `remove` command now cleans up symlinks from all configured agents
|
|
73
|
+
|
|
74
|
+
## [0.0.7] - 2026-01-23
|
|
75
|
+
|
|
76
|
+
### Added
|
|
77
|
+
|
|
78
|
+
- **Public packages support**: Packages can now be made public, allowing anyone to download without authentication
|
|
79
|
+
- New `pspm access` command to change package visibility
|
|
80
|
+
- `--access` flag on `pspm publish` to set visibility during publish
|
|
81
|
+
- Public packages can be installed without authentication
|
|
82
|
+
- Visibility change is one-way: public packages cannot be made private again (npm-style)
|
|
83
|
+
|
|
84
|
+
- **Multi-registry authentication**: npm-style configuration for multiple registries
|
|
85
|
+
- Scope-to-registry mappings: `@myorg:registry = https://corp.pspm.io`
|
|
86
|
+
- Per-registry auth tokens: `//pspm.dev:authToken = sk_xxx`
|
|
87
|
+
- Automatic token selection based on registry URL
|
|
88
|
+
|
|
89
|
+
- **Auth-optional downloads**: `pspm add` and `pspm install` no longer require authentication for public packages
|
|
90
|
+
- Private packages still require authentication
|
|
91
|
+
- Clear error messages when authentication is needed
|
|
92
|
+
|
|
93
|
+
### Changed
|
|
94
|
+
|
|
95
|
+
- Configuration format extended to support multi-registry authentication
|
|
96
|
+
- SDK `apiKey` is now optional to support public package downloads
|
|
97
|
+
- Directory structure changed: skills now installed to `.pspm/skills/` (previously `.skills/`)
|
|
98
|
+
- Lockfile path changed to `pspm-lock.json` (previously `skill-lock.json`)
|
|
99
|
+
|
|
100
|
+
## [0.0.6] - 2026-01-22
|
|
101
|
+
|
|
102
|
+
### Changed
|
|
103
|
+
|
|
104
|
+
- Fixed presigned R2 download URLs to skip auth headers
|
|
105
|
+
- Use versionInfo.downloadUrl instead of manual URL construction
|
|
106
|
+
|
|
107
|
+
## [0.0.5] - 2026-01-22
|
|
108
|
+
|
|
109
|
+
### Changed
|
|
110
|
+
|
|
111
|
+
- **BREAKING: Simplified configuration to npm-like INI format**
|
|
112
|
+
- Config file moved from `~/.pspm/config.json` to `~/.pspmrc`
|
|
113
|
+
- Uses INI format (like `.npmrc`) instead of JSON
|
|
114
|
+
- Automatic migration from old config on first run
|
|
115
|
+
- Project config `.pspmrc` now uses INI format
|
|
116
|
+
|
|
117
|
+
- **BREAKING: Removed profile system**
|
|
118
|
+
- Removed commands: `config list`, `config add`, `config use`, `config set`, `config delete`
|
|
119
|
+
- Removed `--profile` global flag
|
|
120
|
+
- Removed `PSPM_PROFILE` environment variable
|
|
121
|
+
- Use `PSPM_REGISTRY_URL` and `PSPM_API_KEY` env vars to switch registries
|
|
122
|
+
|
|
123
|
+
### Simplified Config Format
|
|
124
|
+
|
|
125
|
+
**Before (v0.0.4):**
|
|
126
|
+
```json
|
|
127
|
+
{
|
|
128
|
+
"version": 2,
|
|
129
|
+
"defaultProfile": "default",
|
|
130
|
+
"profiles": {
|
|
131
|
+
"default": {
|
|
132
|
+
"registryUrl": "https://pspm.dev",
|
|
133
|
+
"apiKey": "sk_...",
|
|
134
|
+
"username": "myuser"
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
```
|
|
139
|
+
|
|
140
|
+
**After (v0.0.5):**
|
|
141
|
+
```ini
|
|
142
|
+
; PSPM Configuration
|
|
143
|
+
registry = https://pspm.dev
|
|
144
|
+
authToken = sk_...
|
|
145
|
+
username = myuser
|
|
146
|
+
```
|
|
147
|
+
|
|
148
|
+
### Migration
|
|
149
|
+
|
|
150
|
+
Existing users will have their config automatically migrated on first run. Only the default profile credentials are preserved. If you used multiple profiles, use environment variables instead:
|
|
151
|
+
|
|
152
|
+
```bash
|
|
153
|
+
# Instead of: pspm add --profile production
|
|
154
|
+
PSPM_REGISTRY_URL=https://prod.example.com pspm add @user/skill
|
|
155
|
+
```
|
|
156
|
+
|
|
157
|
+
## [0.0.4] - 2026-01-22
|
|
158
|
+
|
|
159
|
+
### Added
|
|
160
|
+
|
|
161
|
+
- **npm-style publish output**: Display detailed package information when publishing, including:
|
|
162
|
+
- Package name and version
|
|
163
|
+
- Tarball contents with file sizes
|
|
164
|
+
- Tarball details (filename, package size, unpacked size, shasum, integrity hash, total files)
|
|
165
|
+
- Publishing destination URL
|
|
166
|
+
- **Improved error messages**: npm-style E403 error codes for version conflicts
|
|
167
|
+
|
|
168
|
+
### Changed
|
|
169
|
+
|
|
170
|
+
- Publish output now uses `pspm notice` prefix for consistency with npm
|
|
171
|
+
- Success message format changed to `+ @user/username/skill@version`
|
|
172
|
+
- Default registry URL simplified from `https://pspm.dev/api/skills` to `https://pspm.dev`
|
|
173
|
+
|
|
174
|
+
## [0.0.3] - 2026-01-21
|
|
175
|
+
|
|
176
|
+
### Added
|
|
177
|
+
|
|
178
|
+
- Browser-based OAuth login flow with local callback server
|
|
179
|
+
- Support for CLI token exchange via `/api/api-keys/cli-token-exchange`
|
|
180
|
+
- Structured error handling with `extractApiErrorMessage` helper
|
|
181
|
+
- Debug mode via `PSPM_DEBUG` environment variable
|
|
182
|
+
|
|
183
|
+
### Fixed
|
|
184
|
+
|
|
185
|
+
- CLI URL duplication issue when registry URL already contains path
|
|
186
|
+
- Server error handling now uses `app.onError` for reliable error responses
|
|
187
|
+
- API error messages now properly extract and display validation details
|
|
188
|
+
|
|
189
|
+
### Changed
|
|
190
|
+
|
|
191
|
+
- Migrated from oRPC client to generated SDK using Orval
|
|
192
|
+
- Improved error message formatting for validation errors
|
|
193
|
+
|
|
194
|
+
## [0.0.2] - 2026-01-20
|
|
195
|
+
|
|
196
|
+
### Added
|
|
197
|
+
|
|
198
|
+
- Multi-profile configuration support
|
|
199
|
+
- Project-level `.pspmrc` configuration file
|
|
200
|
+
- Environment variable overrides (`PSPM_PROFILE`, `PSPM_REGISTRY_URL`, `PSPM_API_KEY`)
|
|
201
|
+
- `config` subcommands: `list`, `show`, `add`, `use`, `set`, `delete`, `init`
|
|
202
|
+
- Lockfile support with `skill-lock.json`
|
|
203
|
+
- `--frozen-lockfile` option for CI/CD environments
|
|
204
|
+
- `update` command for updating skills to latest compatible versions
|
|
205
|
+
- `unpublish` command for removing published skill versions
|
|
206
|
+
|
|
207
|
+
### Changed
|
|
208
|
+
|
|
209
|
+
- Configuration format updated to version 2 with profile support
|
|
210
|
+
- Skills now installed to `.skills/{username}/{name}/` directory structure
|
|
211
|
+
|
|
212
|
+
## [0.0.1] - 2026-01-19
|
|
213
|
+
|
|
214
|
+
### Added
|
|
215
|
+
|
|
216
|
+
- Initial release
|
|
217
|
+
- Core commands: `login`, `logout`, `whoami`
|
|
218
|
+
- Skill management: `add`, `remove`, `list`, `install`
|
|
219
|
+
- Publishing: `publish` with `--bump` option
|
|
220
|
+
- Basic configuration with `~/.pspm/config.json`
|
|
221
|
+
- Semver range support for skill specifiers
|
package/CLI_GUIDE.md
ADDED
|
@@ -0,0 +1,465 @@
|
|
|
1
|
+
# PSPM CLI Guide
|
|
2
|
+
|
|
3
|
+
PSPM (Prompt Skill Package Manager) is a CLI tool for managing prompt skills across AI coding agents. It provides commands for authentication, configuration, skill management, and publishing.
|
|
4
|
+
|
|
5
|
+
## Installation
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
# Install globally
|
|
9
|
+
npm install -g @anytio/pspm
|
|
10
|
+
|
|
11
|
+
# Or use with npx
|
|
12
|
+
npx @anytio/pspm <command>
|
|
13
|
+
```
|
|
14
|
+
|
|
15
|
+
## Command Reference
|
|
16
|
+
|
|
17
|
+
```
|
|
18
|
+
Usage: pspm [options] [command]
|
|
19
|
+
|
|
20
|
+
Prompt Skill Package Manager for AI coding agents
|
|
21
|
+
|
|
22
|
+
Options:
|
|
23
|
+
-V, --version output the version number
|
|
24
|
+
-h, --help display help for command
|
|
25
|
+
|
|
26
|
+
Commands:
|
|
27
|
+
config Manage PSPM configuration
|
|
28
|
+
login [options] Log in via browser or with an API key
|
|
29
|
+
logout Log out and clear stored credentials
|
|
30
|
+
whoami Show current user information
|
|
31
|
+
init [options] Create a new pspm.json manifest in the current directory
|
|
32
|
+
migrate [options] Migrate from old directory structure (.skills/, skill-lock.json)
|
|
33
|
+
add [options] <specifiers...> Add one or more skills
|
|
34
|
+
remove|rm <name> Remove an installed skill
|
|
35
|
+
list|ls [options] List installed skills
|
|
36
|
+
install|i [options] [specifiers...] Install skills from lockfile, or add and install specific packages
|
|
37
|
+
link [options] Recreate agent symlinks without reinstalling
|
|
38
|
+
update [options] Update all skills to latest compatible versions
|
|
39
|
+
publish [options] Publish current directory as a skill
|
|
40
|
+
unpublish [options] <specifier> Remove a published skill version (only within 72 hours of publishing)
|
|
41
|
+
access [options] [specifier] Change package visibility (public/private)
|
|
42
|
+
deprecate [options] <specifier> [message] Mark a skill version as deprecated (alternative to unpublish after 72 hours)
|
|
43
|
+
help [command] display help for command
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
## Authentication
|
|
47
|
+
|
|
48
|
+
### Login
|
|
49
|
+
|
|
50
|
+
Authenticate with an API key:
|
|
51
|
+
|
|
52
|
+
```bash
|
|
53
|
+
pspm login --api-key <key>
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
Or use browser-based OAuth:
|
|
57
|
+
|
|
58
|
+
```bash
|
|
59
|
+
pspm login
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
### Logout
|
|
63
|
+
|
|
64
|
+
Remove stored credentials:
|
|
65
|
+
|
|
66
|
+
```bash
|
|
67
|
+
pspm logout
|
|
68
|
+
```
|
|
69
|
+
|
|
70
|
+
### Who Am I
|
|
71
|
+
|
|
72
|
+
Display current user information:
|
|
73
|
+
|
|
74
|
+
```bash
|
|
75
|
+
pspm whoami
|
|
76
|
+
|
|
77
|
+
# Output:
|
|
78
|
+
# Username: myuser
|
|
79
|
+
# User ID: user_123
|
|
80
|
+
# Registry: https://pspm.dev
|
|
81
|
+
```
|
|
82
|
+
|
|
83
|
+
## Configuration
|
|
84
|
+
|
|
85
|
+
### Show Configuration
|
|
86
|
+
|
|
87
|
+
Display resolved configuration and config file locations:
|
|
88
|
+
|
|
89
|
+
```bash
|
|
90
|
+
pspm config show
|
|
91
|
+
|
|
92
|
+
# Output:
|
|
93
|
+
# Resolved Configuration:
|
|
94
|
+
#
|
|
95
|
+
# Registry URL: https://pspm.dev
|
|
96
|
+
# API Key: ***
|
|
97
|
+
# Username: myuser
|
|
98
|
+
#
|
|
99
|
+
# Config Locations:
|
|
100
|
+
# User config: /Users/you/.pspmrc
|
|
101
|
+
# Project config: (none)
|
|
102
|
+
#
|
|
103
|
+
# Environment Variables:
|
|
104
|
+
# PSPM_REGISTRY_URL: (not set)
|
|
105
|
+
# PSPM_API_KEY: (not set)
|
|
106
|
+
```
|
|
107
|
+
|
|
108
|
+
### Initialize Project Config
|
|
109
|
+
|
|
110
|
+
Create a `.pspmrc` file in the current directory:
|
|
111
|
+
|
|
112
|
+
```bash
|
|
113
|
+
pspm config init
|
|
114
|
+
pspm config init --registry https://custom.example.com
|
|
115
|
+
```
|
|
116
|
+
|
|
117
|
+
## Project Initialization
|
|
118
|
+
|
|
119
|
+
### Initialize Manifest
|
|
120
|
+
|
|
121
|
+
Create a new `pspm.json` manifest file in the current directory:
|
|
122
|
+
|
|
123
|
+
```bash
|
|
124
|
+
pspm init # Interactive prompts
|
|
125
|
+
pspm init -y # Use defaults, skip prompts
|
|
126
|
+
pspm init -n my-skill # Specify name
|
|
127
|
+
pspm init -d "My skill" # Specify description
|
|
128
|
+
pspm init -a "Your Name" # Specify author
|
|
129
|
+
pspm init -f # Overwrite existing pspm.json
|
|
130
|
+
```
|
|
131
|
+
|
|
132
|
+
### Migrate from Old Structure
|
|
133
|
+
|
|
134
|
+
Migrate from old directory structure (`.skills/`, `skill-lock.json`):
|
|
135
|
+
|
|
136
|
+
```bash
|
|
137
|
+
pspm migrate # Perform migration
|
|
138
|
+
pspm migrate --dry-run # Preview changes without applying
|
|
139
|
+
```
|
|
140
|
+
|
|
141
|
+
## Skill Management
|
|
142
|
+
|
|
143
|
+
### Add Skill
|
|
144
|
+
|
|
145
|
+
Add a skill to the project and install it:
|
|
146
|
+
|
|
147
|
+
```bash
|
|
148
|
+
pspm add <specifier> [--agent <agents>]
|
|
149
|
+
|
|
150
|
+
# Registry specifier formats:
|
|
151
|
+
pspm add @user/bsheng/vite_slides # Latest version
|
|
152
|
+
pspm add @user/bsheng/vite_slides@2.0.0 # Specific version
|
|
153
|
+
pspm add @user/bsheng/vite_slides@^2.0.0 # Semver range
|
|
154
|
+
|
|
155
|
+
# GitHub specifier formats:
|
|
156
|
+
pspm add github:owner/repo # Entire repo, default branch
|
|
157
|
+
pspm add github:owner/repo@main # Entire repo, specific branch
|
|
158
|
+
pspm add github:owner/repo/path/to/skill # Subdirectory, default branch
|
|
159
|
+
pspm add github:owner/repo/path@v1.0.0 # Subdirectory with tag/ref
|
|
160
|
+
|
|
161
|
+
# Add multiple skills at once:
|
|
162
|
+
pspm add @user/alice/skill1 @user/bob/skill2
|
|
163
|
+
|
|
164
|
+
# Agent options:
|
|
165
|
+
pspm add @user/skill --agent claude-code,cursor # Link to multiple agents
|
|
166
|
+
pspm add github:owner/repo --agent none # Skip symlink creation
|
|
167
|
+
pspm add @user/skill -y # Skip agent selection prompt
|
|
168
|
+
```
|
|
169
|
+
|
|
170
|
+
### Remove Skill
|
|
171
|
+
|
|
172
|
+
```bash
|
|
173
|
+
pspm remove <name>
|
|
174
|
+
pspm rm <name>
|
|
175
|
+
|
|
176
|
+
# Examples:
|
|
177
|
+
pspm remove vite_slides
|
|
178
|
+
pspm rm @user/bsheng/vite_slides
|
|
179
|
+
```
|
|
180
|
+
|
|
181
|
+
### List Skills
|
|
182
|
+
|
|
183
|
+
```bash
|
|
184
|
+
pspm list
|
|
185
|
+
pspm ls
|
|
186
|
+
|
|
187
|
+
# JSON output for scripting
|
|
188
|
+
pspm list --json
|
|
189
|
+
|
|
190
|
+
# Example output:
|
|
191
|
+
# Installed skills:
|
|
192
|
+
#
|
|
193
|
+
# @user/alice/code-review@1.2.0 (registry)
|
|
194
|
+
# -> .claude/skills/code-review
|
|
195
|
+
#
|
|
196
|
+
# github:owner/repo/skills/react-tips (main@abc1234)
|
|
197
|
+
# -> .claude/skills/react-tips, .cursor/skills/react-tips
|
|
198
|
+
#
|
|
199
|
+
# Total: 2 skill(s) (1 registry, 1 github)
|
|
200
|
+
```
|
|
201
|
+
|
|
202
|
+
### Install Skills
|
|
203
|
+
|
|
204
|
+
Install all skills from the lockfile:
|
|
205
|
+
|
|
206
|
+
```bash
|
|
207
|
+
pspm install
|
|
208
|
+
pspm i
|
|
209
|
+
|
|
210
|
+
# With options:
|
|
211
|
+
pspm install --frozen-lockfile # CI/CD mode - fail if lockfile missing
|
|
212
|
+
pspm install --dir ./vendor/skills # Install to specific directory
|
|
213
|
+
pspm install --agent claude-code,cursor # Link to multiple agents
|
|
214
|
+
pspm install --agent none # Skip symlink creation
|
|
215
|
+
pspm install -y # Skip agent selection prompt
|
|
216
|
+
|
|
217
|
+
# Install specific packages (like npm):
|
|
218
|
+
pspm install @user/alice/skill1 github:org/repo
|
|
219
|
+
```
|
|
220
|
+
|
|
221
|
+
### Link Skills
|
|
222
|
+
|
|
223
|
+
Recreate agent symlinks without reinstalling (useful after adding agents):
|
|
224
|
+
|
|
225
|
+
```bash
|
|
226
|
+
pspm link
|
|
227
|
+
pspm link --agent claude-code,cursor # Link to specific agents
|
|
228
|
+
pspm link -y # Skip agent selection prompt
|
|
229
|
+
```
|
|
230
|
+
|
|
231
|
+
### Update Skills
|
|
232
|
+
|
|
233
|
+
```bash
|
|
234
|
+
pspm update
|
|
235
|
+
pspm update --dry-run # Preview updates without applying
|
|
236
|
+
```
|
|
237
|
+
|
|
238
|
+
## Publishing
|
|
239
|
+
|
|
240
|
+
### Publish Skill
|
|
241
|
+
|
|
242
|
+
Publish the current directory as a skill:
|
|
243
|
+
|
|
244
|
+
```bash
|
|
245
|
+
pspm publish
|
|
246
|
+
pspm publish --bump patch # Auto-bump version (major, minor, patch)
|
|
247
|
+
pspm publish --bump minor --tag beta
|
|
248
|
+
pspm publish --access public # Publish and make public in one step
|
|
249
|
+
```
|
|
250
|
+
|
|
251
|
+
**Required `pspm.json` fields:**
|
|
252
|
+
- `name` - Skill name (e.g., `@user/username/skillname`)
|
|
253
|
+
- `version` - Semver version
|
|
254
|
+
|
|
255
|
+
**Optional `pspm.json` fields:**
|
|
256
|
+
- `description` - Skill description
|
|
257
|
+
- `author` - Author name
|
|
258
|
+
- `files` - Files to include (default: `["pspm.json", "SKILL.md", "runtime", "scripts", "data"]`)
|
|
259
|
+
|
|
260
|
+
### Unpublish Skill
|
|
261
|
+
|
|
262
|
+
Remove a published skill version (only within 72 hours of publishing):
|
|
263
|
+
|
|
264
|
+
```bash
|
|
265
|
+
pspm unpublish <specifier> --force
|
|
266
|
+
|
|
267
|
+
# Delete specific version
|
|
268
|
+
pspm unpublish @user/bsheng/vite_slides@2.0.0 --force
|
|
269
|
+
|
|
270
|
+
# Delete all versions
|
|
271
|
+
pspm unpublish @user/bsheng/vite_slides --force
|
|
272
|
+
```
|
|
273
|
+
|
|
274
|
+
### Deprecate Skill
|
|
275
|
+
|
|
276
|
+
Mark a skill version as deprecated (alternative to unpublish after 72 hours):
|
|
277
|
+
|
|
278
|
+
```bash
|
|
279
|
+
pspm deprecate <specifier> [message]
|
|
280
|
+
|
|
281
|
+
# Deprecate with message
|
|
282
|
+
pspm deprecate @user/bsheng/old-skill@1.0.0 "Use @user/bsheng/new-skill instead"
|
|
283
|
+
|
|
284
|
+
# Remove deprecation
|
|
285
|
+
pspm deprecate @user/bsheng/old-skill@1.0.0 --undo
|
|
286
|
+
```
|
|
287
|
+
|
|
288
|
+
## Visibility
|
|
289
|
+
|
|
290
|
+
### Change Package Visibility
|
|
291
|
+
|
|
292
|
+
Change a package's visibility between public and private:
|
|
293
|
+
|
|
294
|
+
```bash
|
|
295
|
+
# Make current package public
|
|
296
|
+
pspm access --public
|
|
297
|
+
|
|
298
|
+
# Make specific package public
|
|
299
|
+
pspm access @user/bsheng/vite_slides --public
|
|
300
|
+
```
|
|
301
|
+
|
|
302
|
+
**Important:** Making a package public is irreversible (following npm conventions). Public packages cannot be made private again.
|
|
303
|
+
|
|
304
|
+
- **Private packages** (default): Require authentication to download
|
|
305
|
+
- **Public packages**: Anyone can download without authentication
|
|
306
|
+
|
|
307
|
+
## Configuration Files
|
|
308
|
+
|
|
309
|
+
### User Config: `~/.pspmrc`
|
|
310
|
+
|
|
311
|
+
INI format configuration file:
|
|
312
|
+
|
|
313
|
+
```ini
|
|
314
|
+
; PSPM Configuration
|
|
315
|
+
|
|
316
|
+
registry = https://pspm.dev
|
|
317
|
+
authToken = sk_...
|
|
318
|
+
username = myuser
|
|
319
|
+
|
|
320
|
+
; Multi-registry: Scope mappings (optional)
|
|
321
|
+
@myorg:registry = https://corp.pspm.io
|
|
322
|
+
|
|
323
|
+
; Multi-registry: Per-registry tokens (optional)
|
|
324
|
+
//pspm.dev:authToken = sk_public_token
|
|
325
|
+
//corp.pspm.io:authToken = sk_corp_token
|
|
326
|
+
```
|
|
327
|
+
|
|
328
|
+
### Project Config: `.pspmrc`
|
|
329
|
+
|
|
330
|
+
Project-specific configuration (optional):
|
|
331
|
+
|
|
332
|
+
```ini
|
|
333
|
+
; Project-specific PSPM configuration
|
|
334
|
+
|
|
335
|
+
registry = https://custom.example.com
|
|
336
|
+
```
|
|
337
|
+
|
|
338
|
+
### Manifest: `pspm.json`
|
|
339
|
+
|
|
340
|
+
Package manifest file (created with `pspm init`):
|
|
341
|
+
|
|
342
|
+
```json
|
|
343
|
+
{
|
|
344
|
+
"name": "@user/username/my-skill",
|
|
345
|
+
"version": "1.0.0",
|
|
346
|
+
"description": "A helpful skill for...",
|
|
347
|
+
"author": "Your Name",
|
|
348
|
+
"files": ["pspm.json", "SKILL.md", "runtime", "scripts", "data"]
|
|
349
|
+
}
|
|
350
|
+
```
|
|
351
|
+
|
|
352
|
+
### Lockfile: `pspm-lock.json`
|
|
353
|
+
|
|
354
|
+
```json
|
|
355
|
+
{
|
|
356
|
+
"lockfileVersion": 3,
|
|
357
|
+
"registryUrl": "https://pspm.dev",
|
|
358
|
+
"packages": {
|
|
359
|
+
"@user/bsheng/vite_slides": {
|
|
360
|
+
"version": "2.0.0",
|
|
361
|
+
"resolved": "https://pspm.dev/...",
|
|
362
|
+
"integrity": "sha256-abc123..."
|
|
363
|
+
}
|
|
364
|
+
},
|
|
365
|
+
"githubPackages": {
|
|
366
|
+
"github:owner/repo/path": {
|
|
367
|
+
"version": "abc1234",
|
|
368
|
+
"resolved": "https://github.com/owner/repo",
|
|
369
|
+
"integrity": "sha256-...",
|
|
370
|
+
"gitCommit": "abc1234567890...",
|
|
371
|
+
"gitRef": "main"
|
|
372
|
+
}
|
|
373
|
+
}
|
|
374
|
+
}
|
|
375
|
+
```
|
|
376
|
+
|
|
377
|
+
## Configuration Resolution
|
|
378
|
+
|
|
379
|
+
Configuration is resolved in priority order:
|
|
380
|
+
|
|
381
|
+
1. **Environment Variables** (`PSPM_REGISTRY_URL`, `PSPM_API_KEY`) - Highest
|
|
382
|
+
2. **Project Config** (`.pspmrc` in project directory)
|
|
383
|
+
3. **User Config** (`~/.pspmrc`)
|
|
384
|
+
4. **Defaults** - Lowest
|
|
385
|
+
|
|
386
|
+
## Environment Variables
|
|
387
|
+
|
|
388
|
+
| Variable | Purpose |
|
|
389
|
+
|----------|---------|
|
|
390
|
+
| `PSPM_API_KEY` | Override API key |
|
|
391
|
+
| `PSPM_DEBUG` | Enable debug logging |
|
|
392
|
+
| `GITHUB_TOKEN` | GitHub token for private repos and higher rate limits |
|
|
393
|
+
|
|
394
|
+
## Directory Structure
|
|
395
|
+
|
|
396
|
+
```
|
|
397
|
+
project/
|
|
398
|
+
├── .pspmrc # Project config (optional)
|
|
399
|
+
├── pspm.json # Manifest with dependencies
|
|
400
|
+
├── pspm-lock.json # Lockfile
|
|
401
|
+
├── .pspm/
|
|
402
|
+
│ ├── skills/ # Installed skills
|
|
403
|
+
│ │ ├── {username}/ # Registry skills
|
|
404
|
+
│ │ │ └── {skillname}/
|
|
405
|
+
│ │ └── _github/ # GitHub skills
|
|
406
|
+
│ │ └── {owner}/
|
|
407
|
+
│ │ └── {repo}/
|
|
408
|
+
│ │ └── {path}/
|
|
409
|
+
│ └── cache/ # Tarball cache
|
|
410
|
+
├── .claude/
|
|
411
|
+
│ └── skills/ # Symlinks for claude-code agent
|
|
412
|
+
└── .cursor/
|
|
413
|
+
└── skills/ # Symlinks for cursor agent (if configured)
|
|
414
|
+
|
|
415
|
+
~/
|
|
416
|
+
└── .pspmrc # User config
|
|
417
|
+
```
|
|
418
|
+
|
|
419
|
+
## Common Workflows
|
|
420
|
+
|
|
421
|
+
### CI/CD Integration
|
|
422
|
+
|
|
423
|
+
```bash
|
|
424
|
+
# Use environment variable for authentication
|
|
425
|
+
export PSPM_API_KEY=sk_ci_key
|
|
426
|
+
|
|
427
|
+
# Install with frozen lockfile (fails if lockfile missing or outdated)
|
|
428
|
+
pspm install --frozen-lockfile
|
|
429
|
+
```
|
|
430
|
+
|
|
431
|
+
### Publishing Workflow
|
|
432
|
+
|
|
433
|
+
```bash
|
|
434
|
+
# Initialize a new skill
|
|
435
|
+
pspm init
|
|
436
|
+
|
|
437
|
+
# Edit pspm.json and create SKILL.md
|
|
438
|
+
# Then publish with auto-bump
|
|
439
|
+
pspm publish --bump patch
|
|
440
|
+
```
|
|
441
|
+
|
|
442
|
+
## Troubleshooting
|
|
443
|
+
|
|
444
|
+
| Error | Solution |
|
|
445
|
+
|-------|----------|
|
|
446
|
+
| "Not logged in" | Run `pspm login --api-key <key>` |
|
|
447
|
+
| "Invalid skill specifier" | Use format: `@user/{username}/{name}[@version]` |
|
|
448
|
+
| "No lockfile found" | Run `pspm add <specifier>` first |
|
|
449
|
+
|
|
450
|
+
Enable debug mode for detailed output:
|
|
451
|
+
|
|
452
|
+
```bash
|
|
453
|
+
PSPM_DEBUG=1 pspm <command>
|
|
454
|
+
```
|
|
455
|
+
|
|
456
|
+
## Migration from v0.0.3
|
|
457
|
+
|
|
458
|
+
If you have an existing `~/.pspm/config.json` from v0.0.3 or earlier, PSPM will automatically migrate your configuration to the new `~/.pspmrc` INI format on first run.
|
|
459
|
+
|
|
460
|
+
The migration will:
|
|
461
|
+
1. Extract credentials from your default profile
|
|
462
|
+
2. Create a new `~/.pspmrc` file
|
|
463
|
+
3. Remove the old `~/.pspm/config.json`
|
|
464
|
+
|
|
465
|
+
Use `pspm migrate` to migrate project-level files from old directory structure (`.skills/`, `skill-lock.json`).
|