Agent profile switcher for USER.md, SOUL.md, and AGENTS.md persona sets.
Project description
dprofile
Agent Profile Switcher for USER.md, SOUL.md, and AGENTS.md persona sets.
dprofile is built for Agents, not just humans. It gives an Agent a safe, deterministic way to switch a target Agent configuration directory to a predefined profile.
The profile library lives in this project. The target directory is provided by the Agent at runtime.
Why
Modern Agent workflows need more than a temporary prompt. A useful Agent profile usually has three separate layers:
USER.md: who the Agent is helping, including background, preferences, and constraints.SOUL.md: who the Agent should be, including identity, values, voice, and standards.AGENTS.md: how the Agent should work, including tools, workflow, safety, and failure handling.
dprofile treats those three files as one switchable profile.
Safety Model
The CLI does not guess system-level Agent directories.
The Agent using this skill must identify the target configuration directory first:
- If the user provides a path, use that path.
- If the user clearly means the current workspace, use the workspace root.
- If the target is a system-level Agent config directory, ask the user to provide or confirm the exact path.
- If the target is ambiguous, ask before changing files.
Before switching, dprofile backs up existing target files into .agent-profile-backups/ and writes .agent-profile-state.json so the active profile is inspectable.
Install
From a clone:
python3 -m pip install -e .
Then:
dprofile list
Without installing, use the local wrapper:
python3 scripts/agent_profile.py list
Quick Start
List bundled profiles:
dprofile list
Switch a target Agent config directory to completionist:
dprofile switch completionist --target-dir /path/to/agent-config
Show the active profile for a target directory:
dprofile show --target-dir /path/to/agent-config
Validate the target directory before switching:
dprofile validate-target --target-dir /path/to/agent-config
Compare two profiles:
dprofile diff architect writer
Write Modes
By default, switching uses symlinks:
dprofile switch architect --target-dir /path/to/agent-config
Use copy mode for portable exports, system-level directories, or tools that do not preserve symlinks:
dprofile switch architect --target-dir /path/to/agent-config --mode copy
Custom Profile Library
Use --profiles-dir to point at another profile library:
dprofile list --profiles-dir /path/to/profiles
dprofile switch ops --profiles-dir /path/to/profiles --target-dir /path/to/agent-config
Each profile directory must contain:
manifest.yaml
USER.md
SOUL.md
AGENTS.md
Bundled Profiles
architect: architecture, engineering decisions, AI infrastructure.coding: direct implementation and fixes.reviewer: code review and risk-first feedback.debugger: hypothesis-driven debugging.ops: SRE and production operations.prompt-engineer: prompts, Agents, workflows, tool routing.data-analyst: SQL, metrics, dashboards, and trends.ml-researcher: model experiments, benchmarks, and papers.ai-infra: inference architecture, GPUs, vLLM, MCP, and Agent runtimes.writer: long-form writing and editing.copywriter: headlines, slogans, conversion, and emotional clarity.social-media: Xiaohongshu, Twitter/X, Weibo, Threads, and channel-native posts.designer: UI style, visual systems, and information design.product-manager: PRDs, user scenarios, scope, and metrics.founder-mode: strategy, prioritization, growth, and judgment.sales: persuasion, demos, objections, and business follow-up.customer-support: support replies, complaints, FAQ, and resolution.teacher: step-by-step teaching and analogy-driven explanations.travel-planner: itinerary, hotels, pacing, and travel constraints.fitness-coach: training, nutrition, recovery, and progression.minimalist: concise output.challenger: rigorous pushback and assumption testing.slow-thinker: deeper reasoning, alternatives, and tradeoff analysis.executor: direct task execution.completionist: complete delivery with tests, docs, and cleanup.
Commands
dprofile list [--profiles-dir DIR] [--target-dir DIR]
dprofile validate-profile [PROFILE] [--profiles-dir DIR]
dprofile validate-target --target-dir DIR
dprofile switch PROFILE --target-dir DIR [--profiles-dir DIR] [--mode symlink|copy]
dprofile show [PROFILE] [--target-dir DIR] [--profiles-dir DIR]
dprofile diff LEFT RIGHT [--profiles-dir DIR]
The legacy command name agent-profile is also installed for compatibility.
Development
Run tests:
python3 -m unittest tests/test_agent_profile.py -v
Validate bundled profiles:
python3 scripts/agent_profile.py validate-profile
Release
Releases are published by GitHub Actions with PyPI Trusted Publishing. This avoids storing a PyPI API token in GitHub secrets.
Configure the PyPI project publisher with:
Owner: pythias
Repository name: dprofile
Workflow name: publish.yml
Environment name: pypi
Then bump the version in pyproject.toml and agent_profile/__init__.py, commit, tag, and push:
git tag v0.1.1
git push origin main
git push origin v0.1.1
The Publish to PyPI workflow will run tests, validate bundled profiles, build the source and wheel distributions, run twine check, and upload to PyPI.
License
MIT
Project details
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file dprofile-0.1.1.tar.gz.
File metadata
- Download URL: dprofile-0.1.1.tar.gz
- Upload date:
- Size: 25.3 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
862f6d66f4041073b65cc3c3d26ae13efd88239cb494de773192c70e3c86dcb1
|
|
| MD5 |
3b4cc6d619b56d9c173f3b436d70637c
|
|
| BLAKE2b-256 |
f3cc2bcfd7f51a511d34579b28fac6ccf3c6fcb3de491de90e75753019bbc3f5
|
Provenance
The following attestation bundles were made for dprofile-0.1.1.tar.gz:
Publisher:
publish.yml on pythias/dprofile
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
dprofile-0.1.1.tar.gz -
Subject digest:
862f6d66f4041073b65cc3c3d26ae13efd88239cb494de773192c70e3c86dcb1 - Sigstore transparency entry: 1535611234
- Sigstore integration time:
-
Permalink:
pythias/dprofile@20b8f679afd04d0b0c13b6e5b57ce099ad5ec7a8 -
Branch / Tag:
refs/tags/v0.1.1 - Owner: https://github.com/pythias
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@20b8f679afd04d0b0c13b6e5b57ce099ad5ec7a8 -
Trigger Event:
push
-
Statement type:
File details
Details for the file dprofile-0.1.1-py3-none-any.whl.
File metadata
- Download URL: dprofile-0.1.1-py3-none-any.whl
- Upload date:
- Size: 43.6 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
56922bcb6589547723636b0eebda1cb1e64e60644c2f1428f02532c6bdb36ec0
|
|
| MD5 |
92276b51b30245f01980b06f4a7cd793
|
|
| BLAKE2b-256 |
7a40973ab51b3f8a63a83c8d53107f61efe1707139c480b5ff1d62f3dc710144
|
Provenance
The following attestation bundles were made for dprofile-0.1.1-py3-none-any.whl:
Publisher:
publish.yml on pythias/dprofile
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
dprofile-0.1.1-py3-none-any.whl -
Subject digest:
56922bcb6589547723636b0eebda1cb1e64e60644c2f1428f02532c6bdb36ec0 - Sigstore transparency entry: 1535611333
- Sigstore integration time:
-
Permalink:
pythias/dprofile@20b8f679afd04d0b0c13b6e5b57ce099ad5ec7a8 -
Branch / Tag:
refs/tags/v0.1.1 - Owner: https://github.com/pythias
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@20b8f679afd04d0b0c13b6e5b57ce099ad5ec7a8 -
Trigger Event:
push
-
Statement type: