From procore-pack
Implements full RFI workflows with Procore API: create detailed RFIs, assign, add responses, track status/days open, and close for construction projects.
npx claudepluginhub jeremylongshore/claude-code-plugins-plus-skills --plugin procore-packThis skill is limited to using the following tools:
Build a complete RFI workflow: create, assign, respond, track, and close RFIs using the Procore API.
Lists Procore projects, creates RFIs with assignee, and lists submittals via Python requests to REST API. For construction management integrations after auth setup.
Manages RFIs, submittals, change orders, draw requests, schedules, safety compliance, and lender reports for ground-up construction and renovation projects.
Guides Next.js Cache Components and Partial Prerendering (PPR): 'use cache' directives, cacheLife(), cacheTag(), revalidateTag() for caching, invalidation, static/dynamic optimization. Auto-activates on cacheComponents: true.
Share bugs, ideas, or general feedback.
Build a complete RFI workflow: create, assign, respond, track, and close RFIs using the Procore API.
procore-hello-world with project accessrfi_data = {
"rfi": {
"subject": "HVAC duct routing — Level 2 conflict",
"question_body": "The HVAC ducts conflict with structural beams at grid B-4. Need routing alternatives.",
"assignee_id": 11111,
"rfi_manager_id": 22222,
"due_date": "2026-04-15",
"priority": "high",
"cost_impact": "yes",
"schedule_impact": "yes",
}
}
rfi = requests.post(
f"{BASE}/projects/{project_id}/rfis",
headers={**headers, "Content-Type": "application/json"},
json=rfi_data,
)
rfi_id = rfi.json()["id"]
response = requests.post(
f"{BASE}/projects/{project_id}/rfis/{rfi_id}/responses",
headers={**headers, "Content-Type": "application/json"},
json={
"response": {
"body": "Route ducts below beam using 8-inch offset. See attached drawing.",
}
},
)
rfi_detail = requests.get(f"{BASE}/projects/{project_id}/rfis/{rfi_id}", headers=headers)
data = rfi_detail.json()
print(f"RFI #{data['number']}: {data['status']['name']}")
print(f" Days open: {data.get('days_open', 0)}")
print(f" Responses: {len(data.get('responses', []))}")
requests.patch(
f"{BASE}/projects/{project_id}/rfis/{rfi_id}",
headers={**headers, "Content-Type": "application/json"},
json={"rfi": {"status": "closed"}},
)
| Error | Cause | Solution |
|---|---|---|
422 Invalid assignee | User not on project | Verify user is a project member |
403 Cannot close | Not RFI manager | Only RFI manager can close |
| Missing responses | RFI in draft status | Distribute RFI first |
Submittal workflow: procore-core-workflow-b