Construction project management toolkit for AI agents. Use when: (1) Tracking construction jobs through the full lifecycle from lead to paid, (2) Generating...
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:
bash
# 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
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
bash scripts/add-job.sh --number "12043" --status "in-progress" --notes "Crew on site Monday"
bash
# 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
bash
# 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:
bash
# Check all pending permits
bash scripts/permit-check.sh
# Flag permits older than N days
bash scripts/permit-check.sh --threshold 30
bash
# 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.
StatusDescriptionleadInitial inquiry, not yet estimatedestimateEstimate sent, waiting for approvalsoldContract signed, not yet permittedpermittedPermits approved, ready to schedulescheduledCrew and materials scheduledin-progressWork underwaycompleteWork done, pending final inspectioninvoicedInvoice sentpaidPayment receivedon-holdPaused for any reasoncancelledJob cancelled
Jobs are stored as JSON in construction-pm-data/jobs.json:
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