Generates a medical emergency information summary card for quick access during emergencies. Extracts critical data (allergies, medications, acute conditions, implants) from health records and outputs in multiple formats (HTML, JSON, text, QR code). Use when the user needs travel prep, emergency info, a medical card, or asks about first-aid information.
Generates a medical information summary for quick access during emergencies or hospital visits.
Extracts the most critical information from the user's health data:
Ranks information by medical urgency:
Supports various output formats for different scenarios:
Generates a standalone HTML file including:
Usage:
# Generate standard card
python scripts/generate_emergency_card.py
# Specify card type
python scripts/generate_emergency_card.py standard
python scripts/generate_emergency_card.py child
python scripts/generate_emergency_card.py elderly
python scripts/generate_emergency_card.py severe
# Specify print size
python scripts/generate_emergency_card.py standard a4 # A4 standard
python scripts/generate_emergency_card.py standard wallet # Wallet card
python scripts/generate_emergency_card.py standard large # Large print (elderly)
Output file: emergency-cards/emergency-card-{variant}-{YYYY-MM-DD}.html
Use this skill when the user mentions the following scenarios:
Read information from the following data sources:
// 1. User profile
const profile = readFile('data/profile.json');
// 2. Allergy history
const allergies = readFile('data/allergies.json');
// 3. Current medications
const medications = readFile('data/medications/medications.json');
// 4. Radiation records
const radiation = readFile('data/radiation-records.json');
// 5. Surgical records (search for implants)
const surgeries = glob('data/surgical-records/**/*.json');
// 6. Discharge summaries (search for acute conditions)
const dischargeSummaries = glob('data/discharge-summaries/**/*.json');
const basicInfo = {
name: profile.basic_info?.name || "Not set",
age: calculateAge(profile.basic_info?.birth_date),
gender: profile.basic_info?.gender || "Not set",
blood_type: profile.basic_info?.blood_type || "Unknown",
weight: `${profile.basic_info?.weight} ${profile.basic_info?.weight_unit}`,
height: `${profile.basic_info?.height} ${profile.basic_info?.height_unit}`,
bmi: profile.calculated?.bmi,
emergency_contacts: profile.emergency_contacts || []
};
// Filter for grade 3-4 severe allergies
const criticalAllergies = allergies.allergies
.filter(a => a.severity_level >= 3 && a.current_status.status === 'active')
.map(a => ({
allergen: a.allergen.name,
severity: `Allergy ${getSeverityLabel(a.severity_level)} (Grade ${a.severity_level})`,
reaction: a.reaction_description,
diagnosed_date: a.diagnosis_date
}));
// Extract diagnosis information from chronic disease management data
const chronicConditions = [];
// Hypertension
try {
const hypertensionData = readFile('data/hypertension-tracker.json');
if (hypertensionData.hypertension_management?.diagnosis_date) {
chronicConditions.push({
condition: 'Hypertension',
diagnosis_date: hypertensionData.hypertension_management.diagnosis_date,
classification: hypertensionData.hypertension_management.classification,
current_bp: hypertensionData.hypertension_management.average_bp,
risk_level: hypertensionData.hypertension_management.cardiovascular_risk?.risk_level
});
}
} catch (e) {
// File does not exist or read failed, skip
}
// Diabetes
try {
const diabetesData = readFile('data/diabetes-tracker.json');
if (diabetesData.diabetes_management?.diagnosis_date) {
chronicConditions.push({
condition: diabetesData.diabetes_management.type === 'type_1' ? 'Type 1 Diabetes' : 'Type 2 Diabetes',
diagnosis_date: diabetesData.diabetes_management.diagnosis_date,
duration_years: diabetesData.diabetes_management.duration_years,
hba1c: diabetesData.diabetes_management.hba1c?.history?.[0]?.value,
control_status: diabetesData.diabetes_management.hba1c?.achievement ? 'Well controlled' : 'Needs improvement'
});
}
} catch (e) {
// File does not exist or read failed, skip
}
// COPD
try {
const copdData = readFile('data/copd-tracker.json');
if (copdData.copd_management?.diagnosis_date) {
chronicConditions.push({
condition: 'COPD',
diagnosis_date: copdData.copd_management.diagnosis_date,
gold_grade: `GOLD Grade ${copdData.copd_management.gold_grade}`,
cat_score: copdData.copd_management.symptom_assessment?.cat_score?.total_score,
exacerbations_last_year: copdData.copd_management.exacerbations?.last_year
});
}
} catch (e) {
// File does not exist or read failed, skip
}
// Include only active medications
const currentMedications = medications.medications
.filter(m => m.active === true)
.map(m => ({
name: m.name,
dosage: `${m.dosage.value}${m.dosage.unit}`,
frequency: getFrequencyLabel(m.frequency),
instructions: m.instructions,
warnings: m.warnings || []
}));
Extract diagnosis information from discharge summaries:
const medicalConditions = dischargeSummaries
.flatMap(ds => {
const data = readFile(ds.file_path);
return data.diagnoses || [];
})
.map(d => ({
condition: d.condition,
diagnosis_date: d.date,
status: d.status || "Under follow-up"
}));
Extract implant information from surgical records:
const implants = surgeries
.flatMap(s => {
const data = readFile(s.file_path);
return data.procedure?.implants || [];
})
.map(i => ({
type: i.type,
implant_date: i.date,
hospital: i.hospital,
notes: i.notes
}));
const recentRadiation = {
total_dose_last_year: calculateTotalDose(radiation.records, 'last_year'),
last_exam: radiation.records[radiation.records.length - 1]
};
Organize information by priority:
const emergencyCard = {
version: "1.0",
generated_at: new Date().toISOString(),
basic_info: basicInfo,
critical_allergies: criticalAllergies.sort(bySeverityDesc),
current_medications: currentMedications,
medical_conditions: [...medicalConditions, ...chronicConditions], // Merge acute and chronic conditions
implants: implants,
recent_radiation_exposure: recentRadiation,
disclaimer: "This information card is for reference only and does not replace professional medical diagnosis",
data_source: "my-his Personal Health Information System",
chronic_conditions: chronicConditions // Separate field for easy access
};
Output structured JSON data directly.
Generate a readable text card:
+===========================================================+
| EMERGENCY MEDICAL INFORMATION CARD |
+===========================================================+
| Name: John Doe Age: 35 |
| Blood Type: A+ Weight: 70kg |
+===========================================================+
| SEVERE ALLERGIES |
| --------------------------------------------------------- |
| * Penicillin - Anaphylaxis (Grade 4) CRITICAL |
| Reaction: Dyspnea, laryngeal edema, loss of |
| consciousness |
+===========================================================+
| CURRENT MEDICATIONS |
| --------------------------------------------------------- |
| * Amlodipine 5mg - Once daily (Hypertension) |
| * Metformin 1000mg - Twice daily (Diabetes) |
+===========================================================+
| CHRONIC CONDITIONS |
| --------------------------------------------------------- |
| * Hypertension (Diagnosed 2023-01-01, Grade 1, Controlled)|
| Average BP: 132/82 mmHg |
| * Type 2 Diabetes (Diagnosed 2022-05-10, HbA1c 6.8%) |
| Control Status: Good |
| * COPD (Diagnosed 2020-03-15, GOLD Grade 2) |
| CAT Score: 18 |
+===========================================================+
| OTHER CONDITIONS |
| --------------------------------------------------------- |
| (Other acute conditions or surgical diagnoses, if any) |
+===========================================================+
| IMPLANTS |
| --------------------------------------------------------- |
| * Cardiac Pacemaker (Implanted 2022-06-10) |
| Hospital: XX Hospital |
| Note: Regular follow-up required, avoid MRI |
+===========================================================+
| EMERGENCY CONTACTS |
| --------------------------------------------------------- |
| * Jane Doe (Spouse) - 138****1234 |
+===========================================================+
| DISCLAIMER |
| This card is for reference only and does not replace |
| professional medical diagnosis |
| Generated: 2025-12-31 12:34:56 |
+===========================================================+
Convert JSON data to a QR code image:
const qrCode = generateQRCode(JSON.stringify(emergencyCard));
emergencyCard.qr_code = qrCode;
Save the file in the user's chosen format:
// JSON format
saveFile('emergency-card.json', JSON.stringify(emergencyCard, null, 2));
// Text format
saveFile('emergency-card.txt', generateTextCard(emergencyCard));
// QR code format
saveFile('emergency-card-qr.png', emergencyCard.qr_code);
Emergency medical information card generated successfully.
File location: data/emergency-cards/emergency-card-2025-12-31.json
Generated at: 2025-12-31 12:34:56
Included information:
━━━━━━━━━━━━━━━━━━━━━━━━━━
- Basic information (name, age, blood type)
- Severe allergies (1 grade-4 allergy)
- Current medications (2 medications)
- Medical conditions (2 conditions)
- Implants (1 item)
- Emergency contacts (1 person)
Recommendations:
━━━━━━━━━━━━━━━━━━━━━━━━━━
- Save the JSON file to your phone's cloud storage
- Save the QR code to your phone's photo album
- Print the text version and carry it with you
- Update the information before traveling
Important Notes:
━━━━━━━━━━━━━━━━━━━━━━━━━━
- This information card is for reference only and does not replace professional medical diagnosis
- Update regularly (recommended every 3 months or when health information changes)
- If you have severe allergies, carry an allergy emergency card at all times
For a complete example, see examples.md.
Test data files are located at test-data/emergency-example.json.
For detailed output format specifications, see formats.md.