From pm
Development patterns for PM Dashboard plugin including MCP tools, FastAPI endpoints, database operations, WebSocket broadcasting, and testing requirements. Use when working on src/task_manager/, adding features, or modifying the plugin codebase.
How this skill is triggered — by the user, by Claude, or both
Slash command
/pm:pm-dashboard-devThis skill is limited to the following tools:
The summary Claude sees in its skill listing — used to decide when to auto-load this skill
This skill guides development on the PM Dashboard plugin codebase with established patterns, architecture, and testing requirements.
This skill guides development on the PM Dashboard plugin codebase with established patterns, architecture, and testing requirements.
Database Layer (SQLite + WAL)
↓
Tools Layer (MCP tools via tools_lib/)
↓
MCP Server (FastMCP integration)
↓
API Layer (FastAPI + WebSocket)
↓
Frontend (Static HTML/CSS/JS)
For detailed architecture, see ARCHITECTURE.md.
# Activate virtual environment
source activate.sh
# Install dependencies
pip install -e ".[dev]"
# Run tests
python -m pytest test/project_manager/ -v
# Run specific test file
python -m pytest test/project_manager/test_database.py -v
# Type checking
mypy src/
# Code formatting
black .
# Lint code
ruff check .
# Start API server
python -m task_manager.api
# Start MCP server
python -m task_manager.mcp_server
src/task_manager/
├── database/
│ ├── connection.py # Database initialization & schema
│ ├── tasks.py # Task CRUD operations
│ ├── locks.py # Atomic task locking
│ └── projects.py # Project/epic operations
├── tools_lib/
│ ├── base.py # BaseTool class
│ ├── tasks.py # Task management tools
│ ├── knowledge.py # Knowledge management tools
│ └── assumptions.py # RA tag tools
├── routers/
│ ├── board.py # Board state endpoint
│ ├── tasks.py # Task endpoints
│ ├── projects.py # Project endpoints
│ └── knowledge.py # Knowledge endpoints
├── api.py # FastAPI app + WebSocket manager
├── mcp_server.py # FastMCP server
├── models.py # Pydantic models
└── static/ # Frontend assets
See ADDING_MCP_TOOLS.md for complete step-by-step guide.
tools_lib/:from .base import BaseTool
class MyNewTool(BaseTool):
async def apply(self, param1: str, param2: Optional[int] = None) -> str:
"""Tool description."""
try:
# Implementation
return self._format_success_response(
"Operation successful",
result_data=data
)
except Exception as e:
return self._format_error_response("Operation failed", error_details=str(e))
mcp_server.py):@mcp.tool
async def my_new_tool(param1: str, param2: Optional[int] = None) -> str:
"""
Tool description for MCP clients.
Args:
param1: Description
param2: Description (optional)
Returns:
JSON string with results
"""
tool = MyNewTool(self.db, self.websocket_manager)
return await tool.apply(param1, param2)
test/project_manager/test_tools.pyUI Vocabulary (for frontend):
Database Vocabulary (internal):
Always map between these in API endpoints!
Prefer atomic patterns for concurrency safety:
# GOOD - Atomic single UPDATE
cursor.execute("""
UPDATE tasks SET lock_holder = ?, lock_expires_at = ?
WHERE id = ? AND (lock_holder IS NULL OR lock_expires_at < ?)
""", (agent_id, expires_at, task_id, current_time))
# BAD - Race condition risk
lock_status = get_lock_status(task_id)
if not lock_status["is_locked"]:
acquire_lock(task_id, agent_id) # Another agent could lock between these!
All JSON fields have database-level validation:
CONSTRAINT json_ra_tags CHECK (
ra_tags IS NULL OR (
json_valid(ra_tags) AND
json_type(ra_tags) = 'array'
)
)
Ensure your code generates valid JSON!
from ..api import connection_manager
# Broadcast event to all connected clients
await connection_manager.optimized_broadcast({
"type": "task.status_changed",
"task_id": task_id,
"status": "IN_PROGRESS",
"agent_id": "claude"
})
Common event types:
task.createdtask.updatedtask.status_changedtask.lockedtask.unlockedtask_deletedproject_deletedepic_deletedSee TESTING.md for comprehensive guide.
Run this test suite (all must pass):
# 1. Database tests
python -m pytest test/project_manager/test_database.py -v
# 2. API tests
python -m pytest test/project_manager/test_api.py::TestBoardStateEndpoint -v
# 3. MCP server tests
python -m pytest test/project_manager/test_mcp_server.py -v
# 4. Code formatting
black --check .
# 5. Type checking
mypy src/
Use the provided test runner:
bash scripts/run-full-tests.sh
try:
result = db.some_operation(param)
if result["success"]:
await connection_manager.broadcast({...})
return {"success": True, "data": result}
else:
raise HTTPException(status_code=400, detail=result["error"])
except HTTPException:
raise # Re-raise HTTP exceptions
except Exception as e:
logger.error(f"Operation failed: {e}")
raise HTTPException(status_code=500, detail="Internal server error")
# Success
return self._format_success_response(
"Task created successfully",
task_id=task_id,
task_name=name
)
# Error
return self._format_error_response(
"Task not found",
task_id=task_id
)
MCP tools receive string parameters only:
# Convert to appropriate types
task_id = int(task_id_str)
limit = int(limit_str) if limit_str else None
# Parse JSON strings
ra_tags = json.loads(ra_tags_str) if ra_tags_str else []
ra_metadata = json.loads(ra_metadata_str) if ra_metadata_str else {}
db.get_task(42) # Fragile!
task_id = result["task_id"]
db.get_task(task_id)
return {"status": "pending"} # Frontend expects "TODO"!
status_map = {"pending": "TODO", "in_progress": "IN_PROGRESS"}
return {"status": status_map[db_status]}
def get_tasks(): # Blocking!
return db.get_all_tasks()
async def get_tasks():
# Database operations are sync, but endpoint should be async
tasks = db.get_all_tasks()
return tasks
database/tools_lib/routers/test/project_manager/static/Keep related code together!
Check pyproject.toml for current version. Update version when:
Current: v0.2.2
bash scripts/run-full-tests.shnpx claudepluginhub p/commands-com-pm-claude-pluginGuides project creation, milestone and task management, and progress tracking using fireauto MCP tools like project-create, project-milestone-create, and project-status.
Generates a self-contained HTML project dashboard from .add/ project files, specs, docs, and git log. Shows requirement counts, feature status, milestones, cycles, and retro scores.
Interactive onboarding for the MCP Task Orchestrator that detects workspace state and walks through plan mode, persistent tracking, and MCP integration.