emergency-card
npx skills add https://github.com/huifer/wellally-health --skill emergency-card
Agent 安装分布
Skill 文档
ç´§æ¥å»çä¿¡æ¯å¡çæå¨
çæç´§æ¥æ åµä¸å¿«é访é®çå»çä¿¡æ¯æè¦ï¼ç¨äºæ¥ææå°±å»ã
æ ¸å¿åè½
1. ç´§æ¥ä¿¡æ¯æå
ä»ç¨æ·çå¥åº·æ°æ®ä¸æåæå ³é®çä¿¡æ¯ï¼
- 严éè¿æï¼ä¼å æå4级ï¼è¿ææ§ä¼å ï¼å3çº§è¿æ
- å½åç¨è¯ï¼æ´»è·è¯ç©çåç§°ãåéãé¢ç
- æ¥çæ åµï¼éè¦ç´§æ¥å¤ççå»çç¶åµ
- æ¤å ¥ç©ï¼å¿èèµ·æå¨ãæ¯æ¶çï¼å½±åæ£æ¥åæ²»çï¼
- ç´§æ¥è系人ï¼å¿«éèç³»çå®¶å±ä¿¡æ¯
2. ä¿¡æ¯ä¼å 级æåº
æç §å»çç´§æ¥ç¨åº¦å¯¹ä¿¡æ¯æåºï¼
- P0 – 屿¥ä¿¡æ¯ï¼è¿ææ§ä¼å ã严éè¯ç©è¿æãå±åçå½çç¾ç
- P1 – éè¦ä¿¡æ¯ï¼å½åç¨è¯ãæ ¢æ§ç ãæ¤å ¥ç©
- P2 – ä¸è¬ä¿¡æ¯ï¼è¡åãå¹´é¾ãä½éãæè¿æ£æ¥
3. 夿 ¼å¼è¾åº
æ¯æå¤ç§è¾åºæ ¼å¼ä»¥éåºä¸ååºæ¯ï¼
- HTMLæ ¼å¼ï¼å¯æå°ç½é¡µï¼ä½¿ç¨Tailwind CSSåLucide徿 ï¼æ¨èï¼
- JSONæ ¼å¼ï¼ç»æåæ°æ®ï¼ä¾¿äºç³»ç»éæ
- ææ¬æ ¼å¼ï¼ç®æ´å¯è¯»ï¼éåæå°æºå¸¦
- PDFæ ¼å¼ï¼ä¸ä¸æå°ï¼éåé¿æä¿å
HTMLæ ¼å¼ï¼æ°å¢ï¼
çæç¬ç«çHTMLæä»¶ï¼å å«ï¼
- Tailwind CSSæ ·å¼ï¼éè¿CDNï¼
- Lucide徿 ï¼éè¿CDNï¼
- ååºå¼è®¾è®¡
- æå°ä¼å
- å¤ç§å°ºå¯¸åä½ï¼A4ãé±å å¡ã大åçï¼
- èªå¨å¡çç±»åæ£æµï¼æ åãå¿ç«¥ãèå¹´ã严éè¿æï¼
ä½¿ç¨æ¹å¼ï¼
# çææ åå¡ç
python scripts/generate_emergency_card.py
# æå®å¡çç±»å
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
# æå®æå°å°ºå¯¸
python scripts/generate_emergency_card.py standard a4 # A4æ å
python scripts/generate_emergency_card.py standard wallet # é±å
å¡
python scripts/generate_emergency_card.py standard large # 大åçï¼èå¹´ï¼
è¾åºæä»¶ï¼emergency-cards/emergency-card-{variant}-{YYYY-MM-DD}.html
4. 离线å¯ç¨
- æ¯æææºä¿åï¼ç¸åãæä»¶ï¼
- æ¯ææå°æºå¸¦ï¼é±å ãå ï¼
- æ¯æäºç«¯å¤ä»½ï¼å¯éï¼
使ç¨è¯´æ
è§¦åæ¡ä»¶
å½ç¨æ·æå°ä»¥ä¸åºæ¯æ¶ï¼ä½¿ç¨æ¤æè½ï¼
- â “çæç´§æ¥å»çä¿¡æ¯å¡”
- â “æéè¦æ è¡ï¼å¦ä½å¿«éæä¾å»ç信比
- â “ææçè¿æä¿¡æ¯æ´çæå¡ç”
- â “ç´§æ¥æ 嵿¥æä¿¡æ¯”
- â “å°±å»åå¤èµæ”
- â “å»çä¿¡æ¯æè¦”
æ§è¡æ¥éª¤
æ¥éª¤ 1: 读åç¨æ·åºç¡æ°æ®
ä»ä»¥ä¸æ°æ®æºè¯»åä¿¡æ¯ï¼
// 1. ç¨æ·æ¡£æ¡
const profile = readFile('data/profile.json');
// 2. è¿æå²
const allergies = readFile('data/allergies.json');
// 3. å½åç¨è¯
const medications = readFile('data/medications/medications.json');
// 4. è¾å°è®°å½
const radiation = readFile('data/radiation-records.json');
// 5. ææ¯è®°å½ï¼æ¥æ¾æ¤å
¥ç©ï¼
const surgeries = glob('data/ææ¯è®°å½/**/*.json');
// 6. åºé¢å°ç»ï¼æ¥æ¾æ¥çï¼
const dischargeSummaries = glob('data/åºé¢å°ç»/**/*.json');
æ¥éª¤ 2: æåå ³é®ä¿¡æ¯
2.1 åºç¡ä¿¡æ¯
const basicInfo = {
name: profile.basic_info?.name || "æªè®¾ç½®",
age: calculateAge(profile.basic_info?.birth_date),
gender: profile.basic_info?.gender || "æªè®¾ç½®",
blood_type: profile.basic_info?.blood_type || "æªç¥",
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 || []
};
2.2 严éè¿æ
// è¿æ»¤åº3-4级严éè¿æ
const criticalAllergies = allergies.allergies
.filter(a => a.severity_level >= 3 && a.current_status.status === 'active')
.map(a => ({
allergen: a.allergen.name,
severity: `è¿æ${getSeverityLabel(a.severity_level)}ï¼${a.severity_level}级ï¼`,
reaction: a.reaction_description,
diagnosed_date: a.diagnosis_date
}));
2.3 æ ¢æ§ç¾ç è¯æï¼æ°å¢ï¼
// 仿
¢æ§ç
ç®¡çæ°æ®ä¸æåè¯æä¿¡æ¯
const chronicConditions = [];
// é«è¡å
try {
const hypertensionData = readFile('data/hypertension-tracker.json');
if (hypertensionData.hypertension_management?.diagnosis_date) {
chronicConditions.push({
condition: 'é«è¡å',
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) {
// æä»¶ä¸åå¨æè¯»å失败ï¼è·³è¿
}
// ç³å°¿ç
try {
const diabetesData = readFile('data/diabetes-tracker.json');
if (diabetesData.diabetes_management?.diagnosis_date) {
chronicConditions.push({
condition: diabetesData.diabetes_management.type === 'type_1' ? '1åç³å°¿ç
' : '2åç³å°¿ç
',
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 ? 'æ§å¶è¯å¥½' : 'éæ¹å'
});
}
} catch (e) {
// æä»¶ä¸åå¨æè¯»å失败ï¼è·³è¿
}
// 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 ${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) {
// æä»¶ä¸åå¨æè¯»å失败ï¼è·³è¿
}
2.4 å½åç¨è¯
// åªå
嫿´»è·çè¯ç©
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 || []
}));
2.4 å»çç¶åµ
ä»åºé¢å°ç»ä¸æåè¯æä¿¡æ¯ï¼
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 || "é访ä¸"
}));
2.5 æ¤å ¥ç©
仿æ¯è®°å½ä¸æåæ¤å ¥ç©ä¿¡æ¯ï¼
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
}));
2.6 è¿æè¾å°æ´é²
const recentRadiation = {
total_dose_last_year: calculateTotalDose(radiation.records, 'last_year'),
last_exam: radiation.records[radiation.records.length - 1]
};
æ¥éª¤ 3: çæä¿¡æ¯å¡ç
æç §ä¼å 级ç»ç»ä¿¡æ¯ï¼
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], // åå¹¶æ¥çåæ
¢æ§ç
implants: implants,
recent_radiation_exposure: recentRadiation,
disclaimer: "æ¤ä¿¡æ¯å¡ä»
ä¾åèï¼ä¸æ¿ä»£ä¸ä¸å»çè¯æ",
data_source: "my-his个人å¥åº·ä¿¡æ¯ç³»ç»",
chronic_conditions: chronicConditions // åç¬å段便äºè®¿é®
};
æ¥éª¤ 4: æ ¼å¼åè¾åº
JSONæ ¼å¼
ç´æ¥è¾åºç»æåJSONæ°æ®ã
ææ¬æ ¼å¼
çææè¯»çææ¬å¡çï¼
âââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ
â ç´§æ¥å»çä¿¡æ¯å¡ â
â ââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ£
â å§åï¼å¼ ä¸ å¹´é¾ï¼35å² â
â è¡åï¼A+ ä½éï¼70kg â
â ââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ£
â ð 严éè¿æ â
â âââââââââââââââââââââââââââââââââââââââââââââââââââââââ â
â ⢠ééç´ - è¿ææ§ä¼å
ï¼4级ï¼ð â
â ååºï¼å¼å¸å°é¾ãå头水è¿ãæè¯ä¸§å¤± â
â ââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ£
â ð å½åç¨è¯ â
â âââââââââââââââââââââââââââââââââââââââââââââââââââââââ â
â ⢠氨氯å°å¹³ 5mg - æ¯æ¥1次ï¼é«è¡åï¼ â
â ⢠äºç²åè 1000mg - æ¯æ¥2次ï¼ç³å°¿ç
ï¼ â
â ââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ£
â ð¥ æ
¢æ§ç¾ç
â
â âââââââââââââââââââââââââââââââââââââââââââââââââââââââ â
â ⢠é«è¡åï¼2023-01-01è¯æï¼1çº§ï¼æ§å¶ä¸ï¼ â
â å¹³åè¡åï¼132/82 mmHg â
â ⢠2åç³å°¿ç
ï¼2022-05-10è¯æï¼HbA1c 6.8%ï¼ â
â æ§å¶ç¶æï¼è¯å¥½ â
â ⢠æ
¢é»èºï¼2020-03-15è¯æï¼GOLD 2çº§ï¼ â
â CATè¯åï¼18å â
â ââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ£
â ð¥ å
¶ä»ç¾ç
â
â âââââââââââââââââââââââââââââââââââââââââââââââââââââââ â
â ï¼å
¶ä»æ¥çæææ¯è¯æï¼å¦æï¼ â
â ââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ£
â ð¿ æ¤å
¥ç© â
â âââââââââââââââââââââââââââââââââââââââââââââââââââââââ â
â ⢠å¿èèµ·æå¨ï¼2022-06-10æ¤å
¥ï¼ â
â å»é¢ï¼XXå»é¢ â
â æ³¨æï¼å®æå¤æ¥ï¼é¿å
MRIæ£æ¥ â
â ââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ£
â ð ç´§æ¥è系人 â
â âââââââââââââââââââââââââââââââââââââââââââââââââââââââ â
â ⢠æåï¼é
å¶ï¼- 138****1234 â
â ââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ£
â â ï¸ å
责声æ â
â æ¤ä¿¡æ¯å¡ä»
ä¾åèï¼ä¸æ¿ä»£ä¸ä¸å»çè¯æ â
â çææ¶é´ï¼2025-12-31 12:34:56 â
âââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ
äºç»´ç æ ¼å¼
å°JSONæ°æ®è½¬æ¢ä¸ºäºç»´ç å¾çï¼
const qrCode = generateQRCode(JSON.stringify(emergencyCard));
emergencyCard.qr_code = qrCode;
æ¥éª¤ 5: ä¿åæä»¶
æ ¹æ®ç¨æ·éæ©çæ ¼å¼ä¿åæä»¶ï¼
// JSONæ ¼å¼
saveFile('emergency-card.json', JSON.stringify(emergencyCard, null, 2));
// ææ¬æ ¼å¼
saveFile('emergency-card.txt', generateTextCard(emergencyCard));
// äºç»´ç æ ¼å¼
saveFile('emergency-card-qr.png', emergencyCard.qr_code);
æ¥éª¤ 6: è¾åºç¡®è®¤ä¿¡æ¯
â
ç´§æ¥å»çä¿¡æ¯å¡å·²çæ
æä»¶ä½ç½®ï¼data/emergency-cards/emergency-card-2025-12-31.json
çææ¶é´ï¼2025-12-31 12:34:56
å
å«ä¿¡æ¯ï¼
ââââââââââââââââââââââââââ
â åºç¡ä¿¡æ¯ï¼å§åãå¹´é¾ãè¡åï¼
â 严éè¿æï¼1项4çº§è¿æï¼
â å½åç¨è¯ï¼2ç§è¯ç©ï¼
â å»çç¶åµï¼2ç§ç¾ç
ï¼
â æ¤å
¥ç©ï¼1项ï¼
â ç´§æ¥è系人ï¼1人ï¼
ð¡ 使ç¨å»ºè®®ï¼
ââââââââââââââââââââââââââ
⢠å°JSONæä»¶ä¿åå°ææºäºç
⢠å°äºç»´ç ä¿åå°ææºç¸å
⢠æå°ææ¬çé身æºå¸¦
⢠æ
è¡åæ´æ°ä¿¡æ¯
â ï¸ æ³¨æäºé¡¹ï¼
ââââââââââââââââââââââââââ
⢠æ¤ä¿¡æ¯å¡ä»
ä¾åèï¼ä¸æ¿ä»£ä¸ä¸å»çè¯æ
â¢ å®ææ´æ°ï¼å»ºè®®æ¯3个ææå¥åº·ä¿¡æ¯åååï¼
â¢ å¦æä¸¥éè¿æï¼è¯·é身æºå¸¦è¿ææ¥æå¡
æ°æ®æº
ä¸»è¦æ°æ®æº
- data/profile.jsonï¼ç¨æ·åºç¡ä¿¡æ¯ãè¡åãç´§æ¥è系人
- data/allergies.jsonï¼è¿æå²å严éç¨åº¦å级
- data/medications/medications.jsonï¼å½åç¨è¯è®¡åååé
æ ¢æ§ç æ°æ®æºï¼æ°å¢ï¼
- data/hypertension-tracker.jsonï¼é«è¡åç®¡çæ°æ®ï¼è¯ææ¥æãå级ãè¡åæ§å¶ãé¶å¨å®æå®³ãå¿è¡ç®¡é£é©ï¼
- data/diabetes-tracker.jsonï¼ç³å°¿ç ç®¡çæ°æ®ï¼ç±»åãHbA1cãè¡ç³æ§å¶ãå¹¶åççæ¥ï¼
- data/copd-tracker.jsonï¼COPDç®¡çæ°æ®ï¼GOLDå级ãCATè¯åãæ¥æ§å éå²ãèºåè½ï¼
è¾ å©æ°æ®æº
- data/radiation-records.jsonï¼è¿æè¾å°æ´é²è®°å½
- data/ææ¯è®°å½//*.json**ï¼ææ¯æ¤å ¥ç©ä¿¡æ¯
- data/åºé¢å°ç»//*.json**ï¼å»çè¯æä¿¡æ¯
å¯éæ°æ®æº
- data/index.jsonï¼å ¨å±æ°æ®ç´¢å¼
å®å ¨æ§åå
å¿ é¡»éµå¾ª
- â 䏿·»å ç¨è¯å»ºè®®ï¼ä» ååºå½åç¨è¯ï¼
- â 䏿ä¾è¯æç»è®ºï¼ä» ååºå·²ç¥è¯æï¼
- â ä¸ç»åºæ²»ç建议ï¼ä¸æ¿ä»£å»çï¼
- â æ 注å 责声æï¼ä» ä¾åèï¼
ä¿¡æ¯å确度
- â ä» æå已记å½çä¿¡æ¯ï¼ä¸æ¨æµææ¨æï¼
- â æ æ³¨ä¿¡æ¯æ¥æºåæ´æ°æ¶é´
- â å»ºè®®å®ææ´æ°ä¿¡æ¯
éç§ä¿æ¤
- â ææä¿¡æ¯å¯ééè
- â çµè¯å·ç é¨åéèï¼å¦ï¼138****1234ï¼
- â æææ°æ®ä» ä¿å卿¬å°
é误å¤ç
æ°æ®ç¼ºå¤±
- è¿ææ°æ®ç¼ºå¤±ï¼è¾åº”æªè®°å½è¿æå²”
- ç¨è¯æ°æ®ç¼ºå¤±ï¼è¾åº”æªè®°å½å½åç¨è¯”
- æ¤å ¥ç©æ°æ®ç¼ºå¤±ï¼è¾åº”æ æ¤å ¥ç©”
æä»¶è¯»å失败
- æ æ³è¯»åprofile.jsonï¼ä½¿ç¨é»è®¤å¼ï¼å§åï¼æªè®¾ç½®ï¼
- æ æ³è¯»åallergies.jsonï¼è·³è¿è¿æä¿¡æ¯
- ç»§ç»çæå ¶ä»ä¿¡æ¯ï¼ä¸å å个æä»¶å¤±è´¥è䏿
äºç»´ç çæå¤±è´¥
- éçº§ä¸ºææ¬æ ¼å¼è¾åº
- æç¤ºç¨æ·æå¨è®°å½ä¿¡æ¯
示ä¾è¾åº
宿´ç¤ºä¾è¯·åè examples.mdã
æµè¯æ°æ®
æµè¯æ°æ®æä»¶ä½äº test-data/emergency-example.jsonã
æ ¼å¼è¯´æ
详ç»çè¾åºæ ¼å¼è¯´æè¯·åè formats.mdã