Example migration from PAI v1.x to PAI v2.3
- Research upstream changes
- Create migration plan
- Document plan
- Clone upstream repo to ~/Documents/src/PAI-v2.3/
- Checkout v2.3.0 tag
- Copy release to ~/.claude-v2.3-staging/
- Backup v1.x to ~/Documents/backups/
- Revert v1.x repo settings.json to clean state
- Remove ~/.claude symlink, copy fresh v2.3
- Run install wizard (verify voice server works)
- Save vanilla baseline (e.g., ~/Documents/src/PAI-baselines/pai-2.3-vanilla)
- Set up source control (symlink pattern)
- Create private repo for your PAI fork
- Move ~/.claude to ~/Documents/src/PAI-v2.3-dev/.claude
- Create symlink ~/.claude → PAI-v2.3-dev/.claude
- Configure remotes: origin (private), fork (public), upstream (danielmiessler)
- Initial commit: "feat: Initial PAI v2.3 vanilla baseline"
- Push to origin/main
- Install pai-switch script (enables toggling between v1/v2)
- Test switching between versions
- Set up personal data repo (separate from PAI core)
- Create private repo for personal data
- Move MEMORY/USER/WORK to separate directory
- Create symlinks from ~/.claude to personal data repo
- Initial commit and push
- Copy .env from v1.x (API keys)
- Validate v2.3 in new Claude session
- Rename skills with
_prefix (personal/work skills use _ALLCAPS convention) - Migrate skill customizations to SKILLCUSTOMIZATIONS/ directory
- Update USE WHEN triggers in SKILL.md files
- .env (API keys)
- profiles/ (any tool profiles like jira, coupa, etc.)
- hooks - kept v2.3 hooks (review for compatibility)
- CLIs migrated to bin/ directory
- Skills recognized (check startup banner)
- CLIs working (test each one)
- Run tests if available
- System integrity check passed
- Personal data symlinks verified
- Switch to v2.3 production: update ~/.claude symlink
- Save post-migration baseline
- Verify functionality in production
| Decision | Rationale |
|---|---|
| Use staging location (~/.claude-v2.3-staging) | Keep v1.x production running during migration |
| Save vanilla baseline before customizing | Enable quick restore if testing breaks |
| Use symlink pattern for source control | Keeps full repo structure, easy to update |
| Separate personal data repo | Keeps sensitive data isolated from PAI core |
-
PAI_DIR must use absolute path - The default
settings.jsonmay use~/.claudewhich doesn't expand in hook execution. Change to absolute path like/Users/yourname/.claude. -
Test in staging first - Don't overwrite your working v1.x installation until v2.3 is fully validated.
-
Save baselines - Copy your vanilla and migrated states to separate directories for easy rollback.
-
Symlink architecture - The recommended pattern:
~/.claude → ~/Documents/src/PAI-v2.3-dev/.claude (your fork) ~/.claude/MEMORY → ~/Documents/src/pai-personal-data/MEMORY ~/.claude/USER → ~/Documents/src/pai-personal-data/USER ~/.claude/WORK → ~/Documents/src/pai-personal-data/WORK -
Three remotes for contributions:
origin- your private fork (main working copy)fork- your public fork (for PRs)upstream- danielmiessler/PAI (official repo)
| Repo | Purpose |
|---|---|
| ~/.claude | Your private PAI fork |
| pai-personal-data | Private personal data (MEMORY/USER/WORK) |
| pai-tooling | Optional: shared tooling/scripts |
~/.claude → ~/Documents/src/PAI-v2.3-dev/.claude
~/.claude/MEMORY → pai-personal-data/MEMORY
~/.claude/USER → pai-personal-data/USER
~/.claude/WORK → pai-personal-data/WORK
- pai-2.3-vanilla (clean v2.3 before customization)
- pai-2.3-migrated (with all personal skills migrated)