Discover and sync all toolkit-using projects with the latest skills. Use when skills are modified, after the post-commit hook reminds you, or to batch-sync multiple projects.
Discover and sync all toolkit-using projects, the Codex CLI skill pack, and global Conductor skill symlinks with the latest skills. Skill policy is global-only: local/mixed project skill copies are treated as legacy states to migrate.
Use this skill when:
Codex skill pack location:
$CODEX_HOME/skills if CODEX_HOME is set~/.codex/skills (default)Project search paths:
$TOOLKIT_SEARCH_PATH environment variable (colon-separated paths)~/Projects (default)Search depth: 4 levels (finds ~/Projects/*/, ~/Projects/*/*/, and ~/Projects/*/*/*/)
Global skills location: ~/.claude/skills/ (symlinks for Conductor autocomplete)
Public skills repo (optional, .claude/public-skills-config.json):
{
"enabled": true,
"path": "/path/to/awesome-claude-skills"
}
Public skills manifest: .claude/public-skills-manifest.json (lists curated skills to publish)
Copy this checklist and track progress:
Update Target Projects Progress:
- [ ] Phase 1: Discover projects with toolkit-version.json
- [ ] Phase 1b: Check Codex CLI skill pack status
- [ ] Phase 1c: Check global skill symlinks (Conductor autocomplete)
- [ ] Phase 1d: Detect orphaned skills (removed from toolkit)
- [ ] Phase 1e: Check workstream scripts status
- [ ] Phase 1f: Check skill resolution mode for each project
- [ ] Phase 1g: Check public skills repo status (if configured)
- [ ] Phase 2: Detect activity status for each project
- [ ] Phase 3: Check sync status (OUTDATED vs CURRENT)
- [ ] Phase 4: Display status report (including orphans, global status, and resolution)
- [ ] Phase 5: User selection (what to sync)
- [ ] Phase 6a: Sync Codex skill pack (if selected) ā includes deletions
- [ ] Phase 6b: Sync global skill symlinks (if selected)
- [ ] Phase 6c: Sync target projects (if selected) ā includes deletions
- [ ] Phase 6d: Sync workstream scripts (if selected)
- [ ] Phase 6g: Sync Codex App setup wrapper (if selected)
- [ ] Phase 6e: Migrate legacy local/mixed projects to global skills (if selected)
- [ ] Phase 6h: Sync public skills repo (if selected)
- [ ] Phase 7: Generate summary report
See PROJECT_SYNC.md for detailed discovery and sync logic.
toolkit-version.json files in search pathstoolkit_location matchestoolkit_commit and last_sync timestampsSee CODEX_SYNC.md for detailed Codex sync logic.
See GLOBAL_SYNC.md for detailed global sync logic.
~/.claude/skills/ for existing entriesDetect .workstream/ scripts in target projects and compare file hashes with toolkit:
.workstream/ directorylib.sh, setup.sh, dev.sh, verify.sh, README.md):workstream.json.example separately (it's a reference, not a project file)toolkit-version.json under a "workstream" keyStatus determination:
MISSING ā no .workstream/ directory in targetCURRENT ā all script hashes match toolkitOUTDATED ā one or more scripts differ from toolkitFor each target project, determine current skill resolution state:
See GLOBAL_SYNC.md for the full check_project_resolution() implementation.
Summary: reads skill_resolution and force_local_skills from toolkit-version.json,
counts local skill directories, checks global symlink health via all_skills_globally_usable(),
and returns one of the resolution states below.
| Resolution State | Meaning | Available Actions |
|---|---|---|
GLOBAL |
Using global symlinks (healthy) | Keep current state |
LEGACY_LOCAL |
Local/mixed copies shadow globals | Migrate to global (option 8) |
MISSING |
No healthy global symlink state | ā ļø Repair global symlinks first |
See PUBLIC_REPO_SYNC.md for detailed public repo sync logic.
.claude/public-skills-config.jsonenabled is false, skip with status NOT CONFIGURED.claude/public-skills-manifest.json for the list of curated skills^[a-z0-9-]+$Identify skills that exist in targets but have been removed from toolkit:
See CODEX_SYNC.md and PROJECT_SYNC.md for orphan detection logic.
For each project:
TOOLKIT SYNC STATUS
===================
Toolkit: /path/to/toolkit
Current: abc1234 (2026-01-23)
GLOBAL SKILLS (Conductor Autocomplete)
āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā
Location: ~/.claude/skills
Status: CURRENT (30 symlinks active)
CODEX CLI SKILL PACK
āāāāāāāāāāāāāāāāāāāā
Location: ~/.codex/skills
Status: {status summary}
PUBLIC SKILLS REPO
āāāāāāāāāāāāāāāāāā
Location: {path or "NOT CONFIGURED"}
Status: {READY|NOT CONFIGURED|DIRTY|NOT A GIT REPO}
{If READY, show per-skill status table}
TARGET PROJECTS
āāāāāāāāāāāāāāā
# Project Sync Status Resolution Migration Activity
āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā
1 ~/Projects/app OUTDATED legacy-local ā (30 dirs) DORMANT
2 ~/Projects/api CURRENT global ā RECENT
3 ~/Projects/lib CURRENT legacy-local ā ļø 2 modified ACTIVE
Resolution column values:
global ā Skills resolve via ~/.claude/skills/ symlinkslegacy-local ā Project still has local shadow copies that should be removedMigration column values:
ā (N dirs) ā Can adopt global resolution (N skill directories to remove)ā ļø N modified ā Can adopt, but N skills have local modificationsā ā Already using global resolution (or not applicable)Prompt with options:
.claude/public-skills-config.json)Option 8 visibility: Only show if at least one project is LEGACY_LOCAL (has local
copies and global symlinks are healthy).
6a: Codex Sync ā See CODEX_SYNC.md 6b: Global Skills Sync ā See GLOBAL_SYNC.md 6c: Project Sync ā See PROJECT_SYNC.md
Global-only default: When running option 1, treat LEGACY_LOCAL projects as
"sync + migrate to global" unless the user explicitly opts out. This prevents
local shadow copies from persisting indefinitely.
6d: Workstream Scripts Sync ā Copy .workstream/*.sh, README.md, and workstream.json.example to target projects:
.workstream/ directory if missinglib.sh, setup.sh, dev.sh, verify.shREADME.md, workstream.json.examplechmod +x .workstream/*.shls -la .workstream/*.sh that scripts exist and have executable permissions.toolkit-version.json "workstream" key with new hashes. Read back the file to confirm valid JSON.workstream.json (project-owned config)6g: Codex App Setup Wrapper Sync ā Copy .codex/setup.sh to target projects:
.codex/ directory if missingsetup.sh from toolkit .codex/setup.shchmod +x .codex/setup.shls -la .codex/setup.sh that the file exists and is executable..codex/environments/ or other Codex App config (project-owned)6e: Migrate Legacy Local Skills ā Migrate from local/mixed to global resolution:
See GLOBAL_SYNC.md for state model and helper definitions.
Pre-flight checks:
all_skills_globally_usable() must return trueFor each selected project:
Detect modified local skills ā skills where current hash != stored hash.
See GLOBAL_SYNC.md for the full find_modified_skills() implementation.
It compares each skill's current SHA-256 hash against the stored hash in toolkit-version.json
and returns the list of skill names that differ.
Show migration preview:
ADOPT GLOBAL SKILLS: ~/Projects/app
āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā
Will remove: 30 skill directories
Modified skills: 2 (will be backed up)
After migration: Skills resolve via ~/.claude/skills/
ā ļø This project will no longer contain .claude/skills/.
Collaborators without ~/.claude/skills/ will lose access.
Proceed? [y/N]
If user confirms:
.claude/skills.bak/{skill}/ (if any)ls .claude/skills.bak/ that backups were created before proceeding with deletion.# Note: glob must be OUTSIDE quotes to expand
if [[ -d "$project_path/.claude/skills" ]]; then
rm -rf "$project_path/.claude/skills/"*/
fi
ls "$project_path/.claude/skills/" that skill directories were removed."skill_resolution": "global""resolution": "global"toolkit-version.json to confirm valid JSON and that skill_resolution is "global".git rm ā let user review and commitReport:
ā Migrated ~/Projects/app to global skill resolution
Removed: 30 skill directories
Backed up: 2 modified skills ā .claude/skills.bak/
Skills now resolve via: ~/.claude/skills/
6f: Legacy Local Reversion (Deprecated)
Do not offer or execute a "revert to local" flow in normal operation. If a user explicitly demands local copies, treat it as a one-off exception and warn that it diverges from toolkit global-only policy.
See PUBLIC_REPO_SYNC.md for detailed sync logic.
.claude/public-skills-manifest.jsoncp -r from toolkit, remove .DS_Store filestoolkit-version.json but removed from manifest)toolkit-version.json in public repo with new hashesgit -C "$path" add skills/ toolkit-version.jsonSYNC COMPLETE
=============
Global Skills (Conductor Autocomplete):
Symlinks created: 2
Symlinks removed: 1 (orphaned)
Symlinks repaired: 0
Already current: 28
Codex CLI Skill Pack:
Skills updated: 3
Skills deleted: 1 (orphaned)
Already current: 12
Target Projects:
Projects processed: 4
Synced: 2
Skipped: 1 (active)
Current: 1
Skills deleted: 1 (orphaned)
Public Skills Repo:
Skills synced: 3 (2 updated, 1 added)
Skills removed: 0
Already current: 6
Skipped: 0 (local modifications)
Committed: yes
Pushed: no (user declined)
Resolution Changes:
Migrated to global: 1 project (30 local dirs removed)
Modified backed up: 2 skills ā .claude/skills.bak/
Deleted Skills (removed from toolkit):
- multi-model-verify
All synced items are now at toolkit commit abc1234
If projects were migrated:
MIGRATION SUMMARY
āāāāāāāāāāāāāāāāā
Projects migrated to global resolution:
ā ~/Projects/app (30 skills)
ā ~/Projects/api (30 skills)
These projects now use ~/.claude/skills/ symlinks.
Local skill copies have been removed.
Note: Collaborators need ~/.claude/skills/ symlinks to access skills.
Run this from their toolkit clone: /update-target-projects ā option 2
| Situation | Action |
|---|---|
No toolkit-version.json files found in search paths |
Report "No toolkit-using projects found in {search paths}" and list the paths searched; suggest running /setup first |
toolkit_location in a project's toolkit-version.json points to a different toolkit |
Skip that project with a warning; do not sync skills from a mismatched toolkit |
cp -r or symlink creation fails during sync |
Report the specific failure, continue syncing remaining items, include failures in the summary report |
rm -rf fails during global migration (option 8) |
STOP migration for that project, report permission error, do not update toolkit-version.json to "global" |
gh or git commands fail during discovery |
Report the error, skip affected projects, continue with remaining projects |
| Public skills repo path missing or not a git repo | Report specific pre-flight failure, skip public repo sync, continue with other sync operations |
| Public skills repo has dirty working tree | Report "public repo has uncommitted changes", skip public repo sync |
Manifest skill name fails ^[a-z0-9-]+$ validation |
Abort public repo sync entirely (path traversal risk) |
| Skill has local modifications in public repo | Warn and prompt before overwriting ā never silently replace |
See EDGE_CASES.md for handling:
REMINDER: Toolkit-managed projects should use global resolution. Local skill copies are legacy migration debt: back up modified local skills, remove local shadow copies, and keep toolkit-version.json aligned to "skill_resolution": "global".