An SDK and CLI for managing mono repos with multiple Claude Code projects. Supports shared skills, agents, hooks, and rules across projects without duplication.
CLDPM enables sharing components across multiple Claude Code projects using a hybrid linking strategy. References are stored in config files, and symlinks are generated locally for fast access.
graph TB
subgraph "Mono Repo"
CLDPM[cldpm.json]
subgraph "Shared Components"
S1[skills/logging]
S2[skills/code-review]
A1[agents/debugger]
H1[hooks/pre-commit]
end
subgraph "Projects"
subgraph "web-app"
P1[project.json]
C1[.claude/skills/logging]
C2[.claude/skills/code-review]
L1[.claude/skills/local-skill]
end
subgraph "api-server"
P2[project.json]
C3[.claude/skills/logging]
C4[.claude/agents/debugger]
end
end
end
S1 -.->|symlink| C1
S1 -.->|symlink| C3
S2 -.->|symlink| C2
A1 -.->|symlink| C4
style L1 fill:#6941c6
pip install cldpmOr with pipx for isolated installation:
pipx install cldpm# Initialize a new mono repo
cldpm init my-monorepo
cd my-monorepo
# Create a project
cldpm create project web-app
# Create shared components
cldpm create skill logging -d "Logging utilities"
cldpm create agent code-reviewer -d "Code review assistant"
# Add components to project
cldpm add skill:logging --to web-app
cldpm add agent:code-reviewer --to web-app
# View project with resolved dependencies
cldpm get web-app
# After git clone, restore symlinks
cldpm sync --allflowchart LR
subgraph "CLDPM CLI"
INIT[init]
CREATE[create]
ADD[add]
REMOVE[remove]
GET[get]
SYNC[sync]
LINK[link]
end
subgraph "Core SDK"
CONFIG[Config Manager]
RESOLVER[Dependency Resolver]
LINKER[Symlink Manager]
end
subgraph "Storage"
CLDPMJSON[(cldpm.json)]
PROJSON[(project.json)]
SHARED[(shared/)]
CLAUDE[(.claude/)]
end
INIT --> CONFIG
CREATE --> CONFIG
ADD --> LINKER
REMOVE --> LINKER
GET --> RESOLVER
SYNC --> LINKER
LINK --> CONFIG
CONFIG --> CLDPMJSON
CONFIG --> PROJSON
RESOLVER --> SHARED
LINKER --> CLAUDE
CLDPM supports two types of components:
| Type | Location | Git Status | Use Case |
|---|---|---|---|
| Shared | shared/{type}/{name} |
Committed, symlinked to projects | Reusable across multiple projects |
| Local | projects/{project}/.claude/{type}/{name} |
Committed directly | Project-specific, not shared |
graph LR
subgraph "Shared"
SC[shared/skills/logging]
end
subgraph "Project A"
PA[.claude/skills/logging] -->|symlink| SC
LA[.claude/skills/local-a]
end
subgraph "Project B"
PB[.claude/skills/logging] -->|symlink| SC
LB[.claude/skills/local-b]
end
style LA fill:#6941c6
style LB fill:#6941c6
Shared components can depend on other shared components:
graph TD
A[advanced-review] --> B[code-review]
A --> C[security-check]
B --> D[base-utils]
C --> D
# Create component with dependencies
cldpm create skill advanced-review --skills code-review,security-check
# Link dependencies to existing component
cldpm link skill:base-utils --to skill:code-review
# Remove dependencies
cldpm unlink skill:base-utils --from skill:code-reviewmy-monorepo/
├── cldpm.json # Root configuration
├── CLAUDE.md # Root instructions (Claude Code)
├── .cursor/rules/cldpm.mdc # Cursor IDE rules
├── .clinerules # Cline rules
├── .windsurfrules # Windsurf rules
├── .github/copilot-instructions.md # GitHub Copilot instructions
├── shared/ # Shared components (committed)
│ ├── skills/
│ │ └── logging/
│ │ ├── SKILL.md
│ │ └── skill.json
│ ├── agents/
│ ├── hooks/
│ └── rules/
└── projects/
└── web-app/
├── project.json # Dependencies defined here
├── CLAUDE.md
└── .claude/
├── skills/
│ ├── .gitignore # Ignores symlinks only
│ ├── logging/ -> symlink (ignored)
│ └── local-skill/ # Committed
├── agents/
├── hooks/
└── rules/
CLDPM automatically generates configuration files for popular AI coding assistants when you run cldpm init. These files help AI tools understand CLDPM commands and mono repo structure.
| File | AI Tool | Description |
|---|---|---|
CLAUDE.md |
Claude Code | Project instructions and CLDPM commands |
.cursor/rules/cldpm.mdc |
Cursor IDE | Rules with glob patterns for CLDPM context |
.clinerules |
Cline | CLI commands and project structure |
.windsurfrules |
Windsurf | Commands and directory structure |
.github/copilot-instructions.md |
GitHub Copilot | CLI reference and file structure |
All generated content is wrapped with markers for easy updates:
<!-- CLDPM-SECTION-START -->
... CLDPM content ...
<!-- CLDPM-SECTION-END -->When running cldpm init --existing on a repo that already has these files, CLDPM will:
- Update existing sections if markers are present
- Append new sections if no CLDPM content exists
- Skip files that already contain CLDPM content without markers
| Command | Description |
|---|---|
cldpm init |
Initialize a new mono repo |
cldpm create project |
Create a new project |
cldpm create skill/agent/hook/rule |
Create shared components |
cldpm add |
Add a shared component to a project |
cldpm remove |
Remove a shared component from a project |
cldpm link |
Link dependencies between shared components |
cldpm unlink |
Remove dependencies between shared components |
cldpm get |
Get project info, download with dependencies (local/remote) |
cldpm sync |
Regenerate symlinks for shared components |
# View remote project info
cldpm get my-project --remote owner/repo
# Download remote project with all dependencies (uses sparse checkout)
cldpm get my-project -r owner/repo --download --output ./local-copy
# Supported URL formats
cldpm get my-project -r owner/repo # GitHub shorthand
cldpm get my-project -r https://github.com/owner/repo # Full URL
cldpm get my-project -r https://github.com/owner/repo/tree/main # With branch in URL
# Use -b flag when branch name contains slashes
cldpm get my-project -r owner/repo -b feature/my-feature -dNote: Remote downloads use Git sparse checkout to download only the required files, significantly reducing bandwidth for large repositories.
| Document | Description |
|---|---|
| Python SDK | Python SDK and CLI |
| TypeScript SDK | TypeScript/Node.js SDK and CLI |
| Full Documentation | Complete Mintlify documentation |
pip install cldpmfrom cldpm.core.config import load_cldpm_config, list_projects
from cldpm.core.resolver import resolve_project, list_shared_components
# Load configuration
config = load_cldpm_config("/path/to/monorepo")
# List all projects
projects = list_projects("/path/to/monorepo")
# Resolve a project with all dependencies
project = resolve_project("my-project", "/path/to/monorepo")npm install cldpmimport {
loadCldpmConfig,
listProjects,
resolveProject,
listSharedComponents,
} from "cldpm";
// Load configuration
const config = await loadCldpmConfig("/path/to/monorepo");
// List all projects
const projects = await listProjects("/path/to/monorepo");
// Resolve a project with all dependencies
const project = await resolveProject("my-project", "/path/to/monorepo");See SDK Reference for complete API documentation.
sequenceDiagram
participant Dev as Developer
participant CLDPM as CLDPM CLI
participant FS as File System
participant Git as Git
Dev->>CLDPM: cldpm add skill:logging --to web-app
CLDPM->>FS: Update project.json
CLDPM->>FS: Create symlink
CLDPM->>FS: Update .gitignore
Dev->>Git: git commit
Git->>FS: Commit project.json
Git--xFS: Ignore symlink
Dev->>Git: git clone (new machine)
Dev->>CLDPM: cldpm sync --all
CLDPM->>FS: Read project.json
CLDPM->>FS: Recreate symlinks
- Source of truth:
project.jsonstores component references - Local optimization: Symlinks generated via
cldpm sync - Git-friendly: Per-directory
.gitignoreignores only symlinks - Cross-platform:
cldpm syncregenerates symlinks after clone
cd python
pip install -e ".[dev]"
pytestContributions are welcome! See Contributing Guide and Code of Conduct.
For security concerns, see Security Policy.
MIT License - see LICENSE for details.
Crafted by Transilience.ai