Construction project management toolkit for AI agents. Use when: (1) Tracking construction jobs through the full lifecycle from lead to paid, (2) Generating daily PM briefings on job status and pipeline health, (3) Checking for stale permits or aging jobs that need attention, (4) Parsing emails from project managers for job updates, (5) Monitoring revenue pipeline across all job statuses.
Production-tested construction project management toolkit. Built from real roofing company workflows managing 36+ active jobs and $1.8M+ pipeline.
Use Construction PM when:
DO:
init.sh before using other commandsDON'T:
# Initialize the job tracker (creates JSON database)
bash scripts/init.sh
# Or specify a custom data directory
DATA_DIR=/path/to/data bash scripts/init.sh
Default data location: construction-pm-data/ in your workspace.
bash scripts/add-job.sh \
--number "12043" \
--customer "Nichols" \
--address "123 Main St" \
--pm "Greg" \
--value 49000 \
--status "permitted" \
--permit-status "approved" \
--notes "Roof replacement, 30sq"
bash scripts/add-job.sh --number "12043" --status "in-progress" --notes "Crew on site Monday"
# All jobs
bash scripts/pipeline.sh
# Filter by status
bash scripts/pipeline.sh --status permitted
# Filter by PM
bash scripts/pipeline.sh --pm Greg
# Stale jobs (no update in 14+ days)
bash scripts/pipeline.sh --stale 14
# Summary stats
bash scripts/pipeline.sh --summary
# Generate today's briefing
bash scripts/briefing.sh
# Custom stale threshold
bash scripts/briefing.sh --stale-days 7
# Output to file
bash scripts/briefing.sh > /path/to/briefing.md
The briefing includes:
# Check all pending permits
bash scripts/permit-check.sh
# Flag permits older than N days
bash scripts/permit-check.sh --threshold 30
# Parse a PM email for job updates
bash scripts/parse-email.sh --file /path/to/email.txt
# Parse from stdin
echo "Job 12043 Nichols - permit approved, scheduling crew for next week" | bash scripts/parse-email.sh
Extracts: job numbers, customer names, status keywords, permit mentions, dates.
| Status | Description |
|---|---|
lead | Initial inquiry, not yet estimated |
estimate | Estimate sent, waiting for approval |
sold | Contract signed, not yet permitted |
permitted | Permits approved, ready to schedule |
scheduled | Crew and materials scheduled |
in-progress | Work underway |
complete | Work done, pending final inspection |
invoiced | Invoice sent |
paid | Payment received |
on-hold | Paused for any reason |
cancelled | Job cancelled |
Jobs are stored as JSON in construction-pm-data/jobs.json:
{
"jobs": [
{
"number": "12043",
"customer": "Nichols",
"address": "123 Main St",
"pm": "Greg",
"value": 49000,
"status": "permitted",
"permit_status": "approved",
"permit_number": "",
"notes": "Roof replacement, 30sq",
"created": "2026-02-08",
"updated": "2026-02-08",
"history": [
{"date": "2026-02-08", "from": "", "to": "permitted", "note": "Initial entry"}
]
}
]
}
The briefing script outputs clean Markdown. Pipe it to your preferred delivery:
bash scripts/briefing.sh | your-send-scriptbash scripts/briefing.sh > ~/vault/Inbox/PM-Briefing-$(date +%F).mdgog gmail send