Initialize a new .project/ directory in the current repo.
projectman init --name "My Project" --prefix MPOptions:
| Option | Default | Description |
|---|---|---|
--name |
(prompted) | Project name |
--prefix |
PRJ |
Uppercase prefix for IDs (e.g. MP → US-MP-1, US-MP-1-1, EPIC-MP-1) |
--description |
"" |
Project description |
--hub |
false |
Initialize in hub mode (multi-repo management) |
What it creates:
.project/
├── config.yaml
├── PROJECT.md
├── INFRASTRUCTURE.md
├── SECURITY.md
├── index.yaml
├── epics/
├── stories/
└── tasks/
With --hub, also creates:
.project/
├── VISION.md
├── ARCHITECTURE.md
├── DECISIONS.md
├── projects/
├── roadmap/
└── dashboards/
Install Claude Code integration files into the current project.
projectman setup-claudeWhat it creates:
| File | Purpose |
|---|---|
.mcp.json |
MCP server configuration (merged with existing if present) |
.claude/agents/pm.md |
PM agent definition |
.claude/skills/pm/SKILL.md |
General /pm skill |
.claude/skills/pm-status/SKILL.md |
/pm-status skill |
.claude/skills/pm-plan/SKILL.md |
/pm-plan skill |
.claude/skills/pm-do/SKILL.md |
/pm-do skill |
If .mcp.json already exists, ProjectMan merges its server config into the existing file without overwriting other MCP servers.
Note: If upgrading from an older version, stale skill directories (e.g. pm-scope, pm-audit, pm-fix, pm-init) may remain in .claude/skills/. These can be safely deleted.
Start the web dashboard server. Provides a visual UI with kanban board, epic/story/task views, search, burndown charts, and drag-drop status updates.
# Start with defaults (127.0.0.1:8000)
projectman web
# Bind to all interfaces on a custom port
projectman web --host 0.0.0.0 --port 9000Options:
| Option | Default | Description |
|---|---|---|
--host |
127.0.0.1 |
Host/IP to bind to (0.0.0.0 for all interfaces) |
--port |
8000 |
Port to listen on |
Requires the web extra: pip install "projectman[web] @ git+https://github.com/Biztactix-Ryan/ProjectMan.git"
The web dashboard can also be started via MCP tools (pm_web_start / pm_web_stop) or the /pm web start skill command, which allows Claude to manage the server lifecycle and automatically find an available port.
Start the MCP server in stdio transport mode. This is called automatically by Claude Code via the .mcp.json configuration — you typically don't need to run this manually.
projectman serveRequires the mcp extra: pip install "projectman[mcp] @ git+https://github.com/Biztactix-Ryan/ProjectMan.git"
Add a project as a git submodule to a hub. Only available in hub mode.
projectman add-project my-api [email protected]:org/my-api.gitArguments:
| Argument | Description |
|---|---|
name |
Short name for the project (becomes directory name under projects/) |
git_url |
Git remote URL for the repository |
What it does:
- Runs
git submodule add <url> projects/<name> - Registers the project in
.project/config.yaml - The submodule's
.project/directory becomes visible to the hub
Pull latest from all hub submodules. Hub mode only.
projectman syncWhat it does:
- Iterates through all registered subprojects
- Pulls the latest changes for each submodule
- Updates submodule references
Set the tracking branch for a subproject. Hub mode only.
projectman set-branch my-api developArguments:
| Argument | Description |
|---|---|
name |
Name of the registered subproject |
branch |
Branch name to track |
Scan the hub for unregistered projects, initialize missing .project/ directories, rebuild all indexes and embeddings, and regenerate dashboards. Hub mode only.
projectman repairWhat it does:
- Discovers directories in
projects/not registered in config — registers them - Initializes
.project/structure for projects that don't have one - Rebuilds
index.yamlfor every subproject - Rebuilds hub-level embeddings from all subproject stories/tasks (namespaced IDs)
- Regenerates hub dashboards (
status.md,burndown.md) - Writes a
REPAIR.mdreport to.project/
Use this after cloning a hub, adding projects manually, or whenever things seem out of sync.
Commit .project/ changes to git.
# Commit all .project/ changes (hub + all subprojects)
projectman commit
# Commit only hub-level changes
projectman commit --scope hub
# Commit a specific subproject's changes
projectman commit --scope project:my-api
# With a custom message
projectman commit --message "Update sprint 3 tasks"Options:
| Option | Default | Description |
|---|---|---|
--scope |
all |
Scope: hub, project:<name>, or all |
--message |
(auto-generated) | Commit message |
Push committed changes to remote.
# Push hub changes
projectman push
# Push a specific subproject
projectman push --scope project:my-api
# Coordinated push (preflight → subprojects → hub)
projectman push --projects my-api,my-frontend
# Dry run to preview
projectman push --dry-runOptions:
| Option | Default | Description |
|---|---|---|
--scope |
hub |
Scope: hub, project:<name>, or all |
--dry-run |
false |
Preview what would be pushed without pushing |
--projects |
(auto-discover) | Comma-separated project names for coordinated push |
When --projects or --dry-run is used, the push runs in coordinated mode: preflight checks run first, then subprojects are pushed, then the hub.
Show git status of all hub submodules in a table.
projectman git-status
projectman git-status --verbose
projectman git-status --jsonOptions:
| Option | Description |
|---|---|
--verbose |
Show additional detail |
--json |
Output as JSON |
Output includes: project name, branch, dirty state, ahead/behind counts, and open PRs.
Check that hub submodule branches match their configured tracking branches.
projectman validate-branchesManage changesets for coordinating multi-project changes. Hub mode only.
projectman changeset create "Auth across services" --projects my-api,my-frontend
projectman changeset create "DB migration" --projects my-api --description "Schema v2 migration"Options:
| Option | Required | Description |
|---|---|---|
name |
yes | Changeset title (positional argument) |
--projects |
yes | Comma-separated project names |
--description |
no | Changeset description |
projectman changeset add-project CS-PRJ-1 my-worker --ref feature/auth-workerArguments:
| Argument | Description |
|---|---|
changeset_id |
Changeset ID (e.g. CS-PRJ-1) |
project_name |
Project name to add |
Options:
| Option | Description |
|---|---|
--ref |
Git branch/ref for this project's changes |
# List all changesets
projectman changeset status
# Show specific changeset
projectman changeset status CS-PRJ-1Generate gh CLI commands for creating cross-referenced PRs.
projectman changeset create-prs CS-PRJ-1Check PR merge status and update changeset status.
projectman changeset push CS-PRJ-1Run drift detection and generate a DRIFT.md report.
# Audit current project
projectman audit
# Audit all projects in hub
projectman audit --allOptions:
| Option | Description |
|---|---|
--all |
Audit all projects in the hub (hub mode only) |
Checks performed (13 total):
| # | Check | Severity | Description |
|---|---|---|---|
| 1 | Done story with incomplete tasks | ERROR | Story marked done but has tasks not marked done |
| 2 | Undecomposed stories | WARNING | Active/ready stories with no tasks |
| 3 | Stale in-progress | WARNING | Items in-progress for >14 days without update |
| 4 | Point mismatch | INFO | Story points don't match sum of task points |
| 5 | Thin description | INFO | Story or task body has fewer than 20 characters |
| 6 | Documentation staleness/missing | ERROR/WARNING/INFO | Missing docs (error), unfilled templates (warning), stale docs (info) |
| 7 | Empty active epic | WARNING | Active epic with no linked stories |
| 8 | Done epic with open stories | ERROR | Epic marked done but has stories not done/archived |
| 9 | Orphaned epic reference | WARNING | Story references a non-existent epic ID |
| 10 | Stale draft epic | INFO | Draft epic with no stories for >30 days |
| 11 | Hub documentation checks | WARNING/INFO | Missing or unfilled hub docs (VISION.md, ARCHITECTURE.md, DECISIONS.md) |
| 12 | Stale task assignment | WARNING | Task assigned to someone with no updates for >14 days |
| 13 | Malformed files in quarantine | WARNING | Files quarantined in .project/malformed/ needing repair |
Output is written to .project/DRIFT.md and printed to stdout.