@synsci/cli-darwin-x64-baseline 1.1.71 → 1.1.73
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/bin/skills/citation-management/SKILL.md +1109 -0
- package/bin/skills/citation-management/assets/bibtex_template.bib +264 -0
- package/bin/skills/citation-management/assets/citation_checklist.md +386 -0
- package/bin/skills/citation-management/references/bibtex_formatting.md +908 -0
- package/bin/skills/citation-management/references/citation_validation.md +794 -0
- package/bin/skills/citation-management/references/google_scholar_search.md +725 -0
- package/bin/skills/citation-management/references/metadata_extraction.md +870 -0
- package/bin/skills/citation-management/references/pubmed_search.md +839 -0
- package/bin/skills/citation-management/scripts/doi_to_bibtex.py +182 -0
- package/bin/skills/citation-management/scripts/extract_metadata.py +570 -0
- package/bin/skills/citation-management/scripts/format_bibtex.py +349 -0
- package/bin/skills/citation-management/scripts/search_google_scholar.py +251 -0
- package/bin/skills/citation-management/scripts/search_pubmed.py +348 -0
- package/bin/skills/citation-management/scripts/validate_citations.py +494 -0
- package/bin/skills/clinical-decision-support/README.md +129 -0
- package/bin/skills/clinical-decision-support/SKILL.md +506 -0
- package/bin/skills/clinical-decision-support/assets/biomarker_report_template.tex +380 -0
- package/bin/skills/clinical-decision-support/assets/clinical_pathway_template.tex +222 -0
- package/bin/skills/clinical-decision-support/assets/cohort_analysis_template.tex +359 -0
- package/bin/skills/clinical-decision-support/assets/color_schemes.tex +149 -0
- package/bin/skills/clinical-decision-support/assets/example_gbm_cohort.md +208 -0
- package/bin/skills/clinical-decision-support/assets/recommendation_strength_guide.md +328 -0
- package/bin/skills/clinical-decision-support/assets/treatment_recommendation_template.tex +529 -0
- package/bin/skills/clinical-decision-support/references/biomarker_classification.md +719 -0
- package/bin/skills/clinical-decision-support/references/clinical_decision_algorithms.md +604 -0
- package/bin/skills/clinical-decision-support/references/evidence_synthesis.md +840 -0
- package/bin/skills/clinical-decision-support/references/outcome_analysis.md +640 -0
- package/bin/skills/clinical-decision-support/references/patient_cohort_analysis.md +427 -0
- package/bin/skills/clinical-decision-support/references/treatment_recommendations.md +521 -0
- package/bin/skills/clinical-decision-support/scripts/biomarker_classifier.py +383 -0
- package/bin/skills/clinical-decision-support/scripts/build_decision_tree.py +417 -0
- package/bin/skills/clinical-decision-support/scripts/create_cohort_tables.py +509 -0
- package/bin/skills/clinical-decision-support/scripts/generate_survival_analysis.py +441 -0
- package/bin/skills/clinical-decision-support/scripts/validate_cds_document.py +326 -0
- package/bin/skills/clinical-reports/IMPLEMENTATION_SUMMARY.md +641 -0
- package/bin/skills/clinical-reports/README.md +236 -0
- package/bin/skills/clinical-reports/SKILL.md +1127 -0
- package/bin/skills/clinical-reports/assets/case_report_template.md +352 -0
- package/bin/skills/clinical-reports/assets/clinical_trial_csr_template.md +353 -0
- package/bin/skills/clinical-reports/assets/clinical_trial_sae_template.md +359 -0
- package/bin/skills/clinical-reports/assets/consult_note_template.md +305 -0
- package/bin/skills/clinical-reports/assets/discharge_summary_template.md +453 -0
- package/bin/skills/clinical-reports/assets/hipaa_compliance_checklist.md +395 -0
- package/bin/skills/clinical-reports/assets/history_physical_template.md +305 -0
- package/bin/skills/clinical-reports/assets/lab_report_template.md +309 -0
- package/bin/skills/clinical-reports/assets/pathology_report_template.md +249 -0
- package/bin/skills/clinical-reports/assets/quality_checklist.md +338 -0
- package/bin/skills/clinical-reports/assets/radiology_report_template.md +318 -0
- package/bin/skills/clinical-reports/assets/soap_note_template.md +253 -0
- package/bin/skills/clinical-reports/references/case_report_guidelines.md +570 -0
- package/bin/skills/clinical-reports/references/clinical_trial_reporting.md +693 -0
- package/bin/skills/clinical-reports/references/data_presentation.md +530 -0
- package/bin/skills/clinical-reports/references/diagnostic_reports_standards.md +629 -0
- package/bin/skills/clinical-reports/references/medical_terminology.md +588 -0
- package/bin/skills/clinical-reports/references/patient_documentation.md +744 -0
- package/bin/skills/clinical-reports/references/peer_review_standards.md +585 -0
- package/bin/skills/clinical-reports/references/regulatory_compliance.md +577 -0
- package/bin/skills/clinical-reports/scripts/check_deidentification.py +332 -0
- package/bin/skills/clinical-reports/scripts/compliance_checker.py +78 -0
- package/bin/skills/clinical-reports/scripts/extract_clinical_data.py +97 -0
- package/bin/skills/clinical-reports/scripts/format_adverse_events.py +97 -0
- package/bin/skills/clinical-reports/scripts/generate_report_template.py +149 -0
- package/bin/skills/clinical-reports/scripts/terminology_validator.py +126 -0
- package/bin/skills/clinical-reports/scripts/validate_case_report.py +323 -0
- package/bin/skills/clinical-reports/scripts/validate_trial_report.py +88 -0
- package/bin/skills/fireworks-ai/SKILL.md +665 -0
- package/bin/skills/generate-image/SKILL.md +178 -0
- package/bin/skills/generate-image/scripts/generate_image.py +254 -0
- package/bin/skills/groq/SKILL.md +347 -0
- package/bin/skills/hypothesis-generation/SKILL.md +293 -0
- package/bin/skills/hypothesis-generation/assets/FORMATTING_GUIDE.md +672 -0
- package/bin/skills/hypothesis-generation/assets/hypothesis_generation.sty +307 -0
- package/bin/skills/hypothesis-generation/assets/hypothesis_report_template.tex +572 -0
- package/bin/skills/hypothesis-generation/references/experimental_design_patterns.md +329 -0
- package/bin/skills/hypothesis-generation/references/hypothesis_quality_criteria.md +198 -0
- package/bin/skills/hypothesis-generation/references/literature_search_strategies.md +622 -0
- package/bin/skills/latex-posters/README.md +417 -0
- package/bin/skills/latex-posters/SKILL.md +1602 -0
- package/bin/skills/latex-posters/assets/baposter_template.tex +257 -0
- package/bin/skills/latex-posters/assets/beamerposter_template.tex +244 -0
- package/bin/skills/latex-posters/assets/poster_quality_checklist.md +358 -0
- package/bin/skills/latex-posters/assets/tikzposter_template.tex +251 -0
- package/bin/skills/latex-posters/references/latex_poster_packages.md +745 -0
- package/bin/skills/latex-posters/references/poster_content_guide.md +748 -0
- package/bin/skills/latex-posters/references/poster_design_principles.md +806 -0
- package/bin/skills/latex-posters/references/poster_layout_design.md +900 -0
- package/bin/skills/latex-posters/scripts/review_poster.sh +214 -0
- package/bin/skills/literature-review/SKILL.md +641 -0
- package/bin/skills/literature-review/assets/review_template.md +412 -0
- package/bin/skills/literature-review/references/citation_styles.md +166 -0
- package/bin/skills/literature-review/references/database_strategies.md +455 -0
- package/bin/skills/literature-review/scripts/generate_pdf.py +184 -0
- package/bin/skills/literature-review/scripts/search_databases.py +310 -0
- package/bin/skills/literature-review/scripts/verify_citations.py +218 -0
- package/bin/skills/market-research-reports/SKILL.md +904 -0
- package/bin/skills/market-research-reports/assets/FORMATTING_GUIDE.md +428 -0
- package/bin/skills/market-research-reports/assets/market_report_template.tex +1380 -0
- package/bin/skills/market-research-reports/assets/market_research.sty +564 -0
- package/bin/skills/market-research-reports/references/data_analysis_patterns.md +548 -0
- package/bin/skills/market-research-reports/references/report_structure_guide.md +999 -0
- package/bin/skills/market-research-reports/references/visual_generation_guide.md +1077 -0
- package/bin/skills/market-research-reports/scripts/generate_market_visuals.py +472 -0
- package/bin/skills/markitdown/INSTALLATION_GUIDE.md +318 -0
- package/bin/skills/markitdown/LICENSE.txt +22 -0
- package/bin/skills/markitdown/OPENROUTER_INTEGRATION.md +359 -0
- package/bin/skills/markitdown/QUICK_REFERENCE.md +309 -0
- package/bin/skills/markitdown/README.md +184 -0
- package/bin/skills/markitdown/SKILL.md +486 -0
- package/bin/skills/markitdown/SKILL_SUMMARY.md +307 -0
- package/bin/skills/markitdown/assets/example_usage.md +463 -0
- package/bin/skills/markitdown/references/api_reference.md +399 -0
- package/bin/skills/markitdown/references/file_formats.md +542 -0
- package/bin/skills/markitdown/scripts/batch_convert.py +195 -0
- package/bin/skills/markitdown/scripts/convert_literature.py +262 -0
- package/bin/skills/markitdown/scripts/convert_with_ai.py +224 -0
- package/bin/skills/ml-paper-writing/SKILL.md +937 -0
- package/bin/skills/ml-paper-writing/references/checklists.md +361 -0
- package/bin/skills/ml-paper-writing/references/citation-workflow.md +562 -0
- package/bin/skills/ml-paper-writing/references/reviewer-guidelines.md +367 -0
- package/bin/skills/ml-paper-writing/references/sources.md +159 -0
- package/bin/skills/ml-paper-writing/references/writing-guide.md +476 -0
- package/bin/skills/ml-paper-writing/templates/README.md +251 -0
- package/bin/skills/ml-paper-writing/templates/aaai2026/README.md +534 -0
- package/bin/skills/ml-paper-writing/templates/aaai2026/aaai2026-unified-supp.tex +144 -0
- package/bin/skills/ml-paper-writing/templates/aaai2026/aaai2026-unified-template.tex +952 -0
- package/bin/skills/ml-paper-writing/templates/aaai2026/aaai2026.bib +111 -0
- package/bin/skills/ml-paper-writing/templates/aaai2026/aaai2026.bst +1493 -0
- package/bin/skills/ml-paper-writing/templates/aaai2026/aaai2026.sty +315 -0
- package/bin/skills/ml-paper-writing/templates/acl/README.md +50 -0
- package/bin/skills/ml-paper-writing/templates/acl/acl.sty +312 -0
- package/bin/skills/ml-paper-writing/templates/acl/acl_latex.tex +377 -0
- package/bin/skills/ml-paper-writing/templates/acl/acl_lualatex.tex +101 -0
- package/bin/skills/ml-paper-writing/templates/acl/acl_natbib.bst +1940 -0
- package/bin/skills/ml-paper-writing/templates/acl/anthology.bib.txt +26 -0
- package/bin/skills/ml-paper-writing/templates/acl/custom.bib +70 -0
- package/bin/skills/ml-paper-writing/templates/acl/formatting.md +326 -0
- package/bin/skills/ml-paper-writing/templates/colm2025/README.md +3 -0
- package/bin/skills/ml-paper-writing/templates/colm2025/colm2025_conference.bib +11 -0
- package/bin/skills/ml-paper-writing/templates/colm2025/colm2025_conference.bst +1440 -0
- package/bin/skills/ml-paper-writing/templates/colm2025/colm2025_conference.pdf +0 -0
- package/bin/skills/ml-paper-writing/templates/colm2025/colm2025_conference.sty +218 -0
- package/bin/skills/ml-paper-writing/templates/colm2025/colm2025_conference.tex +305 -0
- package/bin/skills/ml-paper-writing/templates/colm2025/fancyhdr.sty +485 -0
- package/bin/skills/ml-paper-writing/templates/colm2025/math_commands.tex +508 -0
- package/bin/skills/ml-paper-writing/templates/colm2025/natbib.sty +1246 -0
- package/bin/skills/ml-paper-writing/templates/iclr2026/fancyhdr.sty +485 -0
- package/bin/skills/ml-paper-writing/templates/iclr2026/iclr2026_conference.bib +24 -0
- package/bin/skills/ml-paper-writing/templates/iclr2026/iclr2026_conference.bst +1440 -0
- package/bin/skills/ml-paper-writing/templates/iclr2026/iclr2026_conference.pdf +0 -0
- package/bin/skills/ml-paper-writing/templates/iclr2026/iclr2026_conference.sty +246 -0
- package/bin/skills/ml-paper-writing/templates/iclr2026/iclr2026_conference.tex +414 -0
- package/bin/skills/ml-paper-writing/templates/iclr2026/math_commands.tex +508 -0
- package/bin/skills/ml-paper-writing/templates/iclr2026/natbib.sty +1246 -0
- package/bin/skills/ml-paper-writing/templates/icml2026/algorithm.sty +79 -0
- package/bin/skills/ml-paper-writing/templates/icml2026/algorithmic.sty +201 -0
- package/bin/skills/ml-paper-writing/templates/icml2026/example_paper.bib +75 -0
- package/bin/skills/ml-paper-writing/templates/icml2026/example_paper.pdf +0 -0
- package/bin/skills/ml-paper-writing/templates/icml2026/example_paper.tex +662 -0
- package/bin/skills/ml-paper-writing/templates/icml2026/fancyhdr.sty +864 -0
- package/bin/skills/ml-paper-writing/templates/icml2026/icml2026.bst +1443 -0
- package/bin/skills/ml-paper-writing/templates/icml2026/icml2026.sty +767 -0
- package/bin/skills/ml-paper-writing/templates/icml2026/icml_numpapers.pdf +0 -0
- package/bin/skills/ml-paper-writing/templates/neurips2025/Makefile +36 -0
- package/bin/skills/ml-paper-writing/templates/neurips2025/extra_pkgs.tex +53 -0
- package/bin/skills/ml-paper-writing/templates/neurips2025/main.tex +38 -0
- package/bin/skills/ml-paper-writing/templates/neurips2025/neurips.sty +382 -0
- package/bin/skills/paper-2-web/SKILL.md +491 -0
- package/bin/skills/paper-2-web/references/installation.md +141 -0
- package/bin/skills/paper-2-web/references/paper2poster.md +346 -0
- package/bin/skills/paper-2-web/references/paper2video.md +305 -0
- package/bin/skills/paper-2-web/references/paper2web.md +187 -0
- package/bin/skills/paper-2-web/references/usage_examples.md +436 -0
- package/bin/skills/peer-review/SKILL.md +702 -0
- package/bin/skills/peer-review/references/calibration_guidelines.md +196 -0
- package/bin/skills/peer-review/references/common_issues.md +552 -0
- package/bin/skills/peer-review/references/paper_mechanics.md +269 -0
- package/bin/skills/peer-review/references/reporting_standards.md +290 -0
- package/bin/skills/peer-review/references/scoring_rubric.md +239 -0
- package/bin/skills/pptx-posters/SKILL.md +410 -0
- package/bin/skills/pptx-posters/assets/poster_html_template.html +257 -0
- package/bin/skills/pptx-posters/assets/poster_quality_checklist.md +358 -0
- package/bin/skills/pptx-posters/references/poster_content_guide.md +748 -0
- package/bin/skills/pptx-posters/references/poster_design_principles.md +806 -0
- package/bin/skills/pptx-posters/references/poster_layout_design.md +900 -0
- package/bin/skills/research-grants/README.md +285 -0
- package/bin/skills/research-grants/SKILL.md +938 -0
- package/bin/skills/research-grants/assets/budget_justification_template.md +453 -0
- package/bin/skills/research-grants/assets/nih_specific_aims_template.md +166 -0
- package/bin/skills/research-grants/assets/nsf_project_summary_template.md +92 -0
- package/bin/skills/research-grants/references/broader_impacts.md +392 -0
- package/bin/skills/research-grants/references/darpa_guidelines.md +636 -0
- package/bin/skills/research-grants/references/doe_guidelines.md +586 -0
- package/bin/skills/research-grants/references/nih_guidelines.md +851 -0
- package/bin/skills/research-grants/references/nsf_guidelines.md +570 -0
- package/bin/skills/research-grants/references/specific_aims_guide.md +458 -0
- package/bin/skills/research-lookup/README.md +156 -0
- package/bin/skills/research-lookup/SKILL.md +606 -0
- package/bin/skills/research-lookup/examples.py +174 -0
- package/bin/skills/research-lookup/lookup.py +187 -0
- package/bin/skills/research-lookup/research_lookup.py +483 -0
- package/bin/skills/research-lookup/scripts/research_lookup.py +483 -0
- package/bin/skills/scholar-evaluation/SKILL.md +289 -0
- package/bin/skills/scholar-evaluation/references/evaluation_framework.md +663 -0
- package/bin/skills/scholar-evaluation/scripts/calculate_scores.py +366 -0
- package/bin/skills/scientific-critical-thinking/SKILL.md +566 -0
- package/bin/skills/scientific-critical-thinking/references/common_biases.md +364 -0
- package/bin/skills/scientific-critical-thinking/references/evidence_hierarchy.md +484 -0
- package/bin/skills/scientific-critical-thinking/references/experimental_design.md +496 -0
- package/bin/skills/scientific-critical-thinking/references/logical_fallacies.md +478 -0
- package/bin/skills/scientific-critical-thinking/references/scientific_method.md +169 -0
- package/bin/skills/scientific-critical-thinking/references/statistical_pitfalls.md +506 -0
- package/bin/skills/scientific-schematics/QUICK_REFERENCE.md +207 -0
- package/bin/skills/scientific-schematics/README.md +327 -0
- package/bin/skills/scientific-schematics/SKILL.md +615 -0
- package/bin/skills/scientific-schematics/example_usage.sh +89 -0
- package/bin/skills/scientific-schematics/references/best_practices.md +559 -0
- package/bin/skills/scientific-schematics/scripts/generate_schematic.py +135 -0
- package/bin/skills/scientific-schematics/scripts/generate_schematic_ai.py +807 -0
- package/bin/skills/scientific-schematics/test_ai_generation.py +243 -0
- package/bin/skills/scientific-slides/SKILL.md +942 -0
- package/bin/skills/scientific-slides/assets/timing_guidelines.md +597 -0
- package/bin/skills/scientific-slides/references/data_visualization_slides.md +708 -0
- package/bin/skills/scientific-slides/references/presentation_structure.md +642 -0
- package/bin/skills/scientific-slides/references/slide_design_principles.md +849 -0
- package/bin/skills/scientific-slides/references/talk_types_guide.md +687 -0
- package/bin/skills/scientific-slides/references/visual_review_workflow.md +775 -0
- package/bin/skills/scientific-slides/scripts/generate_slide_image.py +143 -0
- package/bin/skills/scientific-slides/scripts/generate_slide_image_ai.py +748 -0
- package/bin/skills/scientific-slides/scripts/pdf_to_images.py +201 -0
- package/bin/skills/scientific-slides/scripts/slides_to_pdf.py +220 -0
- package/bin/skills/scientific-slides/scripts/validate_presentation.py +367 -0
- package/bin/skills/scientific-writing/SKILL.md +714 -0
- package/bin/skills/scientific-writing/assets/REPORT_FORMATTING_GUIDE.md +574 -0
- package/bin/skills/scientific-writing/assets/scientific_report.sty +606 -0
- package/bin/skills/scientific-writing/assets/scientific_report_template.tex +449 -0
- package/bin/skills/scientific-writing/references/citation_styles.md +720 -0
- package/bin/skills/scientific-writing/references/figures_tables.md +806 -0
- package/bin/skills/scientific-writing/references/imrad_structure.md +686 -0
- package/bin/skills/scientific-writing/references/professional_report_formatting.md +664 -0
- package/bin/skills/scientific-writing/references/reporting_guidelines.md +748 -0
- package/bin/skills/scientific-writing/references/writing_principles.md +824 -0
- package/bin/skills/tinker/SKILL.md +2 -3
- package/bin/skills/together-ai/SKILL.md +722 -0
- package/bin/skills/treatment-plans/README.md +488 -0
- package/bin/skills/treatment-plans/SKILL.md +1579 -0
- package/bin/skills/treatment-plans/assets/STYLING_QUICK_REFERENCE.md +185 -0
- package/bin/skills/treatment-plans/assets/chronic_disease_management_plan.tex +665 -0
- package/bin/skills/treatment-plans/assets/general_medical_treatment_plan.tex +547 -0
- package/bin/skills/treatment-plans/assets/medical_treatment_plan.sty +222 -0
- package/bin/skills/treatment-plans/assets/mental_health_treatment_plan.tex +774 -0
- package/bin/skills/treatment-plans/assets/one_page_treatment_plan.tex +193 -0
- package/bin/skills/treatment-plans/assets/pain_management_plan.tex +799 -0
- package/bin/skills/treatment-plans/assets/perioperative_care_plan.tex +753 -0
- package/bin/skills/treatment-plans/assets/quality_checklist.md +471 -0
- package/bin/skills/treatment-plans/assets/rehabilitation_treatment_plan.tex +756 -0
- package/bin/skills/treatment-plans/references/goal_setting_frameworks.md +411 -0
- package/bin/skills/treatment-plans/references/intervention_guidelines.md +507 -0
- package/bin/skills/treatment-plans/references/regulatory_compliance.md +476 -0
- package/bin/skills/treatment-plans/references/specialty_specific_guidelines.md +655 -0
- package/bin/skills/treatment-plans/references/treatment_plan_standards.md +485 -0
- package/bin/skills/treatment-plans/scripts/check_completeness.py +322 -0
- package/bin/skills/treatment-plans/scripts/generate_template.py +233 -0
- package/bin/skills/treatment-plans/scripts/timeline_generator.py +385 -0
- package/bin/skills/treatment-plans/scripts/validate_treatment_plan.py +369 -0
- package/bin/skills/unsloth/SKILL.md +565 -47
- package/bin/skills/unsloth/docs/advanced-rl.md +222 -0
- package/bin/skills/unsloth/docs/chat-templates.md +141 -0
- package/bin/skills/unsloth/docs/datasets.md +489 -0
- package/bin/skills/unsloth/docs/docker-extended.md +99 -0
- package/bin/skills/unsloth/docs/dynamic-ggufs-2.0.md +116 -0
- package/bin/skills/unsloth/docs/dynamic-ggufs-aider.md +118 -0
- package/bin/skills/unsloth/docs/faq.md +91 -0
- package/bin/skills/unsloth/docs/fp16-vs-bf16.md +61 -0
- package/bin/skills/unsloth/docs/fp8-rl.md +224 -0
- package/bin/skills/unsloth/docs/glm-4.7-flash.md +997 -0
- package/bin/skills/unsloth/docs/inference-deployment-overview.md +17 -0
- package/bin/skills/unsloth/docs/inference.md +27 -0
- package/bin/skills/unsloth/docs/installation-docker.md +155 -0
- package/bin/skills/unsloth/docs/installation-pip.md +148 -0
- package/bin/skills/unsloth/docs/kernels-packing.md +190 -0
- package/bin/skills/unsloth/docs/kimi-k2.5.md +634 -0
- package/bin/skills/unsloth/docs/lm-studio.md +235 -0
- package/bin/skills/unsloth/docs/lora-hot-swapping.md +75 -0
- package/bin/skills/unsloth/docs/lora-hyperparameters.md +363 -0
- package/bin/skills/unsloth/docs/memory-efficient-rl.md +267 -0
- package/bin/skills/unsloth/docs/model-selection.md +70 -0
- package/bin/skills/unsloth/docs/models.md +532 -0
- package/bin/skills/unsloth/docs/multi-gpu-ddp.md +90 -0
- package/bin/skills/unsloth/docs/notebooks.md +223 -0
- package/bin/skills/unsloth/docs/overview.md +110 -0
- package/bin/skills/unsloth/docs/qwen3-coder-next-extended.md +900 -0
- package/bin/skills/unsloth/docs/qwen3-coder-next.md +900 -0
- package/bin/skills/unsloth/docs/requirements.md +45 -0
- package/bin/skills/unsloth/docs/reward-hacking.md +25 -0
- package/bin/skills/unsloth/docs/saving-to-gguf.md +138 -0
- package/bin/skills/unsloth/docs/saving-to-ollama.md +46 -0
- package/bin/skills/unsloth/docs/sglang-guide.md +278 -0
- package/bin/skills/unsloth/docs/speculative-decoding.md +70 -0
- package/bin/skills/unsloth/docs/tool-calling.md +334 -0
- package/bin/skills/unsloth/docs/troubleshooting-faq.md +204 -0
- package/bin/skills/unsloth/docs/troubleshooting-inference.md +26 -0
- package/bin/skills/unsloth/docs/tts-fine-tuning.md +149 -0
- package/bin/skills/unsloth/docs/tutorial-grpo.md +273 -0
- package/bin/skills/unsloth/docs/tutorial-llama3-ollama.md +356 -0
- package/bin/skills/unsloth/docs/vision-fine-tuning.md +135 -0
- package/bin/skills/unsloth/docs/vision-rl.md +170 -0
- package/bin/skills/unsloth/docs/vllm-engine-arguments.md +43 -0
- package/bin/skills/unsloth/docs/vllm-guide.md +98 -0
- package/bin/skills/venue-templates/SKILL.md +686 -0
- package/bin/skills/venue-templates/assets/examples/cell_summary_example.md +247 -0
- package/bin/skills/venue-templates/assets/examples/medical_structured_abstract.md +313 -0
- package/bin/skills/venue-templates/assets/examples/nature_abstract_examples.md +213 -0
- package/bin/skills/venue-templates/assets/examples/neurips_introduction_example.md +245 -0
- package/bin/skills/venue-templates/assets/grants/nih_specific_aims.tex +235 -0
- package/bin/skills/venue-templates/assets/grants/nsf_proposal_template.tex +375 -0
- package/bin/skills/venue-templates/assets/journals/nature_article.tex +171 -0
- package/bin/skills/venue-templates/assets/journals/neurips_article.tex +283 -0
- package/bin/skills/venue-templates/assets/journals/plos_one.tex +317 -0
- package/bin/skills/venue-templates/assets/posters/beamerposter_academic.tex +311 -0
- package/bin/skills/venue-templates/references/cell_press_style.md +483 -0
- package/bin/skills/venue-templates/references/conferences_formatting.md +564 -0
- package/bin/skills/venue-templates/references/cs_conference_style.md +463 -0
- package/bin/skills/venue-templates/references/grants_requirements.md +787 -0
- package/bin/skills/venue-templates/references/journals_formatting.md +486 -0
- package/bin/skills/venue-templates/references/medical_journal_styles.md +535 -0
- package/bin/skills/venue-templates/references/ml_conference_style.md +556 -0
- package/bin/skills/venue-templates/references/nature_science_style.md +405 -0
- package/bin/skills/venue-templates/references/posters_guidelines.md +628 -0
- package/bin/skills/venue-templates/references/reviewer_expectations.md +417 -0
- package/bin/skills/venue-templates/references/venue_writing_styles.md +321 -0
- package/bin/skills/venue-templates/scripts/customize_template.py +195 -0
- package/bin/skills/venue-templates/scripts/query_template.py +266 -0
- package/bin/skills/venue-templates/scripts/validate_format.py +250 -0
- package/bin/synsc +0 -0
- package/package.json +1 -1
- package/bin/skills/unsloth/references/index.md +0 -7
- package/bin/skills/unsloth/references/llms-full.md +0 -16799
- package/bin/skills/unsloth/references/llms-txt.md +0 -12044
- package/bin/skills/unsloth/references/llms.md +0 -82
|
@@ -0,0 +1,494 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
"""
|
|
3
|
+
Citation Validation Tool
|
|
4
|
+
Validate BibTeX files for accuracy, completeness, and format compliance.
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
import argparse
|
|
8
|
+
import json
|
|
9
|
+
import re
|
|
10
|
+
import sys
|
|
11
|
+
from collections import defaultdict
|
|
12
|
+
from typing import Dict, List, Optional, Tuple
|
|
13
|
+
|
|
14
|
+
import requests
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
class CitationValidator:
|
|
18
|
+
"""Validate BibTeX entries for errors and inconsistencies."""
|
|
19
|
+
|
|
20
|
+
def __init__(self):
|
|
21
|
+
self.session = requests.Session()
|
|
22
|
+
self.session.headers.update({'User-Agent': 'CitationValidator/1.0 (Citation Management Tool)'})
|
|
23
|
+
|
|
24
|
+
# Required fields by entry type
|
|
25
|
+
self.required_fields = {
|
|
26
|
+
'article': ['author', 'title', 'journal', 'year'],
|
|
27
|
+
'book': ['title', 'publisher', 'year'], # author OR editor
|
|
28
|
+
'inproceedings': ['author', 'title', 'booktitle', 'year'],
|
|
29
|
+
'incollection': ['author', 'title', 'booktitle', 'publisher', 'year'],
|
|
30
|
+
'phdthesis': ['author', 'title', 'school', 'year'],
|
|
31
|
+
'mastersthesis': ['author', 'title', 'school', 'year'],
|
|
32
|
+
'techreport': ['author', 'title', 'institution', 'year'],
|
|
33
|
+
'misc': ['title', 'year'],
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
# Recommended fields
|
|
37
|
+
self.recommended_fields = {
|
|
38
|
+
'article': ['volume', 'pages', 'doi'],
|
|
39
|
+
'book': ['isbn'],
|
|
40
|
+
'inproceedings': ['pages'],
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
def parse_bibtex_file(self, filepath: str) -> List[Dict]:
|
|
44
|
+
"""
|
|
45
|
+
Parse BibTeX file and extract entries.
|
|
46
|
+
|
|
47
|
+
Args:
|
|
48
|
+
filepath: Path to BibTeX file
|
|
49
|
+
|
|
50
|
+
Returns:
|
|
51
|
+
List of entry dictionaries
|
|
52
|
+
"""
|
|
53
|
+
try:
|
|
54
|
+
with open(filepath, 'r', encoding='utf-8') as f:
|
|
55
|
+
content = f.read()
|
|
56
|
+
except Exception as e:
|
|
57
|
+
print(f'Error reading file: {e}', file=sys.stderr)
|
|
58
|
+
return []
|
|
59
|
+
|
|
60
|
+
entries = []
|
|
61
|
+
|
|
62
|
+
# Match BibTeX entries
|
|
63
|
+
pattern = r'@(\w+)\s*\{\s*([^,\s]+)\s*,(.*?)\n\}'
|
|
64
|
+
matches = re.finditer(pattern, content, re.DOTALL | re.IGNORECASE)
|
|
65
|
+
|
|
66
|
+
for match in matches:
|
|
67
|
+
entry_type = match.group(1).lower()
|
|
68
|
+
citation_key = match.group(2).strip()
|
|
69
|
+
fields_text = match.group(3)
|
|
70
|
+
|
|
71
|
+
# Parse fields
|
|
72
|
+
fields = {}
|
|
73
|
+
field_pattern = r'(\w+)\s*=\s*\{([^}]*)\}|(\w+)\s*=\s*"([^"]*)"'
|
|
74
|
+
field_matches = re.finditer(field_pattern, fields_text)
|
|
75
|
+
|
|
76
|
+
for field_match in field_matches:
|
|
77
|
+
if field_match.group(1):
|
|
78
|
+
field_name = field_match.group(1).lower()
|
|
79
|
+
field_value = field_match.group(2)
|
|
80
|
+
else:
|
|
81
|
+
field_name = field_match.group(3).lower()
|
|
82
|
+
field_value = field_match.group(4)
|
|
83
|
+
|
|
84
|
+
fields[field_name] = field_value.strip()
|
|
85
|
+
|
|
86
|
+
entries.append({'type': entry_type, 'key': citation_key, 'fields': fields, 'raw': match.group(0)})
|
|
87
|
+
|
|
88
|
+
return entries
|
|
89
|
+
|
|
90
|
+
def validate_entry(self, entry: Dict) -> Tuple[List[Dict], List[Dict]]:
|
|
91
|
+
"""
|
|
92
|
+
Validate a single BibTeX entry.
|
|
93
|
+
|
|
94
|
+
Args:
|
|
95
|
+
entry: Entry dictionary
|
|
96
|
+
|
|
97
|
+
Returns:
|
|
98
|
+
Tuple of (errors, warnings)
|
|
99
|
+
"""
|
|
100
|
+
errors = []
|
|
101
|
+
warnings = []
|
|
102
|
+
|
|
103
|
+
entry_type = entry['type']
|
|
104
|
+
key = entry['key']
|
|
105
|
+
fields = entry['fields']
|
|
106
|
+
|
|
107
|
+
# Check required fields
|
|
108
|
+
if entry_type in self.required_fields:
|
|
109
|
+
for req_field in self.required_fields[entry_type]:
|
|
110
|
+
if req_field not in fields or not fields[req_field]:
|
|
111
|
+
# Special case: book can have author OR editor
|
|
112
|
+
if entry_type == 'book' and req_field == 'author':
|
|
113
|
+
if 'editor' not in fields or not fields['editor']:
|
|
114
|
+
errors.append(
|
|
115
|
+
{
|
|
116
|
+
'type': 'missing_required_field',
|
|
117
|
+
'field': 'author or editor',
|
|
118
|
+
'severity': 'high',
|
|
119
|
+
'message': f'Entry {key}: Missing required field "author" or "editor"',
|
|
120
|
+
}
|
|
121
|
+
)
|
|
122
|
+
else:
|
|
123
|
+
errors.append(
|
|
124
|
+
{
|
|
125
|
+
'type': 'missing_required_field',
|
|
126
|
+
'field': req_field,
|
|
127
|
+
'severity': 'high',
|
|
128
|
+
'message': f'Entry {key}: Missing required field "{req_field}"',
|
|
129
|
+
}
|
|
130
|
+
)
|
|
131
|
+
|
|
132
|
+
# Check recommended fields
|
|
133
|
+
if entry_type in self.recommended_fields:
|
|
134
|
+
for rec_field in self.recommended_fields[entry_type]:
|
|
135
|
+
if rec_field not in fields or not fields[rec_field]:
|
|
136
|
+
warnings.append(
|
|
137
|
+
{
|
|
138
|
+
'type': 'missing_recommended_field',
|
|
139
|
+
'field': rec_field,
|
|
140
|
+
'severity': 'medium',
|
|
141
|
+
'message': f'Entry {key}: Missing recommended field "{rec_field}"',
|
|
142
|
+
}
|
|
143
|
+
)
|
|
144
|
+
|
|
145
|
+
# Validate year
|
|
146
|
+
if 'year' in fields:
|
|
147
|
+
year = fields['year']
|
|
148
|
+
if not re.match(r'^\d{4}$', year):
|
|
149
|
+
errors.append(
|
|
150
|
+
{
|
|
151
|
+
'type': 'invalid_year',
|
|
152
|
+
'field': 'year',
|
|
153
|
+
'value': year,
|
|
154
|
+
'severity': 'high',
|
|
155
|
+
'message': f'Entry {key}: Invalid year format "{year}" (should be 4 digits)',
|
|
156
|
+
}
|
|
157
|
+
)
|
|
158
|
+
elif int(year) < 1600 or int(year) > 2030:
|
|
159
|
+
warnings.append(
|
|
160
|
+
{
|
|
161
|
+
'type': 'suspicious_year',
|
|
162
|
+
'field': 'year',
|
|
163
|
+
'value': year,
|
|
164
|
+
'severity': 'medium',
|
|
165
|
+
'message': f'Entry {key}: Suspicious year "{year}" (outside reasonable range)',
|
|
166
|
+
}
|
|
167
|
+
)
|
|
168
|
+
|
|
169
|
+
# Validate DOI format
|
|
170
|
+
if 'doi' in fields:
|
|
171
|
+
doi = fields['doi']
|
|
172
|
+
if not re.match(r'^10\.\d{4,}/[^\s]+$', doi):
|
|
173
|
+
warnings.append(
|
|
174
|
+
{
|
|
175
|
+
'type': 'invalid_doi_format',
|
|
176
|
+
'field': 'doi',
|
|
177
|
+
'value': doi,
|
|
178
|
+
'severity': 'medium',
|
|
179
|
+
'message': f'Entry {key}: Invalid DOI format "{doi}"',
|
|
180
|
+
}
|
|
181
|
+
)
|
|
182
|
+
|
|
183
|
+
# Check for single hyphen in pages (should be --)
|
|
184
|
+
if 'pages' in fields:
|
|
185
|
+
pages = fields['pages']
|
|
186
|
+
if re.search(r'\d-\d', pages) and '--' not in pages:
|
|
187
|
+
warnings.append(
|
|
188
|
+
{
|
|
189
|
+
'type': 'page_range_format',
|
|
190
|
+
'field': 'pages',
|
|
191
|
+
'value': pages,
|
|
192
|
+
'severity': 'low',
|
|
193
|
+
'message': f'Entry {key}: Page range uses single hyphen, should use -- (en-dash)',
|
|
194
|
+
}
|
|
195
|
+
)
|
|
196
|
+
|
|
197
|
+
# Check author format
|
|
198
|
+
if 'author' in fields:
|
|
199
|
+
author = fields['author']
|
|
200
|
+
if ';' in author or '&' in author:
|
|
201
|
+
errors.append(
|
|
202
|
+
{
|
|
203
|
+
'type': 'invalid_author_format',
|
|
204
|
+
'field': 'author',
|
|
205
|
+
'severity': 'high',
|
|
206
|
+
'message': f'Entry {key}: Authors should be separated by " and ", not ";" or "&"',
|
|
207
|
+
}
|
|
208
|
+
)
|
|
209
|
+
|
|
210
|
+
return errors, warnings
|
|
211
|
+
|
|
212
|
+
def verify_doi(self, doi: str) -> Tuple[bool, Optional[Dict]]:
|
|
213
|
+
"""
|
|
214
|
+
Verify DOI resolves correctly and get metadata.
|
|
215
|
+
|
|
216
|
+
Args:
|
|
217
|
+
doi: Digital Object Identifier
|
|
218
|
+
|
|
219
|
+
Returns:
|
|
220
|
+
Tuple of (is_valid, metadata)
|
|
221
|
+
"""
|
|
222
|
+
try:
|
|
223
|
+
url = f'https://doi.org/{doi}'
|
|
224
|
+
response = self.session.head(url, timeout=10, allow_redirects=True)
|
|
225
|
+
|
|
226
|
+
if response.status_code < 400:
|
|
227
|
+
# DOI resolves, now get metadata from CrossRef
|
|
228
|
+
crossref_url = f'https://api.crossref.org/works/{doi}'
|
|
229
|
+
metadata_response = self.session.get(crossref_url, timeout=10)
|
|
230
|
+
|
|
231
|
+
if metadata_response.status_code == 200:
|
|
232
|
+
data = metadata_response.json()
|
|
233
|
+
message = data.get('message', {})
|
|
234
|
+
|
|
235
|
+
# Extract key metadata
|
|
236
|
+
metadata = {
|
|
237
|
+
'title': message.get('title', [''])[0],
|
|
238
|
+
'year': self._extract_year_crossref(message),
|
|
239
|
+
'authors': self._format_authors_crossref(message.get('author', [])),
|
|
240
|
+
}
|
|
241
|
+
return True, metadata
|
|
242
|
+
else:
|
|
243
|
+
return True, None # DOI resolves but no CrossRef metadata
|
|
244
|
+
else:
|
|
245
|
+
return False, None
|
|
246
|
+
|
|
247
|
+
except Exception:
|
|
248
|
+
return False, None
|
|
249
|
+
|
|
250
|
+
def detect_duplicates(self, entries: List[Dict]) -> List[Dict]:
|
|
251
|
+
"""
|
|
252
|
+
Detect duplicate entries.
|
|
253
|
+
|
|
254
|
+
Args:
|
|
255
|
+
entries: List of entry dictionaries
|
|
256
|
+
|
|
257
|
+
Returns:
|
|
258
|
+
List of duplicate groups
|
|
259
|
+
"""
|
|
260
|
+
duplicates = []
|
|
261
|
+
|
|
262
|
+
# Check for duplicate DOIs
|
|
263
|
+
doi_map = defaultdict(list)
|
|
264
|
+
for entry in entries:
|
|
265
|
+
doi = entry['fields'].get('doi', '').strip()
|
|
266
|
+
if doi:
|
|
267
|
+
doi_map[doi].append(entry['key'])
|
|
268
|
+
|
|
269
|
+
for doi, keys in doi_map.items():
|
|
270
|
+
if len(keys) > 1:
|
|
271
|
+
duplicates.append(
|
|
272
|
+
{
|
|
273
|
+
'type': 'duplicate_doi',
|
|
274
|
+
'doi': doi,
|
|
275
|
+
'entries': keys,
|
|
276
|
+
'severity': 'high',
|
|
277
|
+
'message': f'Duplicate DOI {doi} found in entries: {", ".join(keys)}',
|
|
278
|
+
}
|
|
279
|
+
)
|
|
280
|
+
|
|
281
|
+
# Check for duplicate citation keys
|
|
282
|
+
key_counts = defaultdict(int)
|
|
283
|
+
for entry in entries:
|
|
284
|
+
key_counts[entry['key']] += 1
|
|
285
|
+
|
|
286
|
+
for key, count in key_counts.items():
|
|
287
|
+
if count > 1:
|
|
288
|
+
duplicates.append(
|
|
289
|
+
{
|
|
290
|
+
'type': 'duplicate_key',
|
|
291
|
+
'key': key,
|
|
292
|
+
'count': count,
|
|
293
|
+
'severity': 'high',
|
|
294
|
+
'message': f'Citation key "{key}" appears {count} times',
|
|
295
|
+
}
|
|
296
|
+
)
|
|
297
|
+
|
|
298
|
+
# Check for similar titles (possible duplicates)
|
|
299
|
+
titles = {}
|
|
300
|
+
for entry in entries:
|
|
301
|
+
title = entry['fields'].get('title', '').lower()
|
|
302
|
+
title = re.sub(r'[^\w\s]', '', title) # Remove punctuation
|
|
303
|
+
title = ' '.join(title.split()) # Normalize whitespace
|
|
304
|
+
|
|
305
|
+
if title:
|
|
306
|
+
if title in titles:
|
|
307
|
+
duplicates.append(
|
|
308
|
+
{
|
|
309
|
+
'type': 'similar_title',
|
|
310
|
+
'entries': [titles[title], entry['key']],
|
|
311
|
+
'severity': 'medium',
|
|
312
|
+
'message': f'Possible duplicate: "{titles[title]}" and "{entry["key"]}" have identical titles',
|
|
313
|
+
}
|
|
314
|
+
)
|
|
315
|
+
else:
|
|
316
|
+
titles[title] = entry['key']
|
|
317
|
+
|
|
318
|
+
return duplicates
|
|
319
|
+
|
|
320
|
+
def validate_file(self, filepath: str, check_dois: bool = False) -> Dict:
|
|
321
|
+
"""
|
|
322
|
+
Validate entire BibTeX file.
|
|
323
|
+
|
|
324
|
+
Args:
|
|
325
|
+
filepath: Path to BibTeX file
|
|
326
|
+
check_dois: Whether to verify DOIs (slow)
|
|
327
|
+
|
|
328
|
+
Returns:
|
|
329
|
+
Validation report dictionary
|
|
330
|
+
"""
|
|
331
|
+
print(f'Parsing {filepath}...', file=sys.stderr)
|
|
332
|
+
entries = self.parse_bibtex_file(filepath)
|
|
333
|
+
|
|
334
|
+
if not entries:
|
|
335
|
+
return {'total_entries': 0, 'errors': [], 'warnings': [], 'duplicates': []}
|
|
336
|
+
|
|
337
|
+
print(f'Found {len(entries)} entries', file=sys.stderr)
|
|
338
|
+
|
|
339
|
+
all_errors = []
|
|
340
|
+
all_warnings = []
|
|
341
|
+
|
|
342
|
+
# Validate each entry
|
|
343
|
+
for i, entry in enumerate(entries):
|
|
344
|
+
print(f'Validating entry {i + 1}/{len(entries)}: {entry["key"]}', file=sys.stderr)
|
|
345
|
+
errors, warnings = self.validate_entry(entry)
|
|
346
|
+
|
|
347
|
+
for error in errors:
|
|
348
|
+
error['entry'] = entry['key']
|
|
349
|
+
all_errors.append(error)
|
|
350
|
+
|
|
351
|
+
for warning in warnings:
|
|
352
|
+
warning['entry'] = entry['key']
|
|
353
|
+
all_warnings.append(warning)
|
|
354
|
+
|
|
355
|
+
# Check for duplicates
|
|
356
|
+
print('Checking for duplicates...', file=sys.stderr)
|
|
357
|
+
duplicates = self.detect_duplicates(entries)
|
|
358
|
+
|
|
359
|
+
# Verify DOIs if requested
|
|
360
|
+
doi_errors = []
|
|
361
|
+
if check_dois:
|
|
362
|
+
print('Verifying DOIs...', file=sys.stderr)
|
|
363
|
+
for i, entry in enumerate(entries):
|
|
364
|
+
doi = entry['fields'].get('doi', '')
|
|
365
|
+
if doi:
|
|
366
|
+
print(f'Verifying DOI {i + 1}: {doi}', file=sys.stderr)
|
|
367
|
+
is_valid, metadata = self.verify_doi(doi)
|
|
368
|
+
|
|
369
|
+
if not is_valid:
|
|
370
|
+
doi_errors.append(
|
|
371
|
+
{
|
|
372
|
+
'type': 'invalid_doi',
|
|
373
|
+
'entry': entry['key'],
|
|
374
|
+
'doi': doi,
|
|
375
|
+
'severity': 'high',
|
|
376
|
+
'message': f'Entry {entry["key"]}: DOI does not resolve: {doi}',
|
|
377
|
+
}
|
|
378
|
+
)
|
|
379
|
+
|
|
380
|
+
all_errors.extend(doi_errors)
|
|
381
|
+
|
|
382
|
+
return {
|
|
383
|
+
'filepath': filepath,
|
|
384
|
+
'total_entries': len(entries),
|
|
385
|
+
'valid_entries': len(entries) - len([e for e in all_errors if e['severity'] == 'high']),
|
|
386
|
+
'errors': all_errors,
|
|
387
|
+
'warnings': all_warnings,
|
|
388
|
+
'duplicates': duplicates,
|
|
389
|
+
}
|
|
390
|
+
|
|
391
|
+
def _extract_year_crossref(self, message: Dict) -> str:
|
|
392
|
+
"""Extract year from CrossRef message."""
|
|
393
|
+
date_parts = message.get('published-print', {}).get('date-parts', [[]])
|
|
394
|
+
if not date_parts or not date_parts[0]:
|
|
395
|
+
date_parts = message.get('published-online', {}).get('date-parts', [[]])
|
|
396
|
+
|
|
397
|
+
if date_parts and date_parts[0]:
|
|
398
|
+
return str(date_parts[0][0])
|
|
399
|
+
return ''
|
|
400
|
+
|
|
401
|
+
def _format_authors_crossref(self, authors: List[Dict]) -> str:
|
|
402
|
+
"""Format author list from CrossRef."""
|
|
403
|
+
if not authors:
|
|
404
|
+
return ''
|
|
405
|
+
|
|
406
|
+
formatted = []
|
|
407
|
+
for author in authors[:3]: # First 3 authors
|
|
408
|
+
given = author.get('given', '')
|
|
409
|
+
family = author.get('family', '')
|
|
410
|
+
if family:
|
|
411
|
+
formatted.append(f'{family}, {given}' if given else family)
|
|
412
|
+
|
|
413
|
+
if len(authors) > 3:
|
|
414
|
+
formatted.append('et al.')
|
|
415
|
+
|
|
416
|
+
return ', '.join(formatted)
|
|
417
|
+
|
|
418
|
+
|
|
419
|
+
def main():
|
|
420
|
+
"""Command-line interface."""
|
|
421
|
+
parser = argparse.ArgumentParser(
|
|
422
|
+
description='Validate BibTeX files for errors and inconsistencies',
|
|
423
|
+
epilog='Example: python validate_citations.py references.bib',
|
|
424
|
+
)
|
|
425
|
+
|
|
426
|
+
parser.add_argument('file', help='BibTeX file to validate')
|
|
427
|
+
|
|
428
|
+
parser.add_argument('--check-dois', action='store_true', help='Verify DOIs resolve correctly (slow)')
|
|
429
|
+
|
|
430
|
+
parser.add_argument(
|
|
431
|
+
'--auto-fix', action='store_true', help='Attempt to auto-fix common issues (not implemented yet)'
|
|
432
|
+
)
|
|
433
|
+
|
|
434
|
+
parser.add_argument('--report', help='Output file for JSON validation report')
|
|
435
|
+
|
|
436
|
+
parser.add_argument('--verbose', action='store_true', help='Show detailed output')
|
|
437
|
+
|
|
438
|
+
args = parser.parse_args()
|
|
439
|
+
|
|
440
|
+
# Validate file
|
|
441
|
+
validator = CitationValidator()
|
|
442
|
+
report = validator.validate_file(args.file, check_dois=args.check_dois)
|
|
443
|
+
|
|
444
|
+
# Print summary
|
|
445
|
+
print('\n' + '=' * 60)
|
|
446
|
+
print('CITATION VALIDATION REPORT')
|
|
447
|
+
print('=' * 60)
|
|
448
|
+
print(f'\nFile: {args.file}')
|
|
449
|
+
print(f'Total entries: {report["total_entries"]}')
|
|
450
|
+
print(f'Valid entries: {report["valid_entries"]}')
|
|
451
|
+
print(f'Errors: {len(report["errors"])}')
|
|
452
|
+
print(f'Warnings: {len(report["warnings"])}')
|
|
453
|
+
print(f'Duplicates: {len(report["duplicates"])}')
|
|
454
|
+
|
|
455
|
+
# Print errors
|
|
456
|
+
if report['errors']:
|
|
457
|
+
print('\n' + '-' * 60)
|
|
458
|
+
print('ERRORS (must fix):')
|
|
459
|
+
print('-' * 60)
|
|
460
|
+
for error in report['errors']:
|
|
461
|
+
print(f'\n{error["message"]}')
|
|
462
|
+
if args.verbose:
|
|
463
|
+
print(f' Type: {error["type"]}')
|
|
464
|
+
print(f' Severity: {error["severity"]}')
|
|
465
|
+
|
|
466
|
+
# Print warnings
|
|
467
|
+
if report['warnings'] and args.verbose:
|
|
468
|
+
print('\n' + '-' * 60)
|
|
469
|
+
print('WARNINGS (should fix):')
|
|
470
|
+
print('-' * 60)
|
|
471
|
+
for warning in report['warnings']:
|
|
472
|
+
print(f'\n{warning["message"]}')
|
|
473
|
+
|
|
474
|
+
# Print duplicates
|
|
475
|
+
if report['duplicates']:
|
|
476
|
+
print('\n' + '-' * 60)
|
|
477
|
+
print('DUPLICATES:')
|
|
478
|
+
print('-' * 60)
|
|
479
|
+
for dup in report['duplicates']:
|
|
480
|
+
print(f'\n{dup["message"]}')
|
|
481
|
+
|
|
482
|
+
# Save report
|
|
483
|
+
if args.report:
|
|
484
|
+
with open(args.report, 'w', encoding='utf-8') as f:
|
|
485
|
+
json.dump(report, f, indent=2)
|
|
486
|
+
print(f'\nDetailed report saved to: {args.report}')
|
|
487
|
+
|
|
488
|
+
# Exit with error code if there are errors
|
|
489
|
+
if report['errors']:
|
|
490
|
+
sys.exit(1)
|
|
491
|
+
|
|
492
|
+
|
|
493
|
+
if __name__ == '__main__':
|
|
494
|
+
main()
|
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
# Clinical Decision Support Skill
|
|
2
|
+
|
|
3
|
+
Professional clinical decision support documents for medical professionals in pharmaceutical and clinical research settings.
|
|
4
|
+
|
|
5
|
+
## Quick Start
|
|
6
|
+
|
|
7
|
+
This skill enables generation of three types of clinical documents:
|
|
8
|
+
|
|
9
|
+
1. **Individual Patient Treatment Plans** - Personalized protocols for specific patients
|
|
10
|
+
2. **Patient Cohort Analysis** - Biomarker-stratified group analyses with outcomes
|
|
11
|
+
3. **Treatment Recommendation Reports** - Evidence-based clinical guidelines
|
|
12
|
+
|
|
13
|
+
All documents are generated as compact, professional LaTeX/PDF files.
|
|
14
|
+
|
|
15
|
+
## Directory Structure
|
|
16
|
+
|
|
17
|
+
```
|
|
18
|
+
clinical-decision-support/
|
|
19
|
+
├── SKILL.md # Main skill definition
|
|
20
|
+
├── README.md # This file
|
|
21
|
+
│
|
|
22
|
+
├── references/ # Clinical guidance documents
|
|
23
|
+
│ ├── patient_cohort_analysis.md
|
|
24
|
+
│ ├── treatment_recommendations.md
|
|
25
|
+
│ ├── clinical_decision_algorithms.md
|
|
26
|
+
│ ├── biomarker_classification.md
|
|
27
|
+
│ ├── outcome_analysis.md
|
|
28
|
+
│ └── evidence_synthesis.md
|
|
29
|
+
│
|
|
30
|
+
├── assets/ # Templates and examples
|
|
31
|
+
│ ├── cohort_analysis_template.tex
|
|
32
|
+
│ ├── treatment_recommendation_template.tex
|
|
33
|
+
│ ├── clinical_pathway_template.tex
|
|
34
|
+
│ ├── biomarker_report_template.tex
|
|
35
|
+
│ ├── example_gbm_cohort.md
|
|
36
|
+
│ ├── recommendation_strength_guide.md
|
|
37
|
+
│ └── color_schemes.tex
|
|
38
|
+
│
|
|
39
|
+
└── scripts/ # Analysis and generation tools
|
|
40
|
+
├── generate_survival_analysis.py
|
|
41
|
+
├── create_cohort_tables.py
|
|
42
|
+
├── build_decision_tree.py
|
|
43
|
+
├── biomarker_classifier.py
|
|
44
|
+
└── validate_cds_document.py
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
## Example Use Cases
|
|
48
|
+
|
|
49
|
+
### Create a Patient Cohort Analysis
|
|
50
|
+
```
|
|
51
|
+
> Analyze a cohort of 45 NSCLC patients stratified by PD-L1 expression
|
|
52
|
+
(<1%, 1-49%, ≥50%) including ORR, PFS, and OS outcomes
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
### Generate Treatment Recommendations
|
|
56
|
+
```
|
|
57
|
+
> Create evidence-based treatment recommendations for HER2-positive
|
|
58
|
+
metastatic breast cancer with GRADE methodology
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
### Build Clinical Pathway
|
|
62
|
+
```
|
|
63
|
+
> Generate a clinical decision algorithm for acute chest pain
|
|
64
|
+
management with TIMI risk score
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
## Key Features
|
|
68
|
+
|
|
69
|
+
- **GRADE Methodology**: Evidence quality grading (High/Moderate/Low/Very Low)
|
|
70
|
+
- **Recommendation Strength**: Strong (Grade 1) vs Conditional (Grade 2)
|
|
71
|
+
- **Biomarker Integration**: Genomic, expression, and molecular subtype classification
|
|
72
|
+
- **Statistical Analysis**: Kaplan-Meier, Cox regression, log-rank tests
|
|
73
|
+
- **Guideline Concordance**: NCCN, ASCO, ESMO, AHA/ACC integration
|
|
74
|
+
- **Professional Output**: 0.5in margins, color-coded boxes, publication-ready
|
|
75
|
+
|
|
76
|
+
## Dependencies
|
|
77
|
+
|
|
78
|
+
Python scripts require:
|
|
79
|
+
- `pandas`, `numpy`, `scipy`: Data analysis and statistics
|
|
80
|
+
- `lifelines`: Survival analysis (Kaplan-Meier, Cox regression)
|
|
81
|
+
- `matplotlib`: Visualization
|
|
82
|
+
- `pyyaml` (optional): YAML input for decision trees
|
|
83
|
+
|
|
84
|
+
Install with:
|
|
85
|
+
```bash
|
|
86
|
+
pip install pandas numpy scipy lifelines matplotlib pyyaml
|
|
87
|
+
```
|
|
88
|
+
|
|
89
|
+
## References Included
|
|
90
|
+
|
|
91
|
+
1. **Patient Cohort Analysis**: Stratification methods, biomarker correlations, statistical comparisons
|
|
92
|
+
2. **Treatment Recommendations**: Evidence grading, treatment sequencing, special populations
|
|
93
|
+
3. **Clinical Decision Algorithms**: Risk scores, decision trees, TikZ flowcharts
|
|
94
|
+
4. **Biomarker Classification**: Genomic alterations, molecular subtypes, companion diagnostics
|
|
95
|
+
5. **Outcome Analysis**: Survival methods, response criteria (RECIST), effect sizes
|
|
96
|
+
6. **Evidence Synthesis**: Guideline integration, systematic reviews, meta-analysis
|
|
97
|
+
|
|
98
|
+
## Templates Provided
|
|
99
|
+
|
|
100
|
+
1. **Cohort Analysis**: Demographics table, biomarker profile, outcomes, statistics, recommendations
|
|
101
|
+
2. **Treatment Recommendations**: Evidence review, GRADE-graded options, monitoring, decision algorithm
|
|
102
|
+
3. **Clinical Pathway**: TikZ flowchart with risk stratification and urgency-coded actions
|
|
103
|
+
4. **Biomarker Report**: Genomic profiling with tier-based actionability and therapy matching
|
|
104
|
+
|
|
105
|
+
## Scripts Included
|
|
106
|
+
|
|
107
|
+
1. **`generate_survival_analysis.py`**: Create Kaplan-Meier curves with hazard ratios
|
|
108
|
+
2. **`create_cohort_tables.py`**: Generate baseline, efficacy, and safety tables
|
|
109
|
+
3. **`build_decision_tree.py`**: Convert text/JSON to TikZ flowcharts
|
|
110
|
+
4. **`biomarker_classifier.py`**: Stratify patients by PD-L1, HER2, molecular subtypes
|
|
111
|
+
5. **`validate_cds_document.py`**: Quality checks for completeness and compliance
|
|
112
|
+
|
|
113
|
+
## Integration
|
|
114
|
+
|
|
115
|
+
Integrates with existing skills:
|
|
116
|
+
- **scientific-writing**: Citation management, statistical reporting
|
|
117
|
+
- **clinical-reports**: Medical terminology, HIPAA compliance
|
|
118
|
+
- **scientific-schematics**: TikZ flowcharts
|
|
119
|
+
|
|
120
|
+
## Version
|
|
121
|
+
|
|
122
|
+
Version 1.0 - Initial release
|
|
123
|
+
Created: November 2024
|
|
124
|
+
Last Updated: November 5, 2024
|
|
125
|
+
|
|
126
|
+
## Questions or Feedback
|
|
127
|
+
|
|
128
|
+
This skill was designed for pharmaceutical and clinical research professionals creating clinical decision support documents. For questions about usage or suggestions for improvements, contact the Scientific Writer development team.
|
|
129
|
+
|