This guide shows how to implement the two-tier context system (workspace + projects) in a new multi-root workspace.
The context system consists of:
- Machine-optimized context maps - Auto-generated, compressed memory files
- SessionStart hooks - Automatically regenerate context on every session
- Two-tier structure - Workspace-wide + project-specific contexts
# In workspace root
mkdir -p .claude
# For each project
mkdir -p PROJECT_NAME/.claudeCreate .claude/generate-context-map.sh:
#!/bin/bash
OUTPUT_FILE=".claude/context-map.md"
cat > $OUTPUT_FILE << 'HEADER'
# WORKSPACE_MEMORY v1.0
🧠 Multi-root workspace context. Machine-optimized format.
Each project is a separate Git repository.
HEADER
echo "" >> $OUTPUT_FILE
echo "## [NOW]" >> $OUTPUT_FILE
echo "DATE:$(date '+%Y-%m-%d.%A')" >> $OUTPUT_FILE
echo "" >> $OUTPUT_FILE
# List projects
echo "## [PROJECTS]" >> $OUTPUT_FILE
cat << 'PROJECTS' >> $OUTPUT_FILE
WORKSPACE: Multi-root (each project = separate git repo)
project1/: Description (separate repo)
project2/: Description (separate repo)
PROJECTS
echo "" >> $OUTPUT_FILE
# Add workspace-wide patterns
echo "## [PATTERNS]" >> $OUTPUT_FILE
cat << 'PATTERNS' >> $OUTPUT_FILE
# Your common patterns across projects
# Example: python.projects: src-layout, pyproject.toml, pip install -e .
PATTERNS
echo "" >> $OUTPUT_FILE
# Add solved problems
echo "## [SOLVED_PROBLEMS]" >> $OUTPUT_FILE
cat << 'SOLVED' >> $OUTPUT_FILE
# Track solutions to prevent re-suggesting failed approaches
# Example: auth.approach(2025-01-15): JWT failed (size) → sessions instead
SOLVED
echo "" >> $OUTPUT_FILE
# Add anti-patterns
echo "## [ANTI_PATTERNS]" >> $OUTPUT_FILE
cat << 'ANTI' >> $OUTPUT_FILE
NEVER.force_push: Without explicit user confirmation
NEVER.commit_autogen: Add .claude/ to .gitignore
NEVER.create_docs: Unless explicitly requested by user
ANTI
echo "" >> $OUTPUT_FILE
# Git status (if applicable)
if git rev-parse --git-dir > /dev/null 2>&1; then
echo "## [GIT_STATUS]" >> $OUTPUT_FILE
echo "BRANCH:$(git branch --show-current 2>/dev/null)" >> $OUTPUT_FILE
AHEAD=$(git rev-list --count @{u}..HEAD 2>/dev/null || echo 0)
BEHIND=$(git rev-list --count HEAD..@{u} 2>/dev/null || echo 0)
echo "AHEAD:$AHEAD | BEHIND:$BEHIND" >> $OUTPUT_FILE
echo "" >> $OUTPUT_FILE
fi
echo "## [META]" >> $OUTPUT_FILE
echo "GENERATED:$(date '+%Y-%m-%d@%H:%M:%S')" >> $OUTPUT_FILE
echo "WORKSPACE:Multi-root workspace (each project = separate git repository)" >> $OUTPUT_FILE
echo "✓ Context map generated at $OUTPUT_FILE"Make executable:
chmod +x .claude/generate-context-map.shCreate PROJECT/.claude/generate-context-map.sh for each project:
#!/bin/bash
OUTPUT_FILE=".claude/context-map.md"
cat > $OUTPUT_FILE << 'HEADER'
# PROJECT_MEMORY v1.0
🧠 Project context. Machine-optimized format.
HEADER
echo "" >> $OUTPUT_FILE
echo "## [NOW]" >> $OUTPUT_FILE
echo "DATE:$(date '+%Y-%m-%d.%A') | BRANCH:$(git branch --show-current 2>/dev/null || echo 'no-git')" >> $OUTPUT_FILE
echo "" >> $OUTPUT_FILE
# Project architecture
echo "## [ARCHITECTURE]" >> $OUTPUT_FILE
cat << 'ARCH' >> $OUTPUT_FILE
type: Project type (Python CLI, Chrome Extension, Web App, etc)
structure: Key directories and layout
dependencies: Major dependencies
ARCH
echo "" >> $OUTPUT_FILE
# Commands
echo "## [COMMANDS]" >> $OUTPUT_FILE
cat << 'CMDS' >> $OUTPUT_FILE
build: Command to build the project
test: Command to run tests
install: How to install dependencies
dev: How to run in development mode
CMDS
echo "" >> $OUTPUT_FILE
# Solved problems specific to this project
echo "## [SOLVED]" >> $OUTPUT_FILE
cat << 'SOLVED' >> $OUTPUT_FILE
# Project-specific solutions
SOLVED
echo "" >> $OUTPUT_FILE
# Code paths
echo "## [PATHS]" >> $OUTPUT_FILE
cat << 'PATHS' >> $OUTPUT_FILE
# Important code flow paths
# Example: auth: login.js:45→validate→token→response
PATHS
echo "" >> $OUTPUT_FILE
# Anti-patterns
echo "## [NEVER]" >> $OUTPUT_FILE
cat << 'NEVER' >> $OUTPUT_FILE
# Project-specific anti-patterns
NEVER
echo "" >> $OUTPUT_FILE
# Recent changes
echo "## [RECENT]" >> $OUTPUT_FILE
git log --since="7 days ago" --pretty=format:"%ad %s" --date=format:'%m/%d' 2>/dev/null | head -8 >> $OUTPUT_FILE
echo "" >> $OUTPUT_FILE
# Git status
if git rev-parse --git-dir > /dev/null 2>&1; then
echo "## [GIT]" >> $OUTPUT_FILE
echo "BRANCH:$(git branch --show-current 2>/dev/null)" >> $OUTPUT_FILE
AHEAD=$(git rev-list --count @{u}..HEAD 2>/dev/null || echo 0)
BEHIND=$(git rev-list --count HEAD..@{u} 2>/dev/null || echo 0)
echo "AHEAD:$AHEAD BEHIND:$BEHIND" >> $OUTPUT_FILE
DIRTY=$(git status --porcelain 2>/dev/null | wc -l | tr -d ' ')
[ "$DIRTY" -gt 0 ] && echo "UNCOMMITTED:$DIRTY" >> $OUTPUT_FILE
echo "" >> $OUTPUT_FILE
fi
echo "## [META]" >> $OUTPUT_FILE
echo "GENERATED:$(date '+%Y-%m-%d@%H:%M:%S')" >> $OUTPUT_FILE
echo "PROJECT:Your project name and description" >> $OUTPUT_FILE
echo "✓ Project context map → $OUTPUT_FILE"Make executable:
chmod +x PROJECT/.claude/generate-context-map.shCreate .claude/hooks.json:
{
"sessionStart": [
{
"type": "command",
"command": "bash .claude/generate-context-map.sh",
"description": "Generate workspace context map",
"timeout": 5000
},
{
"type": "command",
"command": "bash project1/.claude/generate-context-map.sh",
"description": "Generate project1 context map",
"timeout": 5000
},
{
"type": "command",
"command": "bash project2/.claude/generate-context-map.sh",
"description": "Generate project2 context map",
"timeout": 5000
}
]
}Add to workspace .gitignore:
# Claude AI context files (auto-generated)
.claude/
*/.claude/
Add to each project's .gitignore:
# Claude AI context files (auto-generated)
.claude/
Workspace .claude/CLAUDE.md:
# Multi-Root Workspace - Claude Context
🧠 **CONTEXT RESET? START HERE:**
1. **Read workspace context first:** [.claude/context-map.md](./.claude/context-map.md)
2. **Then read project-specific context** when working on a project
## Context File Organization
**Two-tier structure:**
- **Workspace `.claude/`** - Workspace-wide instructions, general patterns
- **Project `.claude/`** - Project-specific architecture, commands, patterns
## Workspace Structure
This is a **multi-root workspace** containing multiple independent repositories:
1. **Project 1** - Description (separate repo)
2. **Project 2** - Description (separate repo)
## General Patterns (All Projects)
[Add your common patterns here]
## Anti-Patterns (Never Do These)
- **NEVER** commit auto-generated files (.claude/context-map.md)
- **NEVER** use unnecessary preamble - just do it
- **NEVER** force push without explicit user confirmationProject .claude/CLAUDE.md:
# Project Name
🧠 **PROJECT CONTEXT:** [.claude/context-map.md](./.claude/context-map.md) - Read this first.
## Project Overview
[Brief description of what this project does]
## Quick Start
```bash
# Commands to get started[Key architectural decisions and structure]
[Frequently used commands and workflows]
### 7. Test the System
```bash
# Generate all context maps manually
bash .claude/generate-context-map.sh
bash project1/.claude/generate-context-map.sh
bash project2/.claude/generate-context-map.sh
# Verify files were created
ls -la .claude/context-map.md
ls -la project1/.claude/context-map.md
# Verify auto-generation on session start works
# (Close and reopen your Claude Code session)
Common sections to include in your context maps:
- [NOW] - Current date, branch (for projects)
- [PROJECTS] - List of projects in workspace
- [ARCHITECTURE] - System architecture, key components
- [COMMANDS] - Build, test, install commands
- [PATTERNS] - Common patterns and conventions
- [SOLVED_PROBLEMS] - What we tried and what worked
- [ANTI_PATTERNS] - What never to do
- [PATHS] - Important code paths (file:line→function→result)
- [FILES] - Key files with hot zones (line ranges)
- [RECENT] - Recent changes from git log
- [GIT] - Branch, ahead/behind status
- [HOT_FILES] - Frequently modified files
- [META] - Generation timestamp, purpose
Once set up, you get:
- Instant context recovery after session resets
- ~80% token reduction vs human-readable docs
- Automatic updates on every session start
- No repeating yourself - "See [SOLVED_PROBLEMS]"
- Fast navigation - file:line references
- Git awareness - recent changes, hot files
Customize the generators by:
- Adding project-specific sections (e.g., [PAYMENT], [MODELS])
- Including environment status checks
- Adding TODO integration
- Tracking feature flags
- Including test results
- Adding migration status
See existing generators in this workspace for examples.