@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 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`).