How Client Profiles Work and Resolve Across Different Project Contexts in Diagram Design
Client profiles in Diagram Design are named, version-controlled style-guide snapshots stored in ~/.diagram-design/profiles/, resolved first by project marker (profile: <slug> in .diagram-design) or by copying profile contents into the working style-guide.md when no marker exists.
Managing visual consistency across multiple clients is a core challenge in design systems. The Diagram Design plugin solves this through client profiles—reusable, namespaced configurations that eliminate the need to manually edit style-guide.md for every project change. This article explains how profiles are stored, validated, and resolved depending on whether your project uses a marker file.
What Are Client Profiles?
A client profile is a complete, self-contained style guide (semantic roles, typography tables, and component definitions) saved as a single markdown file with a mandatory metadata header. Profiles enable:
- Multi-tenant workflows: One Diagram Design installation serves many customers
- Version control: Each profile is a discrete file that can be tracked, branched, or archived
- Instant context switching: Load "acme-corp" styling for one project, "beta-healthcare" for another
Profile Storage Architecture
| Component | Location | Purpose |
|---|---|---|
| Profile library | ~/.diagram-design/profiles/ |
Central directory for all profile files |
| Profile file | ~/.diagram-design/profiles/<slug>.md |
Individual named configuration |
| Built-in default | default.md in profile library |
Read-only baseline, auto-created on first use |
| Project marker | .diagram-design in project root |
Optional override pointing to a specific profile |
| Working-copy header | profile: line in style-guide.md |
Records which profile was last loaded (copy-over mode) |
As defined in skills/diagram-design/references/profiles.md, the profile file format requires a header like:
profile: acme-corp
# Semantic Roles
...
How Profile Resolution Works
Diagram Design applies a strict priority order when determining which style guide to use. This ensures predictable behavior whether you're working in a marked project or experimenting ad hoc.
Rule 1: Marker-First Resolution (Preferred)
If a .diagram-design file exists and contains a valid profile: <slug> line, the plugin reads directly from ~/.diagram-design/profiles/<slug>.md without modifying the installed style-guide.md.
This guarantees:
- Project isolation from plugin updates
- No accidental overwrites of shared configuration
- Immediate reflection of profile library changes
If the marker references a missing profile, the user is prompted to select from available slugs (profile list) before proceeding.
Rule 2: Copy-Over Resolution (Fallback)
When no .diagram-design marker exists, running profile load <slug> copies the full profile content into style-guide.md, overwriting after explicit confirmation. The working copy receives a fresh profile: header tracking the loaded slug.
Use this mode for:
- Quick experimentation without project commitment
- Projects that don't need permanent profile binding
- Legacy workflows predating the marker system
Rule 3: Default Profile Handling
The default profile is reserved and protected:
- Cannot be overwritten by user saves
- Auto-created from shipped defaults if absent
- Loadable without marker creation
Per profiles.md L53, the first save or load operation triggers default snapshot creation if needed.
Profile Validation and Integrity
Diagram Design enforces strict constraints to prevent malformed configurations from corrupting projects.
Slug Constraints
Valid profile slugs must match:
- Maximum 64 characters
- Lower-case ASCII only
- Letters, digits, and hyphens exclusively
defaultis reserved and cannot be used for custom profiles
Invalid slugs are rejected at parse time with clear error messages.
Schema Back-Filling
When loading any profile, Diagram Design compares semantic-role and typography tables against shipped defaults. Missing rows are automatically back-filled, and the user is offered profile update <slug> to persist the repaired snapshot to the library. This maintains forward compatibility as the schema evolves.
Resolution Differences by Project Context
| Context | Resolution Path | Key Behavior | Typical Commands |
|---|---|---|---|
Marked project (profile: acme in .diagram-design) |
Direct read from library | No write to style-guide.md; profile updates reflect immediately |
profile list, profile show, profile delete <slug> |
| Unmarked project | Copy-over to working copy | Explicit confirmation before overwrite; header tracks active profile | profile load <slug>, profile save <slug>, profile update <slug> |
| First-time setup | Default creation + selection | Pristine default.md generated if missing |
profile load default |
| Broken marker | Fallback to working copy | Warning issued; user offered marker rewrite | profile load <slug> with correction prompt |
These behaviors are codified in ADR 0006 (docs/adr/0006-client-profiles-and-marker-first-resolution.md) and enforced by validation scripts.
Practical Command Reference
# List all saved profiles with active indicator
diagram-design profile
# Save current effective style guide as new profile
diagram-design profile save acme-corp
# Load profile into current project (copy-over if unmarked)
diagram-design profile load acme-corp
# Create permanent project marker
echo "profile: acme-corp" > .diagram-design
# Show active profile and source file location
diagram-design profile show
# Update library profile after schema back-fill
diagram-design profile update acme-corp
All commands route through the implementation documented in commands/profile.md and prompts/profile.md.
Key Implementation Files
| File | Responsibility |
|---|---|
skills/diagram-design/references/profiles.md |
Canonical profile format, resolution rules, and validation logic |
commands/profile.md |
User-facing command syntax and examples |
prompts/profile.md |
Agent prompt definitions for Pi/Claude integration |
docs/adr/0006-client-profiles-and-marker-first-resolution.md |
Architectural rationale for marker-first design |
scripts/verify-docs-sync.py |
Ensures profile surface documentation stays synchronized |
Summary
- Client profiles are named, version-controlled snapshots stored in
~/.diagram-design/profiles/<slug>.md - Resolution is marker-first: a valid
.diagram-designfile bypasses the working copy entirely - Copy-over mode activates when no marker exists, explicitly confirming before overwriting
style-guide.md - The
defaultprofile is protected and auto-generated, serving as a stable baseline - Schema back-filling maintains compatibility as Diagram Design evolves, with optional persistence via
profile update - All behaviors are validated by
verify-docs-sync.pyand documented in ADR 0006
Frequently Asked Questions
What happens if I delete a profile that's referenced by a project marker?
Diagram Design detects the missing profile during resolution, informs you which slug is missing, lists available alternatives (profile list), and prompts you to select a replacement before proceeding. The marker is not automatically rewritten until you confirm.
Can I use the same profile across multiple projects simultaneously?
Yes. Multiple projects can reference the same profile via their .diagram-design markers. Each project reads from the shared ~/.diagram-design/profiles/<slug>.md without interference. Updates to the profile file reflect immediately in all marked projects on their next operation.
Why does copy-over mode require confirmation while marker mode doesn't?
Copy-over modifies your working style-guide.md, which may contain uncommitted changes. Marker mode performs read-only operations against the profile library, presenting no data-loss risk. This distinction protects accidental overwrites in unmarked projects while keeping marked projects frictionless.
How do I migrate an unmarked project to use marker-based resolution?
Run profile load <slug> to ensure your working copy matches the desired profile, then create the marker with echo "profile: <slug>" > .diagram-design. Future operations will read directly from the library. Optionally delete the profile: line from style-guide.md to avoid confusion, though it's ignored when the marker is present.
Have a question about this repo?
These articles cover the highlights, but your codebase questions are specific. Give your agent direct access to the source. Share this with your agent to get started:
curl -s "https://instagit.com/install.md" Maintain an open-source project? Get it listed too →