A Claude Code skill that establishes a structured institutional knowledge system for your projects. Track bugs with solutions, architectural decisions (ADRs), key project facts, and work history in a consistent, maintainable format.
# Install via skilz (recommended)
skilz install SpillwaveSolutions_project-memory/project-memory
# Then use in any project
cd your-project
# In Claude Code, type: /project-memoryWhen invoked in a project, this skill:
-
Creates a memory infrastructure in
docs/project_notes/with four files:bugs.md- Bug log with solutions and prevention notesdecisions.md- Architectural Decision Records (ADRs)key_facts.md- Project configuration, credentials, ports, URLsissues.md- Work log with ticket IDs and descriptions
-
Configures CLAUDE.md and AGENTS.md to make Claude Code (and other AI tools) memory-aware:
- Check memory files before proposing changes
- Search for known solutions to familiar bugs
- Document new decisions, bugs, and completed work
- Maintain consistency across coding sessions
-
Provides templates and examples for maintaining institutional knowledge in a way that looks like standard engineering documentation (not AI artifacts).
There are four installation options depending on your needs.
The recommended way to install this skill across different AI coding agents is using the skilz universal installer. This skill supports the Agent Skill Standard, which means it works with 14+ coding agents including Claude Code, OpenAI Codex, Cursor, and Gemini.
pip install skilzYou can use either -g or --git with HTTPS or SSH URLs:
# HTTPS URL
skilz install -g https://github.com/SpillwaveSolutions/project-memory
# SSH URL
skilz install --git git@github.com:SpillwaveSolutions/project-memory.gitInstall to user home (available in all projects):
skilz install -g https://github.com/SpillwaveSolutions/project-memoryInstall to current project only:
skilz install -g https://github.com/SpillwaveSolutions/project-memory --projectInstall for OpenCode:
skilz install -g https://github.com/SpillwaveSolutions/project-memory --agent opencodeProject-level install:
skilz install -g https://github.com/SpillwaveSolutions/project-memory --project --agent opencodeProject-level install for Gemini:
skilz install -g https://github.com/SpillwaveSolutions/project-memory --agent geminiInstall for OpenAI Codex:
skilz install -g https://github.com/SpillwaveSolutions/project-memory --agent codexProject-level install:
skilz install -g https://github.com/SpillwaveSolutions/project-memory --project --agent codex# Claude to user home dir ~/.claude/skills
skilz install SpillwaveSolutions_project-memory/project-memory
# Claude skill in project folder ./claude/skills
skilz install SpillwaveSolutions_project-memory/project-memory --project
# OpenCode install to user home dir ~/.config/opencode/skills
skilz install SpillwaveSolutions_project-memory/project-memory --agent opencode
# OpenCode project level
skilz install SpillwaveSolutions_project-memory/project-memory --agent opencode --project
# OpenAI Codex install to user home dir ~/.codex/skills
skilz install SpillwaveSolutions_project-memory/project-memory --agent codex
# OpenAI Codex project level ./.codex/skills
skilz install SpillwaveSolutions_project-memory/project-memory --agent codex --project
# Gemini CLI (project level) -- only works with project level
skilz install SpillwaveSolutions_project-memory/project-memory --agent geminiSee skill Listing for installation details for 14+ different coding agents.
Skilz supports 14+ coding agents including Windsurf, Qwen Code, Aidr, and more. For the full list of supported platforms, visit:
SkillzWave - Largest Agentic Marketplace for AI Agent Skills | SpillWave - Leaders in AI Agent Development
Install once in your Claude Code home directory to make the skill available across all projects:
# Create the skills directory if it doesn't exist
mkdir -p ~/.claude/skills
# Clone or copy the skill to your skills directory
cp -r project-memory ~/.claude/skills/
# Verify installation
ls ~/.claude/skills/project-memoryWhen to use: You want this skill available for all your projects without reinstalling.
Install in a specific project's .claude/skills/ directory:
# Navigate to your project
cd /path/to/your/project
# Create local skills directory
mkdir -p .claude/skills
# Clone or copy the skill
cp -r /path/to/project-memory .claude/skills/
# Verify installation
ls .claude/skills/project-memoryWhen to use: You only want this skill available for a specific project.
Install above a workspace directory to share across multiple related projects:
# Navigate to your workspace directory (parent of multiple projects)
cd ~/workspace
# Create shared skills directory
mkdir -p .claude/skills
# Clone or copy the skill
cp -r /path/to/project-memory .claude/skills/
# Verify installation
ls .claude/skills/project-memoryWhen to use: You have multiple projects in a workspace and want to share the skill without global installation.
Example structure:
~/workspace/
├── .claude/
│ └── skills/
│ └── project-memory/ # Shared across all projects below
├── project-a/
├── project-b/
└── project-c/
- Navigate to your project directory
- Invoke the skill in Claude Code:
/project-memory - The skill will:
- Create
docs/project_notes/directory - Initialize the four memory files with templates
- Update (or create)
CLAUDE.mdwith memory protocols - Optionally update
AGENTS.mdif it exists
- Create
Once set up, Claude Code will automatically:
- Check memory files before proposing architectural changes
- Search bugs.md when you encounter errors
- Reference key_facts.md for project configuration
You can also explicitly request updates:
Add this CORS fix to our bug log
Document the decision to use FastAPI in decisions.md
Update key_facts.md with the new database connection string
Log this completed ticket in issues.md
your-project/
├── docs/
│ └── project_notes/
│ ├── bugs.md # Bug log with solutions
│ ├── decisions.md # Architectural Decision Records
│ ├── key_facts.md # Project configuration
│ └── issues.md # Work log
├── CLAUDE.md # Updated with memory protocols
└── AGENTS.md # Updated with memory protocols (if exists)
### 2025-01-15 - Docker Architecture Mismatch
- **Issue**: Container failing to start with "exec format error"
- **Root Cause**: Built on ARM64 Mac but deploying to AMD64 Cloud Run
- **Solution**: Added `--platform linux/amd64` to docker build
- **Prevention**: Always specify platform in Dockerfile### ADR-001: Use Workload Identity Federation (2025-01-10)
**Context:**
- Need secure authentication from GitHub Actions to GCP
**Decision:**
- Use Workload Identity Federation instead of service account keys
**Alternatives Considered:**
- Service account JSON keys → Rejected: security risk
**Consequences:**
- ✅ More secure (no long-lived credentials)
- ❌ Slightly more complex initial setupkey_facts.md. Only store non-sensitive reference information like hostnames, ports, client names, project IDs, and account names. Store secrets in .env (excluded via .gitignore), password managers, or secrets management systems.
### Database Configuration
**AlloyDB Cluster:**
- Cluster Name: `prod-cluster`
- Private IP: `10.0.0.5`
- Port: `5432`
- Database Name: `contacts`
**Connection:**
- Use AlloyDB Auth Proxy for local development
- Proxy command: `./alloydb-auth-proxy "projects/..."`
- Credentials: Stored in `.env` file (not in git)### 2025-01-15 - PROJ-123: Implement Contact API
- **Status**: Completed
- **Description**: Created FastAPI endpoints for contact CRUD
- **URL**: https://jira.company.com/browse/PROJ-123
- **Notes**: Added unit tests, coverage at 85%After installation, verify the skill is available:
- Open Claude Code in any project
- Type
/to see available skills - You should see
project-memoryin the list
Or check manually:
# For global installation
ls ~/.claude/skills/project-memory/SKILL.md
# For project-specific installation
ls .claude/skills/project-memory/SKILL.md
# For workspace installation
ls ../.claude/skills/project-memory/SKILL.md # From inside a projectThe key_facts.md file is designed to store non-sensitive project reference information only. This file is typically committed to version control and should NEVER contain:
❌ NEVER store in key_facts.md or any git-tracked file:
- Passwords or passphrases
- API keys or authentication tokens
- Service account JSON keys or credentials
- Database passwords
- OAuth client secrets
- Private keys or certificates
- Session tokens
- Any secret values from environment variables
✅ SAFE to store in key_facts.md:
- Database hostnames, ports, and cluster names
- Client names and project identifiers
- JIRA project keys and Confluence space names
- AWS account names and profile names (e.g., "dev", "staging", "prod")
- API endpoint URLs (public URLs only)
- Service account email addresses (not the keys!)
- GCP project IDs and region names
- Docker registry names
- Environment names and deployment targets
✅ WHERE to store sensitive credentials:
.envfiles - Excluded via.gitignore, used for local development- Password managers - 1Password, LastPass, Bitwarden, etc.
- Secrets managers - AWS Secrets Manager, GCP Secret Manager, HashiCorp Vault, Azure Key Vault
- CI/CD environment variables - GitHub Secrets, GitLab CI/CD Variables, etc.
- Platform credential stores - Kubernetes Secrets, Cloud Run Secret Manager integration
✅ VERIFICATION steps before committing:
- Run
git statusto see what will be committed - Verify
.env,credentials.json, and other sensitive files are in.gitignore - Never use
git add .blindly - review each file being staged - Use
git diff --cachedto review staged changes before committing - Consider using tools like
git-secretsorgitleaksto prevent credential leaks
Important: Even in private repositories, never commit clear-text passwords or authentication keys. Private repos can become public, be forked, or accessed by unauthorized users.
Once set up, Claude Code will:
- ✅ Check
decisions.mdbefore proposing architectural changes - ✅ Search
bugs.mdfor known solutions to errors - ✅ Reference
key_facts.mdfor project configuration - ✅ Log completed work in
issues.md - ✅ Document new bugs, decisions, and facts as they arise
All memory files follow these principles:
- Bullet lists over tables (simpler to edit)
- Concise entries (1-3 lines for descriptions)
- Always dated (YYYY-MM-DD format)
- Include URLs (for tickets, docs, monitoring)
- Manual cleanup (periodically remove old entries)
The memory system works across different AI coding tools:
- Claude Code (via CLAUDE.md)
- Cursor (via .cursor/rules or CLAUDE.md)
- GitHub Copilot (via AGENTS.md or .github/copilot-instructions.md)
- Other tools that read project configuration files
Without project memory:
- Repeat the same bugs/solutions across sessions
- Propose architectures that conflict with past decisions
- Ask the user repeatedly for database credentials, API keys, ports
- Lose context when switching between projects or AI tools
With project memory:
- Remember and apply known bug solutions instantly
- Maintain architectural consistency across sessions
- Reference documented facts instead of assumptions
- Preserve institutional knowledge across team members and tools
The Scenario:
- Oct 20 - Claude Code encounters Pulumi state drift error during deployment
- Investigation - 45 minutes debugging, trying various solutions
- Solution Found -
pulumi refresh --yesresolves the state inconsistency - Documentation - Logged as BUG-017 and BUG-018 in bugs.md, decision documented in ADR-016
- Oct 22 - Same state drift error occurs during a new deployment
Without Project Memory:
- Claude Code debugs from scratch (again)
- 30-60 minutes of investigation
- Risk of trying wrong solutions first
- Possible production delay
- User frustration: "Didn't we solve this already?"
With Project Memory:
Claude Code: Searching bugs.md for "state drift"...
Found: BUG-018 - Pulumi State Drift Error
Known solution: pulumi refresh --yes
Applying fix... Done in 2 minutes.
Reference: See ADR-016 for why this works.
Result:
- ✅ Instant recognition: "This is BUG-018"
- ✅ Known solution applied immediately
- ✅ 5 minutes instead of 45 minutes
- ✅ References explain why this works (ADR-016)
Knowledge Compound Interest: Every bug solved and documented makes future work exponentially faster.
The Scenario:
- Week 1 - Team evaluates charting libraries for scatter plots
- Decision - Selected D3.js for all visualizations (lightweight, flexible, already in dependencies)
- Documentation - Logged as ADR-012 in decisions.md with rationale
- Week 4 - New feature requires a bar chart visualization
Without Project Memory:
User: "Add a bar chart to the dashboard"
Claude Code: "I'll add Chart.js for the bar chart visualization."
[Adds Chart.js to package.json - now we have D3.js AND Chart.js]
Result: Bundle size +85KB, inconsistent chart styling, duplicate dependencies
With Project Memory:
User: "Add a bar chart to the dashboard"
Claude Code: Checking decisions.md for visualization decisions...
Found: ADR-012 - Use D3.js for all charts
Claude Code: "I'll implement the bar chart using D3.js to maintain consistency with ADR-012."
[Uses existing D3.js dependency]
Result: No new dependencies, consistent styling, smaller bundle
Result:
- ✅ Maintains architectural consistency
- ✅ Avoids dependency bloat
- ✅ Ensures consistent user experience
- ✅ Faster development (reuse existing patterns)
Key Insight: Remembering past decisions prevents architectural drift and keeps the codebase cohesive.
The Reality of Long-Running Projects:
Many developers (and AI code assistants) encounter the same bugs months apart and completely forget the solution:
Month 1:
Error: CORS policy blocked request from localhost:3000
[2 hours of debugging]
Solution: Add proxy configuration to package.json
Month 6:
Error: CORS policy blocked request from localhost:3000
Developer: "This looks familiar... how did we fix this?"
[Searches old commits, checks Stack Overflow again]
[1 hour to re-discover the proxy config solution]
With Project Memory:
Error: CORS policy blocked request from localhost:3000
Claude Code: Searching bugs.md for "CORS"...
Found: BUG-003 - CORS Blocked in Local Development
Solution: proxy config in package.json
Applied in 5 minutes.
The Code Agent Memory Problem:
AI code assistants don't remember previous sessions. Without documentation:
- Each new chat session starts from zero knowledge
- Every bug feels like the first time
- Solutions are "rediscovered" repeatedly
- No learning accumulates over time
With project memory, the code agent becomes progressively smarter:
- First encounter: 2 hours to solve → documented in bugs.md
- Second encounter: 5 minutes (reads bugs.md)
- Third encounter: 2 minutes (pattern now familiar)
- Fourth encounter: Preventative advice (suggests avoiding the issue)
This is knowledge compound interest - your project gets easier to maintain over time, not harder.
project-memory/
├── SKILL.md # Main skill instructions for Claude
├── CLAUDE.md # This repository's Claude guidance
├── README.md # This file
└── references/ # Templates for memory files
├── bugs_template.md
├── decisions_template.md
├── key_facts_template.md
└── issues_template.md
-
Looks like standard engineering docs - Using
docs/project_notes/instead ofmemory/makes it appear as normal engineering organization, not AI-specific tooling. -
Prefer simplicity - Bullet lists over tables, concise over exhaustive, manual cleanup over automation.
-
Document what matters - Focus on recurring bugs, important decisions, and frequently-needed facts.
-
Enable collaboration - Works across AI tools, readable by humans, version-controllable with git.
cd ~/projects/my-new-app
claude codeIn Claude Code:
/project-memory
Claude will create the memory infrastructure and configure CLAUDE.md.
I just fixed a bug where the database connection pool was exhausted.
Add it to bugs.md with the solution.
I'm thinking about using SQLAlchemy for migrations.
Check if we already have a decision about this.
Claude will search decisions.md and apply existing choices.
Update key_facts.md with the new staging environment URL:
https://staging-api.company.com
Memory files are manually maintained:
- bugs.md - Remove very old entries (6+ months) that are no longer relevant
- decisions.md - Keep all decisions (they're lightweight and provide historical context)
- key_facts.md - Update when project configuration changes
- issues.md - Archive completed work (3+ months old)
This skill complements other Claude Code skills:
- requirements-documenter - Requirements inform ADRs in decisions.md
- root-cause-debugger - Bug diagnosis results documented in bugs.md
- code-quality-reviewer - Quality standards documented in decisions.md
- docs-sync-editor - Code changes trigger updates to key_facts.md
Check installation location:
# Global installation
ls ~/.claude/skills/project-memory/SKILL.md
# Project-specific installation
ls .claude/skills/project-memory/SKILL.mdEnsure SKILL.md exists:
The skill must have a SKILL.md file with proper frontmatter:
---
name: project-memory
description: Set up and maintain a structured project memory system...
---Verify you're in a project directory:
The skill creates files in the current working directory's docs/project_notes/ folder.
Check permissions: Ensure you have write permissions in the project directory.
Verify CLAUDE.md was updated:
grep "Project Memory System" CLAUDE.mdThe "Project Memory System" section should be present with complete protocols.
To improve this skill:
- Update templates in
references/directory - Enhance
SKILL.mdwith new capabilities - Update
CLAUDE.mdwith workflow changes - Test in a sample project
This skill is part of the Claude Code skills ecosystem and follows standard usage guidelines for Claude Code extensions.
For issues or questions:
- Check the troubleshooting section above
- Review
SKILL.mdfor detailed skill instructions - Review
CLAUDE.mdfor repository-specific guidance - Consult Claude Code documentation at https://docs.claude.com/en/docs/claude-code