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共 1 个版本