Update Project
Update an existing Claude Copilot project with the latest files. This command only works on projects that have already been set up.
Step 1: Verify This Is an Existing Project
ls .mcp.json 2>/dev/null && echo "PROJECT_EXISTS" || echo "NEW_PROJECT"
If NEW_PROJECT:
Stop and tell the user:
This project hasn't been set up yet.
No .mcp.json found - this project needs initial setup first.
To set up this project with Claude Copilot, use:
/setup-project
Then STOP. Do not continue.
If PROJECT_EXISTS: Continue to Step 2.
Step 2: Verify Machine Setup
ls ~/.claude/copilot/mcp-servers/copilot-memory/dist/index.js 2>/dev/null && echo "MEMORY_OK" || echo "MEMORY_MISSING"
ls ~/.claude/copilot/mcp-servers/skills-copilot/dist/index.js 2>/dev/null && echo "SKILLS_OK" || echo "SKILLS_MISSING"
which tc >/dev/null 2>&1 && echo "TC_CLI_OK" || echo "TC_CLI_MISSING"
If any MISSING:
Tell user:
Claude Copilot installation not found.
The MCP servers at ~/.claude/copilot/ are missing or not built.
Please verify your Claude Copilot installation:
cd ~/.claude/copilot
git pull
Then rebuild the MCP servers following the instructions in SETUP.md.
Then STOP.
Step 3: Check and Update MCP Server Configuration
Read both configurations:
cat .mcp.json
cat ~/.claude/copilot/templates/mcp.json
Identify missing servers:
Compare the mcpServers keys in project's .mcp.json with the template.
For each server in the template that is NOT in the project's .mcp.json:
- Note the server name
- Prepare to add it with variable expansion:
$HOME→ actual home directory path$PROJECT_PATH→ result ofpwd$PROJECT_NAME→ result ofbasename $(pwd)$COPILOT_PATH→$HOME/.claude/copilot
If missing servers found:
Tell the user:
New MCP servers available
The following servers will be added to your .mcp.json:
{{LIST_MISSING_SERVERS}}
This will preserve all existing server configurations and only add new ones.
Use AskUserQuestion:
Question: "Add these new servers to .mcp.json?"
- Header: "MCP Configuration Update"
- Options:
- "Yes, add new servers"
- "No, skip this step"
If user says "Yes, add new servers":
- Read the existing
.mcp.jsonas JSON - For each missing server from template:
- Expand all variables (
$HOME,$PROJECT_PATH,$PROJECT_NAME,$COPILOT_PATH) - Add the server entry to
mcpServersobject
- Expand all variables (
- Write the merged JSON back to
.mcp.jsonwith proper formatting (2-space indent) - Validate the JSON is well-formed
- Report success: "Added {{SERVER_NAMES}} to .mcp.json"
If user says "No, skip this step":
Continue to Step 4 without modifying .mcp.json.
If no missing servers:
Report: "All MCP servers already configured, no updates needed."
Continue to Step 4.
Step 4: Check for Broken Symlinks
CRITICAL: Regular ls passes for broken symlinks. Must check if target exists.
echo "=== Checking commands for broken symlinks ==="
BROKEN_FOUND=0
for f in .claude/commands/*.md 2>/dev/null; do
if [ -L "$f" ] && [ ! -e "$f" ]; then
echo "BROKEN_SYMLINK: $f"
BROKEN_FOUND=1
fi
done
echo "=== Checking agents for broken symlinks ==="
for f in .claude/agents/*.md 2>/dev/null; do
if [ -L "$f" ] && [ ! -e "$f" ]; then
echo "BROKEN_SYMLINK: $f"
BROKEN_FOUND=1
fi
done
if [ $BROKEN_FOUND -eq 0 ]; then
echo "No broken symlinks found"
fi
Note any broken symlinks found - they will be fixed in the update.
Step 5: Show Current State
echo "=== Current Commands ==="
ls -la .claude/commands/*.md 2>/dev/null | head -5
echo "=== Current Agents ==="
ls .claude/agents/*.md 2>/dev/null | wc -l
echo "agent files"
echo "=== Claude Copilot Version ==="
cd ~/.claude/copilot && git log --oneline -1
Step 6: Confirm Update
Tell the user:
Ready to update project
This will refresh:
.claude/commands/(7 project commands).claude/agents/*.md(all 20 agents: 13 framework + 7 native).claude/orchestrator/(if present - Python scripts and shell utilities)
This will ONLY update if needed:
.mcp.json(only to add new MCP servers, preserving all existing configuration)
This will NOT touch:
CLAUDE.md(your project instructions).claude/skills/(your project skills)- Existing MCP server configurations in
.mcp.json
Use AskUserQuestion:
Question: "Proceed with update?"
- Header: "Confirm"
- Options:
- "Yes, update now"
- "No, cancel"
If cancelled: Stop and tell user "Update cancelled."
Step 7: Update Commands
Remove old command files and copy fresh ones:
# Remove old project commands
rm -f .claude/commands/protocol.md 2>/dev/null
rm -f .claude/commands/continue.md 2>/dev/null
rm -f .claude/commands/pause.md 2>/dev/null
rm -f .claude/commands/map.md 2>/dev/null
rm -f .claude/commands/memory.md 2>/dev/null
rm -f .claude/commands/extensions.md 2>/dev/null
rm -f .claude/commands/orchestrate.md 2>/dev/null
# Copy fresh from source (all project-level commands)
cp ~/.claude/copilot/.claude/commands/protocol.md .claude/commands/
cp ~/.claude/copilot/.claude/commands/continue.md .claude/commands/
cp ~/.claude/copilot/.claude/commands/pause.md .claude/commands/
cp ~/.claude/copilot/.claude/commands/map.md .claude/commands/
cp ~/.claude/copilot/.claude/commands/memory.md .claude/commands/
cp ~/.claude/copilot/.claude/commands/extensions.md .claude/commands/
cp ~/.claude/copilot/.claude/commands/orchestrate.md .claude/commands/
echo "Commands updated (7 project commands)"
Step 8: Update Agents
Remove old agent files and copy fresh ones:
# Remove all old agents
rm -f .claude/agents/*.md 2>/dev/null
# Copy fresh from source
cp ~/.claude/copilot/.claude/agents/*.md .claude/agents/
echo "Agents updated"
Step 9: Update Orchestrator Files (if present)
Only update if orchestrator directory exists (project has used /orchestrate before):
if [ -d ".claude/orchestrator" ]; then
echo "=== Updating Orchestrator Files ==="
# Copy Python scripts (preserve symlinks or update files)
cp ~/.claude/copilot/templates/orchestration/task_copilot_client.py .claude/orchestrator/
cp ~/.claude/copilot/templates/orchestration/check_streams_data.py .claude/orchestrator/
cp ~/.claude/copilot/templates/orchestration/orchestrate.py .claude/orchestrator/
cp ~/.claude/copilot/templates/orchestration/monitor-workers.py .claude/orchestrator/
# Copy shell scripts
cp ~/.claude/copilot/templates/orchestration/check-streams .claude/orchestrator/
cp ~/.claude/copilot/templates/orchestration/watch-status .claude/orchestrator/
# Ensure scripts are executable
chmod +x .claude/orchestrator/check-streams
chmod +x .claude/orchestrator/watch-status
chmod +x .claude/orchestrator/orchestrate.py
echo "Orchestrator files updated"
ORCHESTRATOR_UPDATED=true
else
echo "No orchestrator directory found (skipping)"
ORCHESTRATOR_UPDATED=false
fi
Step 10: Verify Update
echo "=== Updated Commands ==="
ls -la .claude/commands/*.md
echo "=== Updated Agents ==="
ls .claude/agents/*.md | wc -l
echo "agent files"
echo "=== Verification ==="
# Check commands are regular files (not symlinks)
for f in .claude/commands/*.md; do
if [ -L "$f" ]; then
echo "WARNING: $f is still a symlink"
else
echo "OK: $f"
fi
done
echo ""
echo "=== Component Versions ==="
if [ -f ~/.claude/copilot/VERSION.json ]; then
node -p "
const v = require('$HOME/.claude/copilot/VERSION.json');
console.log('Framework: v' + v.framework);
console.log('Agents: v' + v.components.agents.version);
Object.entries(v.components['mcp-servers']).forEach(([k,s]) =>
console.log(k + ': v' + s.version)
);
"
fi
Step 11: Report Success
# Get Claude Copilot version
if [ -f ~/.claude/copilot/package.json ]; then
COPILOT_VERSION=$(node -p "require('$HOME/.claude/copilot/package.json').version" 2>/dev/null || echo "unknown")
else
COPILOT_VERSION="unknown"
fi
# Read version summary if available
if [ -f ~/.claude/copilot/CHANGELOG-SUMMARY.json ] && [ "$COPILOT_VERSION" != "unknown" ]; then
# Extract summary for the version using node
SUMMARY=$(node -p "
try {
const data = require('$HOME/.claude/copilot/CHANGELOG-SUMMARY.json');
const version = data.versions['$COPILOT_VERSION'];
if (version) {
version.summary || 'See CHANGELOG.md for details';
} else {
'Version details not found in summary';
}
} catch (e) {
'See CHANGELOG.md for details';
}
" 2>/dev/null || echo "See CHANGELOG.md for details")
else
# Fallback to git log
SUMMARY=$(cd ~/.claude/copilot && git log --oneline -1 2>/dev/null || echo "Latest version")
fi
Tell user:
Project Updated!
Refreshed:
.claude/commands/(7 project commands: protocol, continue, pause, map, memory, extensions, orchestrate).claude/agents/(20 agents: 13 framework + 7 native) {{IF_ORCHESTRATOR_UPDATED}}.claude/orchestrator/(Python scripts and shell utilities) {{END_IF}}
MCP Configuration: {{IF_SERVERS_ADDED}}
.mcp.jsonupdated: Added {{SERVER_NAMES}} {{ELSE}}.mcp.jsonunchanged (all servers already configured) {{END_IF}}
Unchanged:
CLAUDE.md.claude/skills/- Existing MCP server configurations {{IF_NO_ORCHESTRATOR}}
.claude/orchestrator/not present (run/orchestrate setupto initialize) {{END_IF}}
Claude Copilot Version: $COPILOT_VERSION
What's New: $SUMMARY
Full details: ~/.claude/copilot/CHANGELOG.md
Your project now has the latest Claude Copilot commands and agents.
Troubleshooting
Permissions Error
chmod -R 755 .claude
Commands Still Not Working
Restart Claude Code to reload the files.
Want to Reset Everything
If you need a complete reset (including .mcp.json and CLAUDE.md):
- Remove the existing setup:
rm -rf .claude .mcp.json CLAUDE.md - Run
/setup-projectfor fresh initialization