Agent skill
markdown-pm
This skill should be used when the user asks to "query projects", "show active projects", "update project status", "mark project as completed", "generate project dashboard", or mentions project metadata management in Obsidian-style markdown repositories. Provides automated tools for querying, updating, and tracking projects with structured YAML frontmatter.
Install this agent skill to your Project
npx add-skill https://github.com/akaihola/skills-akaihola/tree/main/markdown-pm
SKILL.md
Markdown Project Management Skill
Manage projects in this Obsidian-style markdown repository using structured frontmatter and automated dashboards.
Overview
This skill provides tools for querying, updating, and tracking projects stored in pages/Projects/. All project files should include standardized YAML frontmatter for metadata:
status: Active, Planning, On Hold, Completed, Abandonedpriority: P1, P2, P3created: YYYY-MM-DDlast_updated: YYYY-MM-DDtags: List of tag keywordsrepo: (optional) GitHub repository URL
Tools
query_projects.py
Query and filter projects from pages/Projects/.
Usage patterns agents should use:
# List all active projects
.claude/skills/markdown-pm/query_projects.py --status Active
# Show high priority projects
.claude/skills/markdown-pm/query_projects.py --priority P1
# Filter by tag
.claude/skills/markdown-pm/query_projects.py --tag web,python
# Output as JSON for processing
.claude/skills/markdown-pm/query_projects.py --priority P1 --json
When agents should use this:
- User asks "What are my active projects?" OR "Show me P1 projects"
- User asks "What projects have the #web tag?"
- Agent needs to understand current project state before suggesting work
update_project.py
Safely update project frontmatter metadata.
Usage patterns agents should use:
# Mark project as completed
.claude/skills/markdown-pm/update_project.py --file "Darkgray" --status Completed
# Change priority
.claude/skills/markdown-pm/update_project.py --file "Web AI assistant" --priority P1
# Add tags
.claude/skills/markdown-pm/update_project.py --file "readfish" --add-tag python
# Remove tags
.claude/skills/markdown-pm/update_project.py --file "readfish" --remove-tag oldtag
# Set custom fields
.claude/skills/markdown-pm/update_project.py --file "Project name" --set repo="https://github.com/user/repo"
When agents should use this:
- User asks "Mark Darkgray as completed"
- User asks "Promote this project to P1 priority"
- After significant work on any project (automatic - do not ask)
- When adding new tags or metadata
IMPORTANT: Always use this script. Never edit project files directly for frontmatter updates. This ensures:
- Consistent timestamp updates (
last_updatedis automatically set to today's date on every update) - Proper YAML formatting
- No accidental damage to file content
Note: The last_updated field is automatically set to the current date whenever you run update_project.py. There is no --last-updated argument because this timestamp is always set automatically. Do not attempt to manually set last_updated using --set.
generate_dashboard.py
Generate a markdown dashboard file summarizing all projects.
Usage patterns agents should use:
# Generate dashboard to terminal
.claude/skills/markdown-pm/generate_dashboard.py
# Write to file (IMPORTANT: --output requires full file path, not just directory)
.claude/skills/markdown-pm/generate_dashboard.py --output pages/PKB/Project dashboard.md
When agents should use this:
- User asks "Generate the project dashboard"
- After updating any project status
- User asks for a visual overview of all projects
IMPORTANT: The --output parameter requires a full file path including the filename (e.g., --output pages/PKB/Project dashboard.md). Do NOT pass only a directory path (e.g., --output pages/PKB/) as this will cause an IsADirectoryError.
Agent Instructions
When User Asks About Projects
-
First: Query to understand current state
- Run
query_projects.pywith relevant filters - Present results in a clear, concise format
- Run
-
Then: Ask if user wants action
- "Would you like me to update any project status or priority?"
-
After updates: Suggest dashboard refresh
- "Shall I regenerate the dashboard to reflect these changes?"
When User Wants to Create New Project
-
Ask for details: name, priority, tags, repo (if applicable)
-
Create file in
pages/Projects/with proper frontmatter:
---
type: project
status: Planning
priority: P3
created: 2025-01-11
last_updated: 2025-01-11
tags: []
---
# Project Name
## Overview
## Goals
## Tasks
- Use
update_project.pyto set initial status/priority after creation
When User Wants to Work on a Specific Project
- Query project details to understand current state
- Read the full project file to understand context
- Perform the requested work
- ALWAYS update the project status after significant work:
- Use
update_project.pyto update status, priority, or add tags - Automatically regenerate the dashboard
- Do not ask the user whether to update - this is automatic
- Use
Project Metadata Schema
---
type: project # Always "project"
status: Active # Active, Planning, On Hold, Completed, Abandoned
priority: P1 # P1 (high), P2 (medium), P3 (low)
created: 2025-01-11 # Creation date
last_updated: 2025-01-11 # Last modification (auto-updated by scripts; cannot be manually set)
tags: # List of relevant tags
- web
- python
repo: https://github.com/user/repo # Optional GitHub URL
---
Integration with Repository Patterns
This skill integrates with existing repository patterns:
- Uses
pages/Projects/for individual project files - Uses
pages/PKB/Project dashboard.mdfor generated dashboards - Compatible with Obsidian's Wiki-link syntax (
[[link]]) - Maintains compatibility with your existing
Project rotation.md(can be deprecated in favor of auto-generated dashboards)
After dashboard generation, update Start page.md to link to the new dashboard location if desired.
Working on a Project — Full Workflow
1. Completeness check before diving in
- Does the project have
structure:, onemission/*tag, and all required body sections? If not, add them. - Does the project have a clear purpose/motivation? If not, ask.
- Is there a defined expected outcome (what does "done" look like)? If not, ask.
- These belong in the project file — add them once clarified.
2. Do the work, then always update
- Query project to understand current state
- Read the full project file for context
- Perform the requested work
- ALWAYS update the project after significant work:
- Use
update_project.pyto update status/priority/tags - Run
lint_projects.pyon the file to verify it passes - Regenerate dashboard automatically
- Use
- Do not ask the user whether to update — this happens automatically
Creating new projects
Always use templates/Project.md as the starting point. Fill in all placeholder fields. Every new project must pass lint_projects.py before it is considered complete.
Local Code Checkouts (Repo Discovery)
Development happens on two machines with different users and repo locations:
| Machine | User | Repos location |
|---|---|---|
| gogo | agent |
/home/agent/prg/pykoclaw-dev/ (pykoclaw mono-repo), /home/agent/repos/ai/mitto/ (Mitto web client), /home/agent/my-knowledge/ |
| atom | akaihola |
/home/akaihola/prg/ (aka ~/prg/) |
Always use $HOME or detect the current user rather than hardcoding paths. To find the GitHub remote for a local checkout, use git remote -v in that directory.
Recommended Agent Skills
Expand your agent's capabilities with these related and highly-rated skills.
youtube-to-markdown
Convert a YouTube video into clean, readable Markdown using its free auto-generated captions (no paid API needed). Use when the user asks to "convert YouTube video to markdown", "get transcript from YouTube URL", "summarise this video", or wants to turn YouTube subtitles/captions into readable text. Prefer this over youtube-transcription when the video already has auto-generated subtitles — it's free and faster. Accepts YouTube URLs.
brave-search
Search the web using Brave Search API. Use when the user asks to "search the web", "look up current information", "find news about", "research a topic online", "check prices online", or needs up-to-date facts that may not be in the model's training data. Requires BRAVE_SEARCH_API_KEY. Supports structured web results (pages, FAQs, news, videos) and an optional AI summarizer.
verkkokauppa
Search products on the Verkkokauppa.com Finnish webshop. This skill uses the Verkkokauppa search API directly, requiring no browser. Use when the user asks to "search Verkkokauppa", "find products on verkkokauppa.com", "verkkokauppa product search", "check Verkkokauppa prices", or mentions searching the Verkkokauppa store.
clasohlson
Search products on the Clas Ohlson Finland webshop (clasohlson.com/fi/). This skill uses the Voyado Elevate (Apptus eSales) search API directly, requiring no browser. Use when the user asks to "search Clas Ohlson", "find products on clasohlson.com", "clas ohlson product search", "check Clas Ohlson prices", or mentions searching the Finnish Clas Ohlson store.
bauhaus
Search products on the Bauhaus webshop (bauhaus.fi). This skill uses the Algolia search API with automatic key refresh. Use when the user asks to "search Bauhaus", "find products on bauhaus.fi", "bauhaus product search", "check Bauhaus prices", or mentions searching the Bauhaus store.
library
Didn't find tool you were looking for?