scientific-writer 2.1.1__py3-none-any.whl → 2.2.2__py3-none-any.whl
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.
Potentially problematic release.
This version of scientific-writer might be problematic. Click here for more details.
- scientific_writer/.claude/settings.local.json +30 -0
- scientific_writer/.claude/skills/citation-management/SKILL.md +1046 -0
- scientific_writer/.claude/skills/citation-management/assets/bibtex_template.bib +264 -0
- scientific_writer/.claude/skills/citation-management/assets/citation_checklist.md +386 -0
- scientific_writer/.claude/skills/citation-management/references/bibtex_formatting.md +908 -0
- scientific_writer/.claude/skills/citation-management/references/citation_validation.md +794 -0
- scientific_writer/.claude/skills/citation-management/references/google_scholar_search.md +725 -0
- scientific_writer/.claude/skills/citation-management/references/metadata_extraction.md +870 -0
- scientific_writer/.claude/skills/citation-management/references/pubmed_search.md +839 -0
- scientific_writer/.claude/skills/citation-management/scripts/doi_to_bibtex.py +204 -0
- scientific_writer/.claude/skills/citation-management/scripts/extract_metadata.py +569 -0
- scientific_writer/.claude/skills/citation-management/scripts/format_bibtex.py +349 -0
- scientific_writer/.claude/skills/citation-management/scripts/search_google_scholar.py +282 -0
- scientific_writer/.claude/skills/citation-management/scripts/search_pubmed.py +398 -0
- scientific_writer/.claude/skills/citation-management/scripts/validate_citations.py +497 -0
- scientific_writer/.claude/skills/clinical-reports/IMPLEMENTATION_SUMMARY.md +641 -0
- scientific_writer/.claude/skills/clinical-reports/README.md +236 -0
- scientific_writer/.claude/skills/clinical-reports/SKILL.md +1088 -0
- scientific_writer/.claude/skills/clinical-reports/assets/case_report_template.md +352 -0
- scientific_writer/.claude/skills/clinical-reports/assets/clinical_trial_csr_template.md +353 -0
- scientific_writer/.claude/skills/clinical-reports/assets/clinical_trial_sae_template.md +359 -0
- scientific_writer/.claude/skills/clinical-reports/assets/consult_note_template.md +305 -0
- scientific_writer/.claude/skills/clinical-reports/assets/discharge_summary_template.md +453 -0
- scientific_writer/.claude/skills/clinical-reports/assets/hipaa_compliance_checklist.md +395 -0
- scientific_writer/.claude/skills/clinical-reports/assets/history_physical_template.md +305 -0
- scientific_writer/.claude/skills/clinical-reports/assets/lab_report_template.md +309 -0
- scientific_writer/.claude/skills/clinical-reports/assets/pathology_report_template.md +249 -0
- scientific_writer/.claude/skills/clinical-reports/assets/quality_checklist.md +338 -0
- scientific_writer/.claude/skills/clinical-reports/assets/radiology_report_template.md +318 -0
- scientific_writer/.claude/skills/clinical-reports/assets/soap_note_template.md +253 -0
- scientific_writer/.claude/skills/clinical-reports/references/case_report_guidelines.md +570 -0
- scientific_writer/.claude/skills/clinical-reports/references/clinical_trial_reporting.md +693 -0
- scientific_writer/.claude/skills/clinical-reports/references/data_presentation.md +530 -0
- scientific_writer/.claude/skills/clinical-reports/references/diagnostic_reports_standards.md +629 -0
- scientific_writer/.claude/skills/clinical-reports/references/medical_terminology.md +588 -0
- scientific_writer/.claude/skills/clinical-reports/references/patient_documentation.md +744 -0
- scientific_writer/.claude/skills/clinical-reports/references/peer_review_standards.md +585 -0
- scientific_writer/.claude/skills/clinical-reports/references/regulatory_compliance.md +577 -0
- scientific_writer/.claude/skills/clinical-reports/scripts/check_deidentification.py +346 -0
- scientific_writer/.claude/skills/clinical-reports/scripts/compliance_checker.py +78 -0
- scientific_writer/.claude/skills/clinical-reports/scripts/extract_clinical_data.py +102 -0
- scientific_writer/.claude/skills/clinical-reports/scripts/format_adverse_events.py +103 -0
- scientific_writer/.claude/skills/clinical-reports/scripts/generate_report_template.py +163 -0
- scientific_writer/.claude/skills/clinical-reports/scripts/terminology_validator.py +133 -0
- scientific_writer/.claude/skills/clinical-reports/scripts/validate_case_report.py +334 -0
- scientific_writer/.claude/skills/clinical-reports/scripts/validate_trial_report.py +89 -0
- scientific_writer/.claude/skills/document-skills/docx/LICENSE.txt +30 -0
- scientific_writer/.claude/skills/document-skills/docx/SKILL.md +197 -0
- scientific_writer/.claude/skills/document-skills/docx/docx-js.md +350 -0
- scientific_writer/.claude/skills/document-skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/dml-chart.xsd +1499 -0
- scientific_writer/.claude/skills/document-skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/dml-chartDrawing.xsd +146 -0
- scientific_writer/.claude/skills/document-skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/dml-diagram.xsd +1085 -0
- scientific_writer/.claude/skills/document-skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/dml-lockedCanvas.xsd +11 -0
- scientific_writer/.claude/skills/document-skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/dml-main.xsd +3081 -0
- scientific_writer/.claude/skills/document-skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/dml-picture.xsd +23 -0
- scientific_writer/.claude/skills/document-skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/dml-spreadsheetDrawing.xsd +185 -0
- scientific_writer/.claude/skills/document-skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/dml-wordprocessingDrawing.xsd +287 -0
- scientific_writer/.claude/skills/document-skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/pml.xsd +1676 -0
- scientific_writer/.claude/skills/document-skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-additionalCharacteristics.xsd +28 -0
- scientific_writer/.claude/skills/document-skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-bibliography.xsd +144 -0
- scientific_writer/.claude/skills/document-skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-commonSimpleTypes.xsd +174 -0
- scientific_writer/.claude/skills/document-skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-customXmlDataProperties.xsd +25 -0
- scientific_writer/.claude/skills/document-skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-customXmlSchemaProperties.xsd +18 -0
- scientific_writer/.claude/skills/document-skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesCustom.xsd +59 -0
- scientific_writer/.claude/skills/document-skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesExtended.xsd +56 -0
- scientific_writer/.claude/skills/document-skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesVariantTypes.xsd +195 -0
- scientific_writer/.claude/skills/document-skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-math.xsd +582 -0
- scientific_writer/.claude/skills/document-skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-relationshipReference.xsd +25 -0
- scientific_writer/.claude/skills/document-skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/sml.xsd +4439 -0
- scientific_writer/.claude/skills/document-skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/vml-main.xsd +570 -0
- scientific_writer/.claude/skills/document-skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/vml-officeDrawing.xsd +509 -0
- scientific_writer/.claude/skills/document-skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/vml-presentationDrawing.xsd +12 -0
- scientific_writer/.claude/skills/document-skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/vml-spreadsheetDrawing.xsd +108 -0
- scientific_writer/.claude/skills/document-skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/vml-wordprocessingDrawing.xsd +96 -0
- scientific_writer/.claude/skills/document-skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/wml.xsd +3646 -0
- scientific_writer/.claude/skills/document-skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/xml.xsd +116 -0
- scientific_writer/.claude/skills/document-skills/docx/ooxml/schemas/ecma/fouth-edition/opc-contentTypes.xsd +42 -0
- scientific_writer/.claude/skills/document-skills/docx/ooxml/schemas/ecma/fouth-edition/opc-coreProperties.xsd +50 -0
- scientific_writer/.claude/skills/document-skills/docx/ooxml/schemas/ecma/fouth-edition/opc-digSig.xsd +49 -0
- scientific_writer/.claude/skills/document-skills/docx/ooxml/schemas/ecma/fouth-edition/opc-relationships.xsd +33 -0
- scientific_writer/.claude/skills/document-skills/docx/ooxml/schemas/mce/mc.xsd +75 -0
- scientific_writer/.claude/skills/document-skills/docx/ooxml/schemas/microsoft/wml-2010.xsd +560 -0
- scientific_writer/.claude/skills/document-skills/docx/ooxml/schemas/microsoft/wml-2012.xsd +67 -0
- scientific_writer/.claude/skills/document-skills/docx/ooxml/schemas/microsoft/wml-2018.xsd +14 -0
- scientific_writer/.claude/skills/document-skills/docx/ooxml/schemas/microsoft/wml-cex-2018.xsd +20 -0
- scientific_writer/.claude/skills/document-skills/docx/ooxml/schemas/microsoft/wml-cid-2016.xsd +13 -0
- scientific_writer/.claude/skills/document-skills/docx/ooxml/schemas/microsoft/wml-sdtdatahash-2020.xsd +4 -0
- scientific_writer/.claude/skills/document-skills/docx/ooxml/schemas/microsoft/wml-symex-2015.xsd +8 -0
- scientific_writer/.claude/skills/document-skills/docx/ooxml/scripts/pack.py +159 -0
- scientific_writer/.claude/skills/document-skills/docx/ooxml/scripts/unpack.py +29 -0
- scientific_writer/.claude/skills/document-skills/docx/ooxml/scripts/validate.py +69 -0
- scientific_writer/.claude/skills/document-skills/docx/ooxml/scripts/validation/__init__.py +15 -0
- scientific_writer/.claude/skills/document-skills/docx/ooxml/scripts/validation/base.py +951 -0
- scientific_writer/.claude/skills/document-skills/docx/ooxml/scripts/validation/docx.py +274 -0
- scientific_writer/.claude/skills/document-skills/docx/ooxml/scripts/validation/pptx.py +315 -0
- scientific_writer/.claude/skills/document-skills/docx/ooxml/scripts/validation/redlining.py +279 -0
- scientific_writer/.claude/skills/document-skills/docx/ooxml.md +610 -0
- scientific_writer/.claude/skills/document-skills/docx/scripts/__init__.py +1 -0
- scientific_writer/.claude/skills/document-skills/docx/scripts/document.py +1276 -0
- scientific_writer/.claude/skills/document-skills/docx/scripts/templates/comments.xml +3 -0
- scientific_writer/.claude/skills/document-skills/docx/scripts/templates/commentsExtended.xml +3 -0
- scientific_writer/.claude/skills/document-skills/docx/scripts/templates/commentsExtensible.xml +3 -0
- scientific_writer/.claude/skills/document-skills/docx/scripts/templates/commentsIds.xml +3 -0
- scientific_writer/.claude/skills/document-skills/docx/scripts/templates/people.xml +3 -0
- scientific_writer/.claude/skills/document-skills/docx/scripts/utilities.py +374 -0
- scientific_writer/.claude/skills/document-skills/pdf/LICENSE.txt +30 -0
- scientific_writer/.claude/skills/document-skills/pdf/SKILL.md +294 -0
- scientific_writer/.claude/skills/document-skills/pdf/forms.md +205 -0
- scientific_writer/.claude/skills/document-skills/pdf/reference.md +612 -0
- scientific_writer/.claude/skills/document-skills/pdf/scripts/check_bounding_boxes.py +70 -0
- scientific_writer/.claude/skills/document-skills/pdf/scripts/check_bounding_boxes_test.py +226 -0
- scientific_writer/.claude/skills/document-skills/pdf/scripts/check_fillable_fields.py +12 -0
- scientific_writer/.claude/skills/document-skills/pdf/scripts/convert_pdf_to_images.py +35 -0
- scientific_writer/.claude/skills/document-skills/pdf/scripts/create_validation_image.py +41 -0
- scientific_writer/.claude/skills/document-skills/pdf/scripts/extract_form_field_info.py +152 -0
- scientific_writer/.claude/skills/document-skills/pdf/scripts/fill_fillable_fields.py +114 -0
- scientific_writer/.claude/skills/document-skills/pdf/scripts/fill_pdf_form_with_annotations.py +108 -0
- scientific_writer/.claude/skills/document-skills/pptx/LICENSE.txt +30 -0
- scientific_writer/.claude/skills/document-skills/pptx/SKILL.md +484 -0
- scientific_writer/.claude/skills/document-skills/pptx/html2pptx.md +625 -0
- scientific_writer/.claude/skills/document-skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/dml-chart.xsd +1499 -0
- scientific_writer/.claude/skills/document-skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/dml-chartDrawing.xsd +146 -0
- scientific_writer/.claude/skills/document-skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/dml-diagram.xsd +1085 -0
- scientific_writer/.claude/skills/document-skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/dml-lockedCanvas.xsd +11 -0
- scientific_writer/.claude/skills/document-skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/dml-main.xsd +3081 -0
- scientific_writer/.claude/skills/document-skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/dml-picture.xsd +23 -0
- scientific_writer/.claude/skills/document-skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/dml-spreadsheetDrawing.xsd +185 -0
- scientific_writer/.claude/skills/document-skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/dml-wordprocessingDrawing.xsd +287 -0
- scientific_writer/.claude/skills/document-skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/pml.xsd +1676 -0
- scientific_writer/.claude/skills/document-skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/shared-additionalCharacteristics.xsd +28 -0
- scientific_writer/.claude/skills/document-skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/shared-bibliography.xsd +144 -0
- scientific_writer/.claude/skills/document-skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/shared-commonSimpleTypes.xsd +174 -0
- scientific_writer/.claude/skills/document-skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/shared-customXmlDataProperties.xsd +25 -0
- scientific_writer/.claude/skills/document-skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/shared-customXmlSchemaProperties.xsd +18 -0
- scientific_writer/.claude/skills/document-skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesCustom.xsd +59 -0
- scientific_writer/.claude/skills/document-skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesExtended.xsd +56 -0
- scientific_writer/.claude/skills/document-skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesVariantTypes.xsd +195 -0
- scientific_writer/.claude/skills/document-skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/shared-math.xsd +582 -0
- scientific_writer/.claude/skills/document-skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/shared-relationshipReference.xsd +25 -0
- scientific_writer/.claude/skills/document-skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/sml.xsd +4439 -0
- scientific_writer/.claude/skills/document-skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/vml-main.xsd +570 -0
- scientific_writer/.claude/skills/document-skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/vml-officeDrawing.xsd +509 -0
- scientific_writer/.claude/skills/document-skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/vml-presentationDrawing.xsd +12 -0
- scientific_writer/.claude/skills/document-skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/vml-spreadsheetDrawing.xsd +108 -0
- scientific_writer/.claude/skills/document-skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/vml-wordprocessingDrawing.xsd +96 -0
- scientific_writer/.claude/skills/document-skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/wml.xsd +3646 -0
- scientific_writer/.claude/skills/document-skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/xml.xsd +116 -0
- scientific_writer/.claude/skills/document-skills/pptx/ooxml/schemas/ecma/fouth-edition/opc-contentTypes.xsd +42 -0
- scientific_writer/.claude/skills/document-skills/pptx/ooxml/schemas/ecma/fouth-edition/opc-coreProperties.xsd +50 -0
- scientific_writer/.claude/skills/document-skills/pptx/ooxml/schemas/ecma/fouth-edition/opc-digSig.xsd +49 -0
- scientific_writer/.claude/skills/document-skills/pptx/ooxml/schemas/ecma/fouth-edition/opc-relationships.xsd +33 -0
- scientific_writer/.claude/skills/document-skills/pptx/ooxml/schemas/mce/mc.xsd +75 -0
- scientific_writer/.claude/skills/document-skills/pptx/ooxml/schemas/microsoft/wml-2010.xsd +560 -0
- scientific_writer/.claude/skills/document-skills/pptx/ooxml/schemas/microsoft/wml-2012.xsd +67 -0
- scientific_writer/.claude/skills/document-skills/pptx/ooxml/schemas/microsoft/wml-2018.xsd +14 -0
- scientific_writer/.claude/skills/document-skills/pptx/ooxml/schemas/microsoft/wml-cex-2018.xsd +20 -0
- scientific_writer/.claude/skills/document-skills/pptx/ooxml/schemas/microsoft/wml-cid-2016.xsd +13 -0
- scientific_writer/.claude/skills/document-skills/pptx/ooxml/schemas/microsoft/wml-sdtdatahash-2020.xsd +4 -0
- scientific_writer/.claude/skills/document-skills/pptx/ooxml/schemas/microsoft/wml-symex-2015.xsd +8 -0
- scientific_writer/.claude/skills/document-skills/pptx/ooxml/scripts/pack.py +159 -0
- scientific_writer/.claude/skills/document-skills/pptx/ooxml/scripts/unpack.py +29 -0
- scientific_writer/.claude/skills/document-skills/pptx/ooxml/scripts/validate.py +69 -0
- scientific_writer/.claude/skills/document-skills/pptx/ooxml/scripts/validation/__init__.py +15 -0
- scientific_writer/.claude/skills/document-skills/pptx/ooxml/scripts/validation/base.py +951 -0
- scientific_writer/.claude/skills/document-skills/pptx/ooxml/scripts/validation/docx.py +274 -0
- scientific_writer/.claude/skills/document-skills/pptx/ooxml/scripts/validation/pptx.py +315 -0
- scientific_writer/.claude/skills/document-skills/pptx/ooxml/scripts/validation/redlining.py +279 -0
- scientific_writer/.claude/skills/document-skills/pptx/ooxml.md +427 -0
- scientific_writer/.claude/skills/document-skills/pptx/scripts/html2pptx.js +979 -0
- scientific_writer/.claude/skills/document-skills/pptx/scripts/inventory.py +1020 -0
- scientific_writer/.claude/skills/document-skills/pptx/scripts/rearrange.py +231 -0
- scientific_writer/.claude/skills/document-skills/pptx/scripts/replace.py +385 -0
- scientific_writer/.claude/skills/document-skills/pptx/scripts/thumbnail.py +450 -0
- scientific_writer/.claude/skills/document-skills/xlsx/LICENSE.txt +30 -0
- scientific_writer/.claude/skills/document-skills/xlsx/SKILL.md +289 -0
- scientific_writer/.claude/skills/document-skills/xlsx/recalc.py +178 -0
- scientific_writer/.claude/skills/hypothesis-generation/SKILL.md +155 -0
- scientific_writer/.claude/skills/hypothesis-generation/assets/hypothesis_output_template.md +302 -0
- scientific_writer/.claude/skills/hypothesis-generation/references/experimental_design_patterns.md +327 -0
- scientific_writer/.claude/skills/hypothesis-generation/references/hypothesis_quality_criteria.md +196 -0
- scientific_writer/.claude/skills/hypothesis-generation/references/literature_search_strategies.md +505 -0
- scientific_writer/.claude/skills/latex-posters/README.md +417 -0
- scientific_writer/.claude/skills/latex-posters/SKILL.md +919 -0
- scientific_writer/.claude/skills/latex-posters/assets/baposter_template.tex +257 -0
- scientific_writer/.claude/skills/latex-posters/assets/beamerposter_template.tex +244 -0
- scientific_writer/.claude/skills/latex-posters/assets/poster_quality_checklist.md +358 -0
- scientific_writer/.claude/skills/latex-posters/assets/tikzposter_template.tex +251 -0
- scientific_writer/.claude/skills/latex-posters/references/latex_poster_packages.md +745 -0
- scientific_writer/.claude/skills/latex-posters/references/poster_content_guide.md +748 -0
- scientific_writer/.claude/skills/latex-posters/references/poster_design_principles.md +806 -0
- scientific_writer/.claude/skills/latex-posters/references/poster_layout_design.md +900 -0
- scientific_writer/.claude/skills/latex-posters/scripts/review_poster.sh +214 -0
- scientific_writer/.claude/skills/literature-review/SKILL.md +546 -0
- scientific_writer/.claude/skills/literature-review/assets/review_template.md +412 -0
- scientific_writer/.claude/skills/literature-review/references/citation_styles.md +166 -0
- scientific_writer/.claude/skills/literature-review/references/database_strategies.md +381 -0
- scientific_writer/.claude/skills/literature-review/scripts/generate_pdf.py +176 -0
- scientific_writer/.claude/skills/literature-review/scripts/search_databases.py +303 -0
- scientific_writer/.claude/skills/literature-review/scripts/verify_citations.py +222 -0
- scientific_writer/.claude/skills/markitdown/INSTALLATION_GUIDE.md +318 -0
- scientific_writer/.claude/skills/markitdown/LICENSE.txt +22 -0
- scientific_writer/.claude/skills/markitdown/OPENROUTER_INTEGRATION.md +359 -0
- scientific_writer/.claude/skills/markitdown/QUICK_REFERENCE.md +309 -0
- scientific_writer/.claude/skills/markitdown/README.md +184 -0
- scientific_writer/.claude/skills/markitdown/SKILL.md +450 -0
- scientific_writer/.claude/skills/markitdown/SKILL_SUMMARY.md +307 -0
- scientific_writer/.claude/skills/markitdown/assets/example_usage.md +463 -0
- scientific_writer/.claude/skills/markitdown/references/api_reference.md +399 -0
- scientific_writer/.claude/skills/markitdown/references/file_formats.md +542 -0
- scientific_writer/.claude/skills/markitdown/scripts/batch_convert.py +228 -0
- scientific_writer/.claude/skills/markitdown/scripts/convert_literature.py +283 -0
- scientific_writer/.claude/skills/markitdown/scripts/convert_with_ai.py +243 -0
- scientific_writer/.claude/skills/paper-2-web/SKILL.md +455 -0
- scientific_writer/.claude/skills/paper-2-web/references/installation.md +141 -0
- scientific_writer/.claude/skills/paper-2-web/references/paper2poster.md +346 -0
- scientific_writer/.claude/skills/paper-2-web/references/paper2video.md +305 -0
- scientific_writer/.claude/skills/paper-2-web/references/paper2web.md +187 -0
- scientific_writer/.claude/skills/paper-2-web/references/usage_examples.md +436 -0
- scientific_writer/.claude/skills/peer-review/SKILL.md +375 -0
- scientific_writer/.claude/skills/peer-review/references/common_issues.md +552 -0
- scientific_writer/.claude/skills/peer-review/references/reporting_standards.md +290 -0
- scientific_writer/.claude/skills/research-grants/README.md +285 -0
- scientific_writer/.claude/skills/research-grants/SKILL.md +896 -0
- scientific_writer/.claude/skills/research-grants/assets/budget_justification_template.md +453 -0
- scientific_writer/.claude/skills/research-grants/assets/nih_specific_aims_template.md +166 -0
- scientific_writer/.claude/skills/research-grants/assets/nsf_project_summary_template.md +92 -0
- scientific_writer/.claude/skills/research-grants/references/broader_impacts.md +392 -0
- scientific_writer/.claude/skills/research-grants/references/darpa_guidelines.md +636 -0
- scientific_writer/.claude/skills/research-grants/references/doe_guidelines.md +586 -0
- scientific_writer/.claude/skills/research-grants/references/nih_guidelines.md +851 -0
- scientific_writer/.claude/skills/research-grants/references/nsf_guidelines.md +570 -0
- scientific_writer/.claude/skills/research-grants/references/specific_aims_guide.md +458 -0
- scientific_writer/.claude/skills/research-lookup/README.md +116 -0
- scientific_writer/.claude/skills/research-lookup/SKILL.md +443 -0
- scientific_writer/.claude/skills/research-lookup/examples.py +174 -0
- scientific_writer/.claude/skills/research-lookup/lookup.py +93 -0
- scientific_writer/.claude/skills/research-lookup/research_lookup.py +335 -0
- scientific_writer/.claude/skills/research-lookup/scripts/research_lookup.py +261 -0
- scientific_writer/.claude/skills/scholar-evaluation/SKILL.md +254 -0
- scientific_writer/.claude/skills/scholar-evaluation/references/evaluation_framework.md +663 -0
- scientific_writer/.claude/skills/scholar-evaluation/scripts/calculate_scores.py +378 -0
- scientific_writer/.claude/skills/scientific-critical-thinking/SKILL.md +530 -0
- scientific_writer/.claude/skills/scientific-critical-thinking/references/common_biases.md +364 -0
- scientific_writer/.claude/skills/scientific-critical-thinking/references/evidence_hierarchy.md +484 -0
- scientific_writer/.claude/skills/scientific-critical-thinking/references/experimental_design.md +496 -0
- scientific_writer/.claude/skills/scientific-critical-thinking/references/logical_fallacies.md +478 -0
- scientific_writer/.claude/skills/scientific-critical-thinking/references/scientific_method.md +169 -0
- scientific_writer/.claude/skills/scientific-critical-thinking/references/statistical_pitfalls.md +506 -0
- scientific_writer/.claude/skills/scientific-schematics/SKILL.md +2035 -0
- scientific_writer/.claude/skills/scientific-schematics/assets/block_diagram_template.tex +199 -0
- scientific_writer/.claude/skills/scientific-schematics/assets/circuit_template.tex +159 -0
- scientific_writer/.claude/skills/scientific-schematics/assets/flowchart_template.tex +161 -0
- scientific_writer/.claude/skills/scientific-schematics/assets/pathway_template.tex +162 -0
- scientific_writer/.claude/skills/scientific-schematics/assets/tikz_styles.tex +422 -0
- scientific_writer/.claude/skills/scientific-schematics/references/best_practices.md +562 -0
- scientific_writer/.claude/skills/scientific-schematics/references/diagram_types.md +637 -0
- scientific_writer/.claude/skills/scientific-schematics/references/python_libraries.md +791 -0
- scientific_writer/.claude/skills/scientific-schematics/references/tikz_guide.md +734 -0
- scientific_writer/.claude/skills/scientific-schematics/scripts/circuit_generator.py +307 -0
- scientific_writer/.claude/skills/scientific-schematics/scripts/compile_tikz.py +292 -0
- scientific_writer/.claude/skills/scientific-schematics/scripts/generate_flowchart.py +281 -0
- scientific_writer/.claude/skills/scientific-schematics/scripts/pathway_diagram.py +406 -0
- scientific_writer/.claude/skills/scientific-writing/SKILL.md +443 -0
- scientific_writer/.claude/skills/scientific-writing/references/citation_styles.md +720 -0
- scientific_writer/.claude/skills/scientific-writing/references/figures_tables.md +806 -0
- scientific_writer/.claude/skills/scientific-writing/references/imrad_structure.md +658 -0
- scientific_writer/.claude/skills/scientific-writing/references/reporting_guidelines.md +748 -0
- scientific_writer/.claude/skills/scientific-writing/references/writing_principles.md +824 -0
- scientific_writer/.claude/skills/treatment-plans/README.md +483 -0
- scientific_writer/.claude/skills/treatment-plans/SKILL.md +817 -0
- scientific_writer/.claude/skills/treatment-plans/assets/chronic_disease_management_plan.tex +636 -0
- scientific_writer/.claude/skills/treatment-plans/assets/general_medical_treatment_plan.tex +616 -0
- scientific_writer/.claude/skills/treatment-plans/assets/mental_health_treatment_plan.tex +745 -0
- scientific_writer/.claude/skills/treatment-plans/assets/pain_management_plan.tex +770 -0
- scientific_writer/.claude/skills/treatment-plans/assets/perioperative_care_plan.tex +724 -0
- scientific_writer/.claude/skills/treatment-plans/assets/quality_checklist.md +471 -0
- scientific_writer/.claude/skills/treatment-plans/assets/rehabilitation_treatment_plan.tex +727 -0
- scientific_writer/.claude/skills/treatment-plans/references/goal_setting_frameworks.md +411 -0
- scientific_writer/.claude/skills/treatment-plans/references/intervention_guidelines.md +507 -0
- scientific_writer/.claude/skills/treatment-plans/references/regulatory_compliance.md +476 -0
- scientific_writer/.claude/skills/treatment-plans/references/specialty_specific_guidelines.md +607 -0
- scientific_writer/.claude/skills/treatment-plans/references/treatment_plan_standards.md +456 -0
- scientific_writer/.claude/skills/treatment-plans/scripts/check_completeness.py +318 -0
- scientific_writer/.claude/skills/treatment-plans/scripts/generate_template.py +244 -0
- scientific_writer/.claude/skills/treatment-plans/scripts/timeline_generator.py +369 -0
- scientific_writer/.claude/skills/treatment-plans/scripts/validate_treatment_plan.py +367 -0
- scientific_writer/.claude/skills/venue-templates/SKILL.md +590 -0
- scientific_writer/.claude/skills/venue-templates/assets/grants/nih_specific_aims.tex +235 -0
- scientific_writer/.claude/skills/venue-templates/assets/grants/nsf_proposal_template.tex +375 -0
- scientific_writer/.claude/skills/venue-templates/assets/journals/nature_article.tex +171 -0
- scientific_writer/.claude/skills/venue-templates/assets/journals/neurips_article.tex +283 -0
- scientific_writer/.claude/skills/venue-templates/assets/journals/plos_one.tex +317 -0
- scientific_writer/.claude/skills/venue-templates/assets/posters/beamerposter_academic.tex +311 -0
- scientific_writer/.claude/skills/venue-templates/references/conferences_formatting.md +564 -0
- scientific_writer/.claude/skills/venue-templates/references/grants_requirements.md +787 -0
- scientific_writer/.claude/skills/venue-templates/references/journals_formatting.md +486 -0
- scientific_writer/.claude/skills/venue-templates/references/posters_guidelines.md +628 -0
- scientific_writer/.claude/skills/venue-templates/scripts/customize_template.py +206 -0
- scientific_writer/.claude/skills/venue-templates/scripts/query_template.py +260 -0
- scientific_writer/.claude/skills/venue-templates/scripts/validate_format.py +255 -0
- scientific_writer/CLAUDE.md +748 -0
- scientific_writer/__init__.py +2 -2
- scientific_writer/api.py +14 -7
- scientific_writer/cli.py +12 -7
- scientific_writer/core.py +27 -5
- {scientific_writer-2.1.1.dist-info → scientific_writer-2.2.2.dist-info}/METADATA +5 -1
- scientific_writer-2.2.2.dist-info/RECORD +312 -0
- scientific_writer-2.1.1.dist-info/RECORD +0 -11
- {scientific_writer-2.1.1.dist-info → scientific_writer-2.2.2.dist-info}/WHEEL +0 -0
- {scientific_writer-2.1.1.dist-info → scientific_writer-2.2.2.dist-info}/entry_points.txt +0 -0
- {scientific_writer-2.1.1.dist-info → scientific_writer-2.2.2.dist-info}/licenses/LICENSE +0 -0
|
@@ -0,0 +1,318 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
"""
|
|
3
|
+
Check Treatment Plan Completeness
|
|
4
|
+
Validates that all required sections are present in a treatment plan.
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
import sys
|
|
8
|
+
import re
|
|
9
|
+
import argparse
|
|
10
|
+
from pathlib import Path
|
|
11
|
+
from typing import List, Tuple
|
|
12
|
+
|
|
13
|
+
# Required sections for all treatment plans
|
|
14
|
+
REQUIRED_SECTIONS = [
|
|
15
|
+
r'\\section\*\{.*Patient Information',
|
|
16
|
+
r'\\section\*\{.*Diagnosis.*Assessment',
|
|
17
|
+
r'\\section\*\{.*Goals',
|
|
18
|
+
r'\\section\*\{.*Interventions',
|
|
19
|
+
r'\\section\*\{.*Timeline.*Schedule',
|
|
20
|
+
r'\\section\*\{.*Monitoring',
|
|
21
|
+
r'\\section\*\{.*Outcomes',
|
|
22
|
+
r'\\section\*\{.*Follow[- ]?up',
|
|
23
|
+
r'\\section\*\{.*Education',
|
|
24
|
+
r'\\section\*\{.*Risk.*Safety',
|
|
25
|
+
]
|
|
26
|
+
|
|
27
|
+
# Section descriptions for user-friendly output
|
|
28
|
+
SECTION_DESCRIPTIONS = {
|
|
29
|
+
0: 'Patient Information (de-identified)',
|
|
30
|
+
1: 'Diagnosis and Assessment',
|
|
31
|
+
2: 'Treatment Goals (SMART format)',
|
|
32
|
+
3: 'Interventions (pharmacological, non-pharmacological, procedural)',
|
|
33
|
+
4: 'Timeline and Schedule',
|
|
34
|
+
5: 'Monitoring Parameters',
|
|
35
|
+
6: 'Expected Outcomes',
|
|
36
|
+
7: 'Follow-up Plan',
|
|
37
|
+
8: 'Patient Education',
|
|
38
|
+
9: 'Risk Mitigation and Safety'
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
|
|
42
|
+
def read_file(filepath: Path) -> str:
|
|
43
|
+
"""Read and return file contents."""
|
|
44
|
+
try:
|
|
45
|
+
with open(filepath, 'r', encoding='utf-8') as f:
|
|
46
|
+
return f.read()
|
|
47
|
+
except FileNotFoundError:
|
|
48
|
+
print(f"Error: File not found: {filepath}", file=sys.stderr)
|
|
49
|
+
sys.exit(1)
|
|
50
|
+
except Exception as e:
|
|
51
|
+
print(f"Error reading file: {e}", file=sys.stderr)
|
|
52
|
+
sys.exit(1)
|
|
53
|
+
|
|
54
|
+
|
|
55
|
+
def check_sections(content: str) -> Tuple[List[bool], List[str]]:
|
|
56
|
+
"""
|
|
57
|
+
Check which required sections are present.
|
|
58
|
+
Returns tuple of (checklist, missing_sections).
|
|
59
|
+
"""
|
|
60
|
+
checklist = []
|
|
61
|
+
missing = []
|
|
62
|
+
|
|
63
|
+
for i, pattern in enumerate(REQUIRED_SECTIONS):
|
|
64
|
+
if re.search(pattern, content, re.IGNORECASE):
|
|
65
|
+
checklist.append(True)
|
|
66
|
+
else:
|
|
67
|
+
checklist.append(False)
|
|
68
|
+
missing.append(SECTION_DESCRIPTIONS[i])
|
|
69
|
+
|
|
70
|
+
return checklist, missing
|
|
71
|
+
|
|
72
|
+
|
|
73
|
+
def check_smart_goals(content: str) -> Tuple[bool, List[str]]:
|
|
74
|
+
"""
|
|
75
|
+
Check if SMART goal criteria are mentioned.
|
|
76
|
+
Returns (has_smart, missing_criteria).
|
|
77
|
+
"""
|
|
78
|
+
smart_criteria = {
|
|
79
|
+
'Specific': r'\bspecific\b',
|
|
80
|
+
'Measurable': r'\bmeasurable\b',
|
|
81
|
+
'Achievable': r'\bachievable\b',
|
|
82
|
+
'Relevant': r'\brelevant\b',
|
|
83
|
+
'Time-bound': r'\btime[- ]?bound\b'
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
missing = []
|
|
87
|
+
for criterion, pattern in smart_criteria.items():
|
|
88
|
+
if not re.search(pattern, content, re.IGNORECASE):
|
|
89
|
+
missing.append(criterion)
|
|
90
|
+
|
|
91
|
+
has_smart = len(missing) == 0
|
|
92
|
+
return has_smart, missing
|
|
93
|
+
|
|
94
|
+
|
|
95
|
+
def check_hipaa_notice(content: str) -> bool:
|
|
96
|
+
"""Check if HIPAA de-identification notice is present."""
|
|
97
|
+
pattern = r'HIPAA|de-identif|protected health information|PHI'
|
|
98
|
+
return bool(re.search(pattern, content, re.IGNORECASE))
|
|
99
|
+
|
|
100
|
+
|
|
101
|
+
def check_provider_signature(content: str) -> bool:
|
|
102
|
+
"""Check if provider signature section is present."""
|
|
103
|
+
pattern = r'\\section\*\{.*Signature|Provider Signature|Signature'
|
|
104
|
+
return bool(re.search(pattern, content, re.IGNORECASE))
|
|
105
|
+
|
|
106
|
+
|
|
107
|
+
def check_placeholders_remaining(content: str) -> Tuple[int, List[str]]:
|
|
108
|
+
"""
|
|
109
|
+
Check for uncustomized placeholders [like this].
|
|
110
|
+
Returns (count, sample_placeholders).
|
|
111
|
+
"""
|
|
112
|
+
placeholders = re.findall(r'\[([^\]]+)\]', content)
|
|
113
|
+
|
|
114
|
+
# Filter out LaTeX commands and references
|
|
115
|
+
filtered = []
|
|
116
|
+
for p in placeholders:
|
|
117
|
+
# Skip if it's a LaTeX command, number, or citation
|
|
118
|
+
if not (p.startswith('\\') or p.isdigit() or 'cite' in p.lower() or 'ref' in p.lower()):
|
|
119
|
+
filtered.append(p)
|
|
120
|
+
|
|
121
|
+
count = len(filtered)
|
|
122
|
+
samples = filtered[:5] # Return up to 5 examples
|
|
123
|
+
|
|
124
|
+
return count, samples
|
|
125
|
+
|
|
126
|
+
|
|
127
|
+
def display_results(filepath: Path, checklist: List[bool], missing: List[str],
|
|
128
|
+
smart_complete: bool, smart_missing: List[str],
|
|
129
|
+
has_hipaa: bool, has_signature: bool,
|
|
130
|
+
placeholder_count: int, placeholder_samples: List[str]):
|
|
131
|
+
"""Display completeness check results."""
|
|
132
|
+
|
|
133
|
+
total_sections = len(REQUIRED_SECTIONS)
|
|
134
|
+
present_count = sum(checklist)
|
|
135
|
+
completeness_pct = (present_count / total_sections) * 100
|
|
136
|
+
|
|
137
|
+
print("\n" + "="*70)
|
|
138
|
+
print("TREATMENT PLAN COMPLETENESS CHECK")
|
|
139
|
+
print("="*70)
|
|
140
|
+
print(f"\nFile: {filepath}")
|
|
141
|
+
print(f"File size: {filepath.stat().st_size:,} bytes")
|
|
142
|
+
|
|
143
|
+
# Overall completeness
|
|
144
|
+
print("\n" + "-"*70)
|
|
145
|
+
print("OVERALL COMPLETENESS")
|
|
146
|
+
print("-"*70)
|
|
147
|
+
print(f"Required sections present: {present_count}/{total_sections} ({completeness_pct:.0f}%)")
|
|
148
|
+
|
|
149
|
+
if completeness_pct == 100:
|
|
150
|
+
print("✓ All required sections present")
|
|
151
|
+
else:
|
|
152
|
+
print(f"✗ {len(missing)} section(s) missing")
|
|
153
|
+
|
|
154
|
+
# Section details
|
|
155
|
+
print("\n" + "-"*70)
|
|
156
|
+
print("SECTION CHECKLIST")
|
|
157
|
+
print("-"*70)
|
|
158
|
+
|
|
159
|
+
for i, (present, desc) in enumerate(zip(checklist, SECTION_DESCRIPTIONS.values())):
|
|
160
|
+
status = "✓" if present else "✗"
|
|
161
|
+
print(f"{status} {desc}")
|
|
162
|
+
|
|
163
|
+
# Missing sections
|
|
164
|
+
if missing:
|
|
165
|
+
print("\n" + "-"*70)
|
|
166
|
+
print("MISSING SECTIONS")
|
|
167
|
+
print("-"*70)
|
|
168
|
+
for section in missing:
|
|
169
|
+
print(f" • {section}")
|
|
170
|
+
|
|
171
|
+
# SMART goals
|
|
172
|
+
print("\n" + "-"*70)
|
|
173
|
+
print("SMART GOALS CHECK")
|
|
174
|
+
print("-"*70)
|
|
175
|
+
|
|
176
|
+
if smart_complete:
|
|
177
|
+
print("✓ All SMART criteria mentioned in document")
|
|
178
|
+
else:
|
|
179
|
+
print(f"✗ {len(smart_missing)} SMART criterion/criteria not found:")
|
|
180
|
+
for criterion in smart_missing:
|
|
181
|
+
print(f" • {criterion}")
|
|
182
|
+
print("\nNote: Goals should be Specific, Measurable, Achievable, Relevant, Time-bound")
|
|
183
|
+
|
|
184
|
+
# HIPAA notice
|
|
185
|
+
print("\n" + "-"*70)
|
|
186
|
+
print("PRIVACY AND COMPLIANCE")
|
|
187
|
+
print("-"*70)
|
|
188
|
+
|
|
189
|
+
if has_hipaa:
|
|
190
|
+
print("✓ HIPAA/de-identification notice present")
|
|
191
|
+
else:
|
|
192
|
+
print("✗ HIPAA de-identification notice not found")
|
|
193
|
+
print(" Recommendation: Include HIPAA Safe Harbor de-identification guidance")
|
|
194
|
+
|
|
195
|
+
if has_signature:
|
|
196
|
+
print("✓ Provider signature section present")
|
|
197
|
+
else:
|
|
198
|
+
print("✗ Provider signature section not found")
|
|
199
|
+
|
|
200
|
+
# Placeholders
|
|
201
|
+
print("\n" + "-"*70)
|
|
202
|
+
print("CUSTOMIZATION STATUS")
|
|
203
|
+
print("-"*70)
|
|
204
|
+
|
|
205
|
+
if placeholder_count == 0:
|
|
206
|
+
print("✓ No uncustomized placeholders detected")
|
|
207
|
+
else:
|
|
208
|
+
print(f"⚠ {placeholder_count} placeholder(s) may need customization")
|
|
209
|
+
print("\nExamples:")
|
|
210
|
+
for sample in placeholder_samples:
|
|
211
|
+
print(f" • [{sample}]")
|
|
212
|
+
print("\nRecommendation: Replace all [bracketed placeholders] with patient-specific information")
|
|
213
|
+
|
|
214
|
+
# Summary
|
|
215
|
+
print("\n" + "="*70)
|
|
216
|
+
print("SUMMARY")
|
|
217
|
+
print("="*70)
|
|
218
|
+
|
|
219
|
+
# Calculate overall score
|
|
220
|
+
score_components = [
|
|
221
|
+
completeness_pct / 100, # Section completeness (0-1)
|
|
222
|
+
1.0 if smart_complete else 0.6, # SMART goals (full or partial credit)
|
|
223
|
+
1.0 if has_hipaa else 0.0, # HIPAA notice (binary)
|
|
224
|
+
1.0 if has_signature else 0.0, # Signature (binary)
|
|
225
|
+
1.0 if placeholder_count == 0 else 0.5 # Customization (full or partial)
|
|
226
|
+
]
|
|
227
|
+
|
|
228
|
+
overall_score = (sum(score_components) / len(score_components)) * 100
|
|
229
|
+
|
|
230
|
+
print(f"\nOverall completeness score: {overall_score:.0f}%")
|
|
231
|
+
|
|
232
|
+
if overall_score >= 90:
|
|
233
|
+
print("Status: ✓ EXCELLENT - Treatment plan is comprehensive")
|
|
234
|
+
elif overall_score >= 75:
|
|
235
|
+
print("Status: ✓ GOOD - Minor improvements needed")
|
|
236
|
+
elif overall_score >= 60:
|
|
237
|
+
print("Status: ⚠ FAIR - Several sections need attention")
|
|
238
|
+
else:
|
|
239
|
+
print("Status: ✗ INCOMPLETE - Significant work needed")
|
|
240
|
+
|
|
241
|
+
print("\n" + "="*70)
|
|
242
|
+
|
|
243
|
+
# Return exit code based on completeness
|
|
244
|
+
return 0 if completeness_pct >= 80 else 1
|
|
245
|
+
|
|
246
|
+
|
|
247
|
+
def main():
|
|
248
|
+
parser = argparse.ArgumentParser(
|
|
249
|
+
description='Check treatment plan completeness',
|
|
250
|
+
formatter_class=argparse.RawDescriptionHelpFormatter,
|
|
251
|
+
epilog="""
|
|
252
|
+
Examples:
|
|
253
|
+
# Check a treatment plan file
|
|
254
|
+
python check_completeness.py my_treatment_plan.tex
|
|
255
|
+
|
|
256
|
+
# Check and exit with error code if incomplete (for CI/CD)
|
|
257
|
+
python check_completeness.py plan.tex && echo "Complete"
|
|
258
|
+
|
|
259
|
+
This script checks for:
|
|
260
|
+
- All required sections (10 core sections)
|
|
261
|
+
- SMART goal criteria
|
|
262
|
+
- HIPAA de-identification notice
|
|
263
|
+
- Provider signature section
|
|
264
|
+
- Uncustomized placeholders
|
|
265
|
+
|
|
266
|
+
Exit codes:
|
|
267
|
+
0 - All required sections present (≥80% complete)
|
|
268
|
+
1 - Missing required sections (<80% complete)
|
|
269
|
+
2 - File error or invalid arguments
|
|
270
|
+
"""
|
|
271
|
+
)
|
|
272
|
+
|
|
273
|
+
parser.add_argument(
|
|
274
|
+
'file',
|
|
275
|
+
type=Path,
|
|
276
|
+
help='Treatment plan file to check (.tex format)'
|
|
277
|
+
)
|
|
278
|
+
|
|
279
|
+
parser.add_argument(
|
|
280
|
+
'-v', '--verbose',
|
|
281
|
+
action='store_true',
|
|
282
|
+
help='Show detailed output'
|
|
283
|
+
)
|
|
284
|
+
|
|
285
|
+
args = parser.parse_args()
|
|
286
|
+
|
|
287
|
+
# Check file exists and is .tex
|
|
288
|
+
if not args.file.exists():
|
|
289
|
+
print(f"Error: File not found: {args.file}", file=sys.stderr)
|
|
290
|
+
sys.exit(2)
|
|
291
|
+
|
|
292
|
+
if args.file.suffix.lower() not in ['.tex', '.txt']:
|
|
293
|
+
print(f"Warning: Expected .tex file, got {args.file.suffix}", file=sys.stderr)
|
|
294
|
+
|
|
295
|
+
# Read file
|
|
296
|
+
content = read_file(args.file)
|
|
297
|
+
|
|
298
|
+
# Perform checks
|
|
299
|
+
checklist, missing = check_sections(content)
|
|
300
|
+
smart_complete, smart_missing = check_smart_goals(content)
|
|
301
|
+
has_hipaa = check_hipaa_notice(content)
|
|
302
|
+
has_signature = check_provider_signature(content)
|
|
303
|
+
placeholder_count, placeholder_samples = check_placeholders_remaining(content)
|
|
304
|
+
|
|
305
|
+
# Display results
|
|
306
|
+
exit_code = display_results(
|
|
307
|
+
args.file, checklist, missing,
|
|
308
|
+
smart_complete, smart_missing,
|
|
309
|
+
has_hipaa, has_signature,
|
|
310
|
+
placeholder_count, placeholder_samples
|
|
311
|
+
)
|
|
312
|
+
|
|
313
|
+
sys.exit(exit_code)
|
|
314
|
+
|
|
315
|
+
|
|
316
|
+
if __name__ == '__main__':
|
|
317
|
+
main()
|
|
318
|
+
|
|
@@ -0,0 +1,244 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
"""
|
|
3
|
+
Generate Treatment Plan Template
|
|
4
|
+
Interactive script to select and generate treatment plan templates.
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
import os
|
|
8
|
+
import sys
|
|
9
|
+
import shutil
|
|
10
|
+
import argparse
|
|
11
|
+
from pathlib import Path
|
|
12
|
+
from datetime import datetime
|
|
13
|
+
|
|
14
|
+
# Template types and descriptions
|
|
15
|
+
TEMPLATES = {
|
|
16
|
+
'general_medical': {
|
|
17
|
+
'name': 'General Medical Treatment Plan',
|
|
18
|
+
'file': 'general_medical_treatment_plan.tex',
|
|
19
|
+
'description': 'For primary care and chronic disease management (diabetes, hypertension, etc.)'
|
|
20
|
+
},
|
|
21
|
+
'rehabilitation': {
|
|
22
|
+
'name': 'Rehabilitation Treatment Plan',
|
|
23
|
+
'file': 'rehabilitation_treatment_plan.tex',
|
|
24
|
+
'description': 'For physical therapy, occupational therapy, and rehabilitation services'
|
|
25
|
+
},
|
|
26
|
+
'mental_health': {
|
|
27
|
+
'name': 'Mental Health Treatment Plan',
|
|
28
|
+
'file': 'mental_health_treatment_plan.tex',
|
|
29
|
+
'description': 'For psychiatric and behavioral health treatment'
|
|
30
|
+
},
|
|
31
|
+
'chronic_disease': {
|
|
32
|
+
'name': 'Chronic Disease Management Plan',
|
|
33
|
+
'file': 'chronic_disease_management_plan.tex',
|
|
34
|
+
'description': 'For complex multimorbidity and long-term care coordination'
|
|
35
|
+
},
|
|
36
|
+
'perioperative': {
|
|
37
|
+
'name': 'Perioperative Care Plan',
|
|
38
|
+
'file': 'perioperative_care_plan.tex',
|
|
39
|
+
'description': 'For surgical and procedural patient management'
|
|
40
|
+
},
|
|
41
|
+
'pain_management': {
|
|
42
|
+
'name': 'Pain Management Plan',
|
|
43
|
+
'file': 'pain_management_plan.tex',
|
|
44
|
+
'description': 'For acute and chronic pain treatment (multimodal approach)'
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
|
|
49
|
+
def get_templates_dir():
|
|
50
|
+
"""Get the path to the templates directory."""
|
|
51
|
+
# Assume script is in .claude/skills/treatment-plans/scripts/
|
|
52
|
+
script_dir = Path(__file__).parent
|
|
53
|
+
templates_dir = script_dir.parent / 'assets'
|
|
54
|
+
return templates_dir
|
|
55
|
+
|
|
56
|
+
|
|
57
|
+
def list_templates():
|
|
58
|
+
"""Display available templates."""
|
|
59
|
+
print("\n" + "="*70)
|
|
60
|
+
print("AVAILABLE TREATMENT PLAN TEMPLATES")
|
|
61
|
+
print("="*70)
|
|
62
|
+
|
|
63
|
+
for i, (key, info) in enumerate(TEMPLATES.items(), 1):
|
|
64
|
+
print(f"\n{i}. {info['name']}")
|
|
65
|
+
print(f" Type: {key}")
|
|
66
|
+
print(f" File: {info['file']}")
|
|
67
|
+
print(f" Description: {info['description']}")
|
|
68
|
+
|
|
69
|
+
print("\n" + "="*70)
|
|
70
|
+
|
|
71
|
+
|
|
72
|
+
def interactive_selection():
|
|
73
|
+
"""Interactive template selection."""
|
|
74
|
+
list_templates()
|
|
75
|
+
|
|
76
|
+
while True:
|
|
77
|
+
try:
|
|
78
|
+
choice = input("\nSelect template number (1-6) or 'q' to quit: ").strip().lower()
|
|
79
|
+
|
|
80
|
+
if choice == 'q':
|
|
81
|
+
print("Exiting...")
|
|
82
|
+
sys.exit(0)
|
|
83
|
+
|
|
84
|
+
choice_num = int(choice)
|
|
85
|
+
|
|
86
|
+
if 1 <= choice_num <= len(TEMPLATES):
|
|
87
|
+
template_key = list(TEMPLATES.keys())[choice_num - 1]
|
|
88
|
+
return template_key
|
|
89
|
+
else:
|
|
90
|
+
print(f"Please enter a number between 1 and {len(TEMPLATES)}.")
|
|
91
|
+
except ValueError:
|
|
92
|
+
print("Invalid input. Please enter a number or 'q' to quit.")
|
|
93
|
+
|
|
94
|
+
|
|
95
|
+
def get_output_filename(template_key, custom_name=None):
|
|
96
|
+
"""Generate output filename."""
|
|
97
|
+
if custom_name:
|
|
98
|
+
# Ensure .tex extension
|
|
99
|
+
if not custom_name.endswith('.tex'):
|
|
100
|
+
custom_name += '.tex'
|
|
101
|
+
return custom_name
|
|
102
|
+
|
|
103
|
+
# Default: template_key_YYYYMMDD.tex
|
|
104
|
+
timestamp = datetime.now().strftime('%Y%m%d')
|
|
105
|
+
return f"{template_key}_plan_{timestamp}.tex"
|
|
106
|
+
|
|
107
|
+
|
|
108
|
+
def copy_template(template_key, output_path):
|
|
109
|
+
"""Copy template to output location."""
|
|
110
|
+
templates_dir = get_templates_dir()
|
|
111
|
+
template_file = TEMPLATES[template_key]['file']
|
|
112
|
+
source_path = templates_dir / template_file
|
|
113
|
+
|
|
114
|
+
if not source_path.exists():
|
|
115
|
+
raise FileNotFoundError(f"Template not found: {source_path}")
|
|
116
|
+
|
|
117
|
+
# Create output directory if it doesn't exist
|
|
118
|
+
output_path = Path(output_path)
|
|
119
|
+
output_path.parent.mkdir(parents=True, exist_ok=True)
|
|
120
|
+
|
|
121
|
+
# Copy template
|
|
122
|
+
shutil.copy2(source_path, output_path)
|
|
123
|
+
|
|
124
|
+
return output_path
|
|
125
|
+
|
|
126
|
+
|
|
127
|
+
def display_success(output_path, template_key):
|
|
128
|
+
"""Display success message with next steps."""
|
|
129
|
+
template_info = TEMPLATES[template_key]
|
|
130
|
+
|
|
131
|
+
print("\n" + "="*70)
|
|
132
|
+
print("✓ TEMPLATE GENERATED SUCCESSFULLY")
|
|
133
|
+
print("="*70)
|
|
134
|
+
print(f"\nTemplate: {template_info['name']}")
|
|
135
|
+
print(f"Output file: {output_path}")
|
|
136
|
+
print(f"File size: {os.path.getsize(output_path):,} bytes")
|
|
137
|
+
|
|
138
|
+
print("\n" + "-"*70)
|
|
139
|
+
print("NEXT STEPS:")
|
|
140
|
+
print("-"*70)
|
|
141
|
+
|
|
142
|
+
print("\n1. CUSTOMIZE THE TEMPLATE:")
|
|
143
|
+
print(" - Open the .tex file in your LaTeX editor")
|
|
144
|
+
print(" - Replace all [bracketed placeholders] with patient-specific information")
|
|
145
|
+
print(" - Remove or modify sections as appropriate for your patient")
|
|
146
|
+
|
|
147
|
+
print("\n2. COMPILE TO PDF:")
|
|
148
|
+
print(f" $ pdflatex {output_path.name}")
|
|
149
|
+
|
|
150
|
+
print("\n3. VALIDATE (optional):")
|
|
151
|
+
print(f" $ python check_completeness.py {output_path.name}")
|
|
152
|
+
print(f" $ python validate_treatment_plan.py {output_path.name}")
|
|
153
|
+
|
|
154
|
+
print("\n4. DE-IDENTIFY BEFORE SHARING:")
|
|
155
|
+
print(" - Remove all HIPAA identifiers (18 identifiers)")
|
|
156
|
+
print(" - See regulatory_compliance.md reference for details")
|
|
157
|
+
|
|
158
|
+
print("\n" + "="*70)
|
|
159
|
+
|
|
160
|
+
|
|
161
|
+
def main():
|
|
162
|
+
parser = argparse.ArgumentParser(
|
|
163
|
+
description='Generate treatment plan template',
|
|
164
|
+
formatter_class=argparse.RawDescriptionHelpFormatter,
|
|
165
|
+
epilog="""
|
|
166
|
+
Examples:
|
|
167
|
+
# Interactive mode (recommended for first-time users)
|
|
168
|
+
python generate_template.py
|
|
169
|
+
|
|
170
|
+
# Direct generation with type specification
|
|
171
|
+
python generate_template.py --type general_medical --output diabetes_plan.tex
|
|
172
|
+
|
|
173
|
+
# Generate with default filename
|
|
174
|
+
python generate_template.py --type mental_health
|
|
175
|
+
|
|
176
|
+
# List available templates
|
|
177
|
+
python generate_template.py --list
|
|
178
|
+
|
|
179
|
+
Available template types:
|
|
180
|
+
general_medical, rehabilitation, mental_health, chronic_disease,
|
|
181
|
+
perioperative, pain_management
|
|
182
|
+
"""
|
|
183
|
+
)
|
|
184
|
+
|
|
185
|
+
parser.add_argument(
|
|
186
|
+
'--type',
|
|
187
|
+
choices=list(TEMPLATES.keys()),
|
|
188
|
+
help='Template type to generate'
|
|
189
|
+
)
|
|
190
|
+
|
|
191
|
+
parser.add_argument(
|
|
192
|
+
'--output',
|
|
193
|
+
help='Output filename (default: auto-generated with timestamp)'
|
|
194
|
+
)
|
|
195
|
+
|
|
196
|
+
parser.add_argument(
|
|
197
|
+
'--list',
|
|
198
|
+
action='store_true',
|
|
199
|
+
help='List available templates and exit'
|
|
200
|
+
)
|
|
201
|
+
|
|
202
|
+
args = parser.parse_args()
|
|
203
|
+
|
|
204
|
+
# List templates and exit
|
|
205
|
+
if args.list:
|
|
206
|
+
list_templates()
|
|
207
|
+
return
|
|
208
|
+
|
|
209
|
+
# Determine template type
|
|
210
|
+
if args.type:
|
|
211
|
+
template_key = args.type
|
|
212
|
+
print(f"\nGenerating template: {TEMPLATES[template_key]['name']}")
|
|
213
|
+
else:
|
|
214
|
+
# Interactive mode
|
|
215
|
+
template_key = interactive_selection()
|
|
216
|
+
|
|
217
|
+
# Determine output filename
|
|
218
|
+
if args.output:
|
|
219
|
+
output_filename = args.output
|
|
220
|
+
else:
|
|
221
|
+
output_filename = get_output_filename(template_key)
|
|
222
|
+
|
|
223
|
+
# Default output to current directory
|
|
224
|
+
output_path = Path.cwd() / output_filename
|
|
225
|
+
|
|
226
|
+
# Confirm overwrite if file exists
|
|
227
|
+
if output_path.exists():
|
|
228
|
+
response = input(f"\nFile {output_filename} already exists. Overwrite? (y/n): ").strip().lower()
|
|
229
|
+
if response != 'y':
|
|
230
|
+
print("Cancelled.")
|
|
231
|
+
return
|
|
232
|
+
|
|
233
|
+
# Copy template
|
|
234
|
+
try:
|
|
235
|
+
output_path = copy_template(template_key, output_path)
|
|
236
|
+
display_success(output_path, template_key)
|
|
237
|
+
except Exception as e:
|
|
238
|
+
print(f"\n✗ ERROR: {e}", file=sys.stderr)
|
|
239
|
+
sys.exit(1)
|
|
240
|
+
|
|
241
|
+
|
|
242
|
+
if __name__ == '__main__':
|
|
243
|
+
main()
|
|
244
|
+
|