email-construction
Email generation for construction workflows: RFI responses, submittal transmittals, meeting notices, change order notifications. Professional templates with context-aware content.
What this skill does
# Email Generation for Construction
## Overview
Generate professional construction emails with proper formatting, context, and attachments handling. Templates for common construction communication workflows.
## Construction Use Cases
### 1. RFI Response Email
Generate professional RFI response emails.
```python
from dataclasses import dataclass
from datetime import datetime
from typing import Optional, List
@dataclass
class RFIResponse:
rfi_number: str
project_name: str
subject: str
question: str
response: str
responder_name: str
responder_title: str
attachments: List[str] = None
cc_list: List[str] = None
def generate_rfi_response_email(rfi: RFIResponse) -> dict:
"""Generate RFI response email."""
subject = f"RE: RFI #{rfi.rfi_number} - {rfi.subject}"
body = f"""Dear Project Team,
Please find below our response to RFI #{rfi.rfi_number}.
**Project:** {rfi.project_name}
**RFI Number:** {rfi.rfi_number}
**Subject:** {rfi.subject}
**Date:** {datetime.now().strftime('%B %d, %Y')}
---
**QUESTION:**
{rfi.question}
---
**RESPONSE:**
{rfi.response}
---
Please proceed accordingly. If you have any questions regarding this response, please contact us.
{"**Attachments:**" + chr(10) + chr(10).join(f"- {a}" for a in rfi.attachments) if rfi.attachments else ""}
Best regards,
{rfi.responder_name}
{rfi.responder_title}
"""
return {
'subject': subject,
'body': body,
'cc': rfi.cc_list or [],
'attachments': rfi.attachments or []
}
```
### 2. Submittal Transmittal Email
Generate submittal transmittal emails.
```python
@dataclass
class SubmittalTransmittal:
submittal_number: str
project_name: str
spec_section: str
description: str
items: List[dict]
action_required: str
due_date: str
sender_name: str
sender_company: str
def generate_submittal_email(submittal: SubmittalTransmittal) -> dict:
"""Generate submittal transmittal email."""
subject = f"Submittal {submittal.submittal_number} - {submittal.spec_section} - {submittal.description}"
items_list = "\n".join(
f" {i+1}. {item['description']} ({item.get('copies', 1)} copies)"
for i, item in enumerate(submittal.items)
)
body = f"""Dear Design Team,
Please find attached Submittal {submittal.submittal_number} for your review.
**Project:** {submittal.project_name}
**Submittal No:** {submittal.submittal_number}
**Spec Section:** {submittal.spec_section}
**Description:** {submittal.description}
**Items Transmitted:**
{items_list}
**Action Required:** {submittal.action_required}
**Response Requested By:** {submittal.due_date}
Please review and return with your comments at your earliest convenience.
If you have any questions, please don't hesitate to contact us.
Best regards,
{submittal.sender_name}
{submittal.sender_company}
"""
return {
'subject': subject,
'body': body,
'priority': 'normal'
}
```
### 3. Meeting Notice Email
Generate meeting invitation emails.
```python
@dataclass
class MeetingNotice:
meeting_type: str # 'OAC', 'Subcontractor', 'Safety', 'Coordination'
project_name: str
date: str
time: str
location: str
virtual_link: Optional[str]
agenda_items: List[str]
attendees: List[str]
organizer_name: str
def generate_meeting_notice(meeting: MeetingNotice) -> dict:
"""Generate meeting notice email."""
subject = f"{meeting.meeting_type} Meeting - {meeting.project_name} - {meeting.date}"
agenda = "\n".join(f" {i+1}. {item}" for i, item in enumerate(meeting.agenda_items))
location_info = meeting.location
if meeting.virtual_link:
location_info += f"\n Virtual Option: {meeting.virtual_link}"
body = f"""Dear Team,
You are invited to the {meeting.meeting_type} Meeting for {meeting.project_name}.
**Meeting Details:**
- **Date:** {meeting.date}
- **Time:** {meeting.time}
- **Location:** {location_info}
**Agenda:**
{agenda}
**Attendees:**
{', '.join(meeting.attendees)}
Please confirm your attendance by replying to this email.
If you cannot attend, please send a delegate and notify the organizer.
Regards,
{meeting.organizer_name}
Project Manager
"""
return {
'subject': subject,
'body': body,
'to': meeting.attendees,
'calendar_invite': {
'start': f"{meeting.date} {meeting.time}",
'duration': 60,
'location': meeting.location
}
}
```
### 4. Change Order Notification
Generate change order notification emails.
```python
@dataclass
class ChangeOrderNotification:
co_number: str
project_name: str
description: str
amount: float
schedule_impact: str
reason: str
status: str # 'Pending', 'Approved', 'Rejected'
sender_name: str
sender_title: str
def generate_change_order_email(co: ChangeOrderNotification) -> dict:
"""Generate change order notification email."""
subject = f"Change Order #{co.co_number} - {co.status} - {co.project_name}"
amount_str = f"${co.amount:,.2f}"
if co.amount < 0:
amount_str = f"(${abs(co.amount):,.2f}) Credit"
body = f"""Dear Project Team,
This email is to notify you of Change Order #{co.co_number} for {co.project_name}.
**Change Order Details:**
- **CO Number:** {co.co_number}
- **Status:** {co.status}
- **Description:** {co.description}
**Financial Impact:**
- **Amount:** {amount_str}
**Schedule Impact:**
- {co.schedule_impact}
**Reason for Change:**
{co.reason}
{"Please review the attached documentation and provide your approval." if co.status == 'Pending' else ""}
{"This change order has been approved. Please proceed accordingly." if co.status == 'Approved' else ""}
If you have any questions, please contact the project team.
Best regards,
{co.sender_name}
{co.sender_title}
"""
return {
'subject': subject,
'body': body,
'priority': 'high' if co.status == 'Pending' else 'normal',
'flag': co.status == 'Pending'
}
```
### 5. Daily Report Email
Generate daily report distribution email.
```python
@dataclass
class DailyReportEmail:
project_name: str
report_date: str
report_number: int
weather: str
workforce_total: int
work_summary: List[str]
issues: List[str]
sender_name: str
def generate_daily_report_email(report: DailyReportEmail) -> dict:
"""Generate daily report distribution email."""
subject = f"Daily Report #{report.report_number} - {report.project_name} - {report.report_date}"
work_items = "\n".join(f"• {item}" for item in report.work_summary)
issues_text = "\n".join(f"• {issue}" for issue in report.issues) if report.issues else "None"
body = f"""Daily Construction Report
**Project:** {report.project_name}
**Date:** {report.report_date}
**Report #:** {report.report_number}
---
**Weather:** {report.weather}
**Total Workforce:** {report.workforce_total} workers on-site
---
**Work Completed:**
{work_items}
---
**Issues/Delays:**
{issues_text}
---
Full report attached. Please contact the site office with any questions.
{report.sender_name}
Site Superintendent
"""
return {
'subject': subject,
'body': body,
'attachments': [f'Daily_Report_{report.report_number}.pdf']
}
```
### 6. Delay Notice Email
Generate formal delay notification.
```python
@dataclass
class DelayNotice:
project_name: str
contract_number: str
delay_type: str # 'Excusable', 'Non-Excusable', 'Compensable'
cause: str
affected_activities: List[str]
original_completion: str
revised_completion: str
days_impacted: int
mitigation_plan: str
sender_name: str
sender_title: str
def generate_delay_notice_email(delay: DelayNotice) -> dict:
"""Generate formal delay notice email."""
subject = f"NOTICE OF DELAY - {delay.project_name} - {delay.days_impacted} Days"
activities = "\n".join(f" - {a}" Related in Productivity
gitea-workflow
IncludedOrchestrate agile development workflows for Gitea repositories using the tea CLI. Use when working with Gitea-hosted repos and asking to 'run the workflow', 'continue working', 'what's next', 'complete the task cycle', 'start my day', 'end the sprint', 'implement the next task', or wanting guided step-by-step development assistance. Keywords: workflow, orchestrate, agile, task cycle, sprint, daily, implement, review, PR, standup, retrospective, gitea, tea.
microsoft-graph-gateway
IncludedRoute Microsoft Graph work in this workspace. Use when users want to read or write Outlook mail, calendar events, contacts, OneDrive or SharePoint files, Teams, Planner, To Do, users, groups, directory data, or arbitrary Microsoft Graph endpoints from VS Code. Prefer WorkIQ for common read scenarios. Use Microsoft Graph for write actions and gap-read scenarios that need exact Graph properties, filters, permissions, or endpoints.
copilotkit
IncludedUse when building with CopilotKit — setup, development, integrations, debugging, upgrading, or contributing. Routes to the appropriate specialized skill based on the task.
wordly-wisdom
IncludedProvides calibrated decision analysis using Charlie Munger-style multiple mental models, inversion, incentive mapping, circle-of-competence checks, misjudgment audits, second-order effects, and forecast updates. Use when the user asks for an oracle take, a hard call, a decision memo, a premortem, an outside view, a red-team, a sanity-check, what am I missing, think this through, or wants a strategy, hire, investment, plan, product, partnership, or major life choice analysed. Avoid for simple factual lookups or time-sensitive legal, medical, or market questions without fresh evidence.
swain-session
IncludedSession management and project status dashboard. Owns the full session lifecycle (start/work/close/resume), focus lane, bookmarks, worktree detection, and tab naming. Also serves as the project status dashboard — shows active epics, progress, actionable next steps, blocked items, tasks, GitHub issues, and recommendations. Worktree creation is deferred to swain-do task dispatch (SPEC-195). Triggers on: 'session', 'status', 'what's next', 'dashboard', 'overview', 'where are we', 'what should I work on', 'show me priorities', 'bookmark', 'focus on', 'session info'.
gandi
IncludedComprehensive Gandi domain registrar integration for domain and DNS management. Register and manage domains, create/update/delete DNS records (A, AAAA, CNAME, MX, TXT, SRV, and more), configure email forwarding and aliases, check SSL certificate status, create DNS snapshots for safe rollback, bulk update zone files, and monitor domain expiration. Supports multi-domain management, zone file import/export, and automated DNS backups. Includes both read-only and destructive operations with safety controls.