scientific-writer 2.3.1__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.
Files changed (315) hide show
  1. scientific_writer/.claude/WRITER.md +822 -0
  2. scientific_writer/.claude/settings.local.json +30 -0
  3. scientific_writer/.claude/skills/citation-management/SKILL.md +1046 -0
  4. scientific_writer/.claude/skills/citation-management/assets/bibtex_template.bib +264 -0
  5. scientific_writer/.claude/skills/citation-management/assets/citation_checklist.md +386 -0
  6. scientific_writer/.claude/skills/citation-management/references/bibtex_formatting.md +908 -0
  7. scientific_writer/.claude/skills/citation-management/references/citation_validation.md +794 -0
  8. scientific_writer/.claude/skills/citation-management/references/google_scholar_search.md +725 -0
  9. scientific_writer/.claude/skills/citation-management/references/metadata_extraction.md +870 -0
  10. scientific_writer/.claude/skills/citation-management/references/pubmed_search.md +839 -0
  11. scientific_writer/.claude/skills/citation-management/scripts/doi_to_bibtex.py +204 -0
  12. scientific_writer/.claude/skills/citation-management/scripts/extract_metadata.py +569 -0
  13. scientific_writer/.claude/skills/citation-management/scripts/format_bibtex.py +349 -0
  14. scientific_writer/.claude/skills/citation-management/scripts/search_google_scholar.py +282 -0
  15. scientific_writer/.claude/skills/citation-management/scripts/search_pubmed.py +398 -0
  16. scientific_writer/.claude/skills/citation-management/scripts/validate_citations.py +497 -0
  17. scientific_writer/.claude/skills/clinical-reports/IMPLEMENTATION_SUMMARY.md +641 -0
  18. scientific_writer/.claude/skills/clinical-reports/README.md +236 -0
  19. scientific_writer/.claude/skills/clinical-reports/SKILL.md +1088 -0
  20. scientific_writer/.claude/skills/clinical-reports/assets/case_report_template.md +352 -0
  21. scientific_writer/.claude/skills/clinical-reports/assets/clinical_trial_csr_template.md +353 -0
  22. scientific_writer/.claude/skills/clinical-reports/assets/clinical_trial_sae_template.md +359 -0
  23. scientific_writer/.claude/skills/clinical-reports/assets/consult_note_template.md +305 -0
  24. scientific_writer/.claude/skills/clinical-reports/assets/discharge_summary_template.md +453 -0
  25. scientific_writer/.claude/skills/clinical-reports/assets/hipaa_compliance_checklist.md +395 -0
  26. scientific_writer/.claude/skills/clinical-reports/assets/history_physical_template.md +305 -0
  27. scientific_writer/.claude/skills/clinical-reports/assets/lab_report_template.md +309 -0
  28. scientific_writer/.claude/skills/clinical-reports/assets/pathology_report_template.md +249 -0
  29. scientific_writer/.claude/skills/clinical-reports/assets/quality_checklist.md +338 -0
  30. scientific_writer/.claude/skills/clinical-reports/assets/radiology_report_template.md +318 -0
  31. scientific_writer/.claude/skills/clinical-reports/assets/soap_note_template.md +253 -0
  32. scientific_writer/.claude/skills/clinical-reports/references/case_report_guidelines.md +570 -0
  33. scientific_writer/.claude/skills/clinical-reports/references/clinical_trial_reporting.md +693 -0
  34. scientific_writer/.claude/skills/clinical-reports/references/data_presentation.md +530 -0
  35. scientific_writer/.claude/skills/clinical-reports/references/diagnostic_reports_standards.md +629 -0
  36. scientific_writer/.claude/skills/clinical-reports/references/medical_terminology.md +588 -0
  37. scientific_writer/.claude/skills/clinical-reports/references/patient_documentation.md +744 -0
  38. scientific_writer/.claude/skills/clinical-reports/references/peer_review_standards.md +585 -0
  39. scientific_writer/.claude/skills/clinical-reports/references/regulatory_compliance.md +577 -0
  40. scientific_writer/.claude/skills/clinical-reports/scripts/check_deidentification.py +346 -0
  41. scientific_writer/.claude/skills/clinical-reports/scripts/compliance_checker.py +78 -0
  42. scientific_writer/.claude/skills/clinical-reports/scripts/extract_clinical_data.py +102 -0
  43. scientific_writer/.claude/skills/clinical-reports/scripts/format_adverse_events.py +103 -0
  44. scientific_writer/.claude/skills/clinical-reports/scripts/generate_report_template.py +163 -0
  45. scientific_writer/.claude/skills/clinical-reports/scripts/terminology_validator.py +133 -0
  46. scientific_writer/.claude/skills/clinical-reports/scripts/validate_case_report.py +334 -0
  47. scientific_writer/.claude/skills/clinical-reports/scripts/validate_trial_report.py +89 -0
  48. scientific_writer/.claude/skills/document-skills/docx/LICENSE.txt +30 -0
  49. scientific_writer/.claude/skills/document-skills/docx/SKILL.md +197 -0
  50. scientific_writer/.claude/skills/document-skills/docx/docx-js.md +350 -0
  51. scientific_writer/.claude/skills/document-skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/dml-chart.xsd +1499 -0
  52. scientific_writer/.claude/skills/document-skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/dml-chartDrawing.xsd +146 -0
  53. scientific_writer/.claude/skills/document-skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/dml-diagram.xsd +1085 -0
  54. scientific_writer/.claude/skills/document-skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/dml-lockedCanvas.xsd +11 -0
  55. scientific_writer/.claude/skills/document-skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/dml-main.xsd +3081 -0
  56. scientific_writer/.claude/skills/document-skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/dml-picture.xsd +23 -0
  57. scientific_writer/.claude/skills/document-skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/dml-spreadsheetDrawing.xsd +185 -0
  58. scientific_writer/.claude/skills/document-skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/dml-wordprocessingDrawing.xsd +287 -0
  59. scientific_writer/.claude/skills/document-skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/pml.xsd +1676 -0
  60. scientific_writer/.claude/skills/document-skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-additionalCharacteristics.xsd +28 -0
  61. scientific_writer/.claude/skills/document-skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-bibliography.xsd +144 -0
  62. scientific_writer/.claude/skills/document-skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-commonSimpleTypes.xsd +174 -0
  63. scientific_writer/.claude/skills/document-skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-customXmlDataProperties.xsd +25 -0
  64. scientific_writer/.claude/skills/document-skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-customXmlSchemaProperties.xsd +18 -0
  65. scientific_writer/.claude/skills/document-skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesCustom.xsd +59 -0
  66. scientific_writer/.claude/skills/document-skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesExtended.xsd +56 -0
  67. scientific_writer/.claude/skills/document-skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesVariantTypes.xsd +195 -0
  68. scientific_writer/.claude/skills/document-skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-math.xsd +582 -0
  69. scientific_writer/.claude/skills/document-skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-relationshipReference.xsd +25 -0
  70. scientific_writer/.claude/skills/document-skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/sml.xsd +4439 -0
  71. scientific_writer/.claude/skills/document-skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/vml-main.xsd +570 -0
  72. scientific_writer/.claude/skills/document-skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/vml-officeDrawing.xsd +509 -0
  73. scientific_writer/.claude/skills/document-skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/vml-presentationDrawing.xsd +12 -0
  74. scientific_writer/.claude/skills/document-skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/vml-spreadsheetDrawing.xsd +108 -0
  75. scientific_writer/.claude/skills/document-skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/vml-wordprocessingDrawing.xsd +96 -0
  76. scientific_writer/.claude/skills/document-skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/wml.xsd +3646 -0
  77. scientific_writer/.claude/skills/document-skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/xml.xsd +116 -0
  78. scientific_writer/.claude/skills/document-skills/docx/ooxml/schemas/ecma/fouth-edition/opc-contentTypes.xsd +42 -0
  79. scientific_writer/.claude/skills/document-skills/docx/ooxml/schemas/ecma/fouth-edition/opc-coreProperties.xsd +50 -0
  80. scientific_writer/.claude/skills/document-skills/docx/ooxml/schemas/ecma/fouth-edition/opc-digSig.xsd +49 -0
  81. scientific_writer/.claude/skills/document-skills/docx/ooxml/schemas/ecma/fouth-edition/opc-relationships.xsd +33 -0
  82. scientific_writer/.claude/skills/document-skills/docx/ooxml/schemas/mce/mc.xsd +75 -0
  83. scientific_writer/.claude/skills/document-skills/docx/ooxml/schemas/microsoft/wml-2010.xsd +560 -0
  84. scientific_writer/.claude/skills/document-skills/docx/ooxml/schemas/microsoft/wml-2012.xsd +67 -0
  85. scientific_writer/.claude/skills/document-skills/docx/ooxml/schemas/microsoft/wml-2018.xsd +14 -0
  86. scientific_writer/.claude/skills/document-skills/docx/ooxml/schemas/microsoft/wml-cex-2018.xsd +20 -0
  87. scientific_writer/.claude/skills/document-skills/docx/ooxml/schemas/microsoft/wml-cid-2016.xsd +13 -0
  88. scientific_writer/.claude/skills/document-skills/docx/ooxml/schemas/microsoft/wml-sdtdatahash-2020.xsd +4 -0
  89. scientific_writer/.claude/skills/document-skills/docx/ooxml/schemas/microsoft/wml-symex-2015.xsd +8 -0
  90. scientific_writer/.claude/skills/document-skills/docx/ooxml/scripts/pack.py +159 -0
  91. scientific_writer/.claude/skills/document-skills/docx/ooxml/scripts/unpack.py +29 -0
  92. scientific_writer/.claude/skills/document-skills/docx/ooxml/scripts/validate.py +69 -0
  93. scientific_writer/.claude/skills/document-skills/docx/ooxml/scripts/validation/__init__.py +15 -0
  94. scientific_writer/.claude/skills/document-skills/docx/ooxml/scripts/validation/base.py +951 -0
  95. scientific_writer/.claude/skills/document-skills/docx/ooxml/scripts/validation/docx.py +274 -0
  96. scientific_writer/.claude/skills/document-skills/docx/ooxml/scripts/validation/pptx.py +315 -0
  97. scientific_writer/.claude/skills/document-skills/docx/ooxml/scripts/validation/redlining.py +279 -0
  98. scientific_writer/.claude/skills/document-skills/docx/ooxml.md +610 -0
  99. scientific_writer/.claude/skills/document-skills/docx/scripts/__init__.py +1 -0
  100. scientific_writer/.claude/skills/document-skills/docx/scripts/document.py +1276 -0
  101. scientific_writer/.claude/skills/document-skills/docx/scripts/templates/comments.xml +3 -0
  102. scientific_writer/.claude/skills/document-skills/docx/scripts/templates/commentsExtended.xml +3 -0
  103. scientific_writer/.claude/skills/document-skills/docx/scripts/templates/commentsExtensible.xml +3 -0
  104. scientific_writer/.claude/skills/document-skills/docx/scripts/templates/commentsIds.xml +3 -0
  105. scientific_writer/.claude/skills/document-skills/docx/scripts/templates/people.xml +3 -0
  106. scientific_writer/.claude/skills/document-skills/docx/scripts/utilities.py +374 -0
  107. scientific_writer/.claude/skills/document-skills/pdf/LICENSE.txt +30 -0
  108. scientific_writer/.claude/skills/document-skills/pdf/SKILL.md +294 -0
  109. scientific_writer/.claude/skills/document-skills/pdf/forms.md +205 -0
  110. scientific_writer/.claude/skills/document-skills/pdf/reference.md +612 -0
  111. scientific_writer/.claude/skills/document-skills/pdf/scripts/check_bounding_boxes.py +70 -0
  112. scientific_writer/.claude/skills/document-skills/pdf/scripts/check_bounding_boxes_test.py +226 -0
  113. scientific_writer/.claude/skills/document-skills/pdf/scripts/check_fillable_fields.py +12 -0
  114. scientific_writer/.claude/skills/document-skills/pdf/scripts/convert_pdf_to_images.py +35 -0
  115. scientific_writer/.claude/skills/document-skills/pdf/scripts/create_validation_image.py +41 -0
  116. scientific_writer/.claude/skills/document-skills/pdf/scripts/extract_form_field_info.py +152 -0
  117. scientific_writer/.claude/skills/document-skills/pdf/scripts/fill_fillable_fields.py +114 -0
  118. scientific_writer/.claude/skills/document-skills/pdf/scripts/fill_pdf_form_with_annotations.py +108 -0
  119. scientific_writer/.claude/skills/document-skills/pptx/LICENSE.txt +30 -0
  120. scientific_writer/.claude/skills/document-skills/pptx/SKILL.md +484 -0
  121. scientific_writer/.claude/skills/document-skills/pptx/html2pptx.md +625 -0
  122. scientific_writer/.claude/skills/document-skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/dml-chart.xsd +1499 -0
  123. scientific_writer/.claude/skills/document-skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/dml-chartDrawing.xsd +146 -0
  124. scientific_writer/.claude/skills/document-skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/dml-diagram.xsd +1085 -0
  125. scientific_writer/.claude/skills/document-skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/dml-lockedCanvas.xsd +11 -0
  126. scientific_writer/.claude/skills/document-skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/dml-main.xsd +3081 -0
  127. scientific_writer/.claude/skills/document-skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/dml-picture.xsd +23 -0
  128. scientific_writer/.claude/skills/document-skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/dml-spreadsheetDrawing.xsd +185 -0
  129. scientific_writer/.claude/skills/document-skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/dml-wordprocessingDrawing.xsd +287 -0
  130. scientific_writer/.claude/skills/document-skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/pml.xsd +1676 -0
  131. scientific_writer/.claude/skills/document-skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/shared-additionalCharacteristics.xsd +28 -0
  132. scientific_writer/.claude/skills/document-skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/shared-bibliography.xsd +144 -0
  133. scientific_writer/.claude/skills/document-skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/shared-commonSimpleTypes.xsd +174 -0
  134. scientific_writer/.claude/skills/document-skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/shared-customXmlDataProperties.xsd +25 -0
  135. scientific_writer/.claude/skills/document-skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/shared-customXmlSchemaProperties.xsd +18 -0
  136. scientific_writer/.claude/skills/document-skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesCustom.xsd +59 -0
  137. scientific_writer/.claude/skills/document-skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesExtended.xsd +56 -0
  138. scientific_writer/.claude/skills/document-skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesVariantTypes.xsd +195 -0
  139. scientific_writer/.claude/skills/document-skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/shared-math.xsd +582 -0
  140. scientific_writer/.claude/skills/document-skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/shared-relationshipReference.xsd +25 -0
  141. scientific_writer/.claude/skills/document-skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/sml.xsd +4439 -0
  142. scientific_writer/.claude/skills/document-skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/vml-main.xsd +570 -0
  143. scientific_writer/.claude/skills/document-skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/vml-officeDrawing.xsd +509 -0
  144. scientific_writer/.claude/skills/document-skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/vml-presentationDrawing.xsd +12 -0
  145. scientific_writer/.claude/skills/document-skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/vml-spreadsheetDrawing.xsd +108 -0
  146. scientific_writer/.claude/skills/document-skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/vml-wordprocessingDrawing.xsd +96 -0
  147. scientific_writer/.claude/skills/document-skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/wml.xsd +3646 -0
  148. scientific_writer/.claude/skills/document-skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/xml.xsd +116 -0
  149. scientific_writer/.claude/skills/document-skills/pptx/ooxml/schemas/ecma/fouth-edition/opc-contentTypes.xsd +42 -0
  150. scientific_writer/.claude/skills/document-skills/pptx/ooxml/schemas/ecma/fouth-edition/opc-coreProperties.xsd +50 -0
  151. scientific_writer/.claude/skills/document-skills/pptx/ooxml/schemas/ecma/fouth-edition/opc-digSig.xsd +49 -0
  152. scientific_writer/.claude/skills/document-skills/pptx/ooxml/schemas/ecma/fouth-edition/opc-relationships.xsd +33 -0
  153. scientific_writer/.claude/skills/document-skills/pptx/ooxml/schemas/mce/mc.xsd +75 -0
  154. scientific_writer/.claude/skills/document-skills/pptx/ooxml/schemas/microsoft/wml-2010.xsd +560 -0
  155. scientific_writer/.claude/skills/document-skills/pptx/ooxml/schemas/microsoft/wml-2012.xsd +67 -0
  156. scientific_writer/.claude/skills/document-skills/pptx/ooxml/schemas/microsoft/wml-2018.xsd +14 -0
  157. scientific_writer/.claude/skills/document-skills/pptx/ooxml/schemas/microsoft/wml-cex-2018.xsd +20 -0
  158. scientific_writer/.claude/skills/document-skills/pptx/ooxml/schemas/microsoft/wml-cid-2016.xsd +13 -0
  159. scientific_writer/.claude/skills/document-skills/pptx/ooxml/schemas/microsoft/wml-sdtdatahash-2020.xsd +4 -0
  160. scientific_writer/.claude/skills/document-skills/pptx/ooxml/schemas/microsoft/wml-symex-2015.xsd +8 -0
  161. scientific_writer/.claude/skills/document-skills/pptx/ooxml/scripts/pack.py +159 -0
  162. scientific_writer/.claude/skills/document-skills/pptx/ooxml/scripts/unpack.py +29 -0
  163. scientific_writer/.claude/skills/document-skills/pptx/ooxml/scripts/validate.py +69 -0
  164. scientific_writer/.claude/skills/document-skills/pptx/ooxml/scripts/validation/__init__.py +15 -0
  165. scientific_writer/.claude/skills/document-skills/pptx/ooxml/scripts/validation/base.py +951 -0
  166. scientific_writer/.claude/skills/document-skills/pptx/ooxml/scripts/validation/docx.py +274 -0
  167. scientific_writer/.claude/skills/document-skills/pptx/ooxml/scripts/validation/pptx.py +315 -0
  168. scientific_writer/.claude/skills/document-skills/pptx/ooxml/scripts/validation/redlining.py +279 -0
  169. scientific_writer/.claude/skills/document-skills/pptx/ooxml.md +427 -0
  170. scientific_writer/.claude/skills/document-skills/pptx/scripts/html2pptx.js +979 -0
  171. scientific_writer/.claude/skills/document-skills/pptx/scripts/inventory.py +1020 -0
  172. scientific_writer/.claude/skills/document-skills/pptx/scripts/rearrange.py +231 -0
  173. scientific_writer/.claude/skills/document-skills/pptx/scripts/replace.py +385 -0
  174. scientific_writer/.claude/skills/document-skills/pptx/scripts/thumbnail.py +450 -0
  175. scientific_writer/.claude/skills/document-skills/xlsx/LICENSE.txt +30 -0
  176. scientific_writer/.claude/skills/document-skills/xlsx/SKILL.md +289 -0
  177. scientific_writer/.claude/skills/document-skills/xlsx/recalc.py +178 -0
  178. scientific_writer/.claude/skills/hypothesis-generation/SKILL.md +155 -0
  179. scientific_writer/.claude/skills/hypothesis-generation/assets/hypothesis_output_template.md +302 -0
  180. scientific_writer/.claude/skills/hypothesis-generation/references/experimental_design_patterns.md +327 -0
  181. scientific_writer/.claude/skills/hypothesis-generation/references/hypothesis_quality_criteria.md +196 -0
  182. scientific_writer/.claude/skills/hypothesis-generation/references/literature_search_strategies.md +505 -0
  183. scientific_writer/.claude/skills/latex-posters/README.md +417 -0
  184. scientific_writer/.claude/skills/latex-posters/SKILL.md +919 -0
  185. scientific_writer/.claude/skills/latex-posters/assets/baposter_template.tex +257 -0
  186. scientific_writer/.claude/skills/latex-posters/assets/beamerposter_template.tex +244 -0
  187. scientific_writer/.claude/skills/latex-posters/assets/poster_quality_checklist.md +358 -0
  188. scientific_writer/.claude/skills/latex-posters/assets/tikzposter_template.tex +251 -0
  189. scientific_writer/.claude/skills/latex-posters/references/latex_poster_packages.md +745 -0
  190. scientific_writer/.claude/skills/latex-posters/references/poster_content_guide.md +748 -0
  191. scientific_writer/.claude/skills/latex-posters/references/poster_design_principles.md +806 -0
  192. scientific_writer/.claude/skills/latex-posters/references/poster_layout_design.md +900 -0
  193. scientific_writer/.claude/skills/latex-posters/scripts/review_poster.sh +214 -0
  194. scientific_writer/.claude/skills/literature-review/SKILL.md +546 -0
  195. scientific_writer/.claude/skills/literature-review/assets/review_template.md +412 -0
  196. scientific_writer/.claude/skills/literature-review/references/citation_styles.md +166 -0
  197. scientific_writer/.claude/skills/literature-review/references/database_strategies.md +381 -0
  198. scientific_writer/.claude/skills/literature-review/scripts/generate_pdf.py +176 -0
  199. scientific_writer/.claude/skills/literature-review/scripts/search_databases.py +303 -0
  200. scientific_writer/.claude/skills/literature-review/scripts/verify_citations.py +222 -0
  201. scientific_writer/.claude/skills/markitdown/INSTALLATION_GUIDE.md +318 -0
  202. scientific_writer/.claude/skills/markitdown/LICENSE.txt +22 -0
  203. scientific_writer/.claude/skills/markitdown/OPENROUTER_INTEGRATION.md +359 -0
  204. scientific_writer/.claude/skills/markitdown/QUICK_REFERENCE.md +309 -0
  205. scientific_writer/.claude/skills/markitdown/README.md +184 -0
  206. scientific_writer/.claude/skills/markitdown/SKILL.md +450 -0
  207. scientific_writer/.claude/skills/markitdown/SKILL_SUMMARY.md +307 -0
  208. scientific_writer/.claude/skills/markitdown/assets/example_usage.md +463 -0
  209. scientific_writer/.claude/skills/markitdown/references/api_reference.md +399 -0
  210. scientific_writer/.claude/skills/markitdown/references/file_formats.md +542 -0
  211. scientific_writer/.claude/skills/markitdown/scripts/batch_convert.py +228 -0
  212. scientific_writer/.claude/skills/markitdown/scripts/convert_literature.py +283 -0
  213. scientific_writer/.claude/skills/markitdown/scripts/convert_with_ai.py +243 -0
  214. scientific_writer/.claude/skills/paper-2-web/SKILL.md +455 -0
  215. scientific_writer/.claude/skills/paper-2-web/references/installation.md +141 -0
  216. scientific_writer/.claude/skills/paper-2-web/references/paper2poster.md +346 -0
  217. scientific_writer/.claude/skills/paper-2-web/references/paper2video.md +305 -0
  218. scientific_writer/.claude/skills/paper-2-web/references/paper2web.md +187 -0
  219. scientific_writer/.claude/skills/paper-2-web/references/usage_examples.md +436 -0
  220. scientific_writer/.claude/skills/peer-review/SKILL.md +375 -0
  221. scientific_writer/.claude/skills/peer-review/references/common_issues.md +552 -0
  222. scientific_writer/.claude/skills/peer-review/references/reporting_standards.md +290 -0
  223. scientific_writer/.claude/skills/research-grants/README.md +285 -0
  224. scientific_writer/.claude/skills/research-grants/SKILL.md +896 -0
  225. scientific_writer/.claude/skills/research-grants/assets/budget_justification_template.md +453 -0
  226. scientific_writer/.claude/skills/research-grants/assets/nih_specific_aims_template.md +166 -0
  227. scientific_writer/.claude/skills/research-grants/assets/nsf_project_summary_template.md +92 -0
  228. scientific_writer/.claude/skills/research-grants/references/broader_impacts.md +392 -0
  229. scientific_writer/.claude/skills/research-grants/references/darpa_guidelines.md +636 -0
  230. scientific_writer/.claude/skills/research-grants/references/doe_guidelines.md +586 -0
  231. scientific_writer/.claude/skills/research-grants/references/nih_guidelines.md +851 -0
  232. scientific_writer/.claude/skills/research-grants/references/nsf_guidelines.md +570 -0
  233. scientific_writer/.claude/skills/research-grants/references/specific_aims_guide.md +458 -0
  234. scientific_writer/.claude/skills/research-lookup/README.md +116 -0
  235. scientific_writer/.claude/skills/research-lookup/SKILL.md +443 -0
  236. scientific_writer/.claude/skills/research-lookup/examples.py +174 -0
  237. scientific_writer/.claude/skills/research-lookup/lookup.py +93 -0
  238. scientific_writer/.claude/skills/research-lookup/research_lookup.py +335 -0
  239. scientific_writer/.claude/skills/research-lookup/scripts/research_lookup.py +261 -0
  240. scientific_writer/.claude/skills/scholar-evaluation/SKILL.md +254 -0
  241. scientific_writer/.claude/skills/scholar-evaluation/references/evaluation_framework.md +663 -0
  242. scientific_writer/.claude/skills/scholar-evaluation/scripts/calculate_scores.py +378 -0
  243. scientific_writer/.claude/skills/scientific-critical-thinking/SKILL.md +530 -0
  244. scientific_writer/.claude/skills/scientific-critical-thinking/references/common_biases.md +364 -0
  245. scientific_writer/.claude/skills/scientific-critical-thinking/references/evidence_hierarchy.md +484 -0
  246. scientific_writer/.claude/skills/scientific-critical-thinking/references/experimental_design.md +496 -0
  247. scientific_writer/.claude/skills/scientific-critical-thinking/references/logical_fallacies.md +478 -0
  248. scientific_writer/.claude/skills/scientific-critical-thinking/references/scientific_method.md +169 -0
  249. scientific_writer/.claude/skills/scientific-critical-thinking/references/statistical_pitfalls.md +506 -0
  250. scientific_writer/.claude/skills/scientific-schematics/SKILL.md +2035 -0
  251. scientific_writer/.claude/skills/scientific-schematics/assets/block_diagram_template.tex +199 -0
  252. scientific_writer/.claude/skills/scientific-schematics/assets/circuit_template.tex +159 -0
  253. scientific_writer/.claude/skills/scientific-schematics/assets/flowchart_template.tex +161 -0
  254. scientific_writer/.claude/skills/scientific-schematics/assets/pathway_template.tex +162 -0
  255. scientific_writer/.claude/skills/scientific-schematics/assets/tikz_styles.tex +422 -0
  256. scientific_writer/.claude/skills/scientific-schematics/references/best_practices.md +562 -0
  257. scientific_writer/.claude/skills/scientific-schematics/references/diagram_types.md +637 -0
  258. scientific_writer/.claude/skills/scientific-schematics/references/python_libraries.md +791 -0
  259. scientific_writer/.claude/skills/scientific-schematics/references/tikz_guide.md +734 -0
  260. scientific_writer/.claude/skills/scientific-schematics/scripts/circuit_generator.py +307 -0
  261. scientific_writer/.claude/skills/scientific-schematics/scripts/compile_tikz.py +292 -0
  262. scientific_writer/.claude/skills/scientific-schematics/scripts/generate_flowchart.py +281 -0
  263. scientific_writer/.claude/skills/scientific-schematics/scripts/pathway_diagram.py +406 -0
  264. scientific_writer/.claude/skills/scientific-writing/SKILL.md +443 -0
  265. scientific_writer/.claude/skills/scientific-writing/references/citation_styles.md +720 -0
  266. scientific_writer/.claude/skills/scientific-writing/references/figures_tables.md +806 -0
  267. scientific_writer/.claude/skills/scientific-writing/references/imrad_structure.md +658 -0
  268. scientific_writer/.claude/skills/scientific-writing/references/reporting_guidelines.md +748 -0
  269. scientific_writer/.claude/skills/scientific-writing/references/writing_principles.md +824 -0
  270. scientific_writer/.claude/skills/treatment-plans/README.md +488 -0
  271. scientific_writer/.claude/skills/treatment-plans/SKILL.md +1536 -0
  272. scientific_writer/.claude/skills/treatment-plans/assets/STYLING_QUICK_REFERENCE.md +185 -0
  273. scientific_writer/.claude/skills/treatment-plans/assets/chronic_disease_management_plan.tex +665 -0
  274. scientific_writer/.claude/skills/treatment-plans/assets/general_medical_treatment_plan.tex +547 -0
  275. scientific_writer/.claude/skills/treatment-plans/assets/medical_treatment_plan.sty +222 -0
  276. scientific_writer/.claude/skills/treatment-plans/assets/mental_health_treatment_plan.tex +774 -0
  277. scientific_writer/.claude/skills/treatment-plans/assets/one_page_treatment_plan.tex +193 -0
  278. scientific_writer/.claude/skills/treatment-plans/assets/pain_management_plan.tex +799 -0
  279. scientific_writer/.claude/skills/treatment-plans/assets/perioperative_care_plan.tex +753 -0
  280. scientific_writer/.claude/skills/treatment-plans/assets/quality_checklist.md +471 -0
  281. scientific_writer/.claude/skills/treatment-plans/assets/rehabilitation_treatment_plan.tex +756 -0
  282. scientific_writer/.claude/skills/treatment-plans/references/goal_setting_frameworks.md +411 -0
  283. scientific_writer/.claude/skills/treatment-plans/references/intervention_guidelines.md +507 -0
  284. scientific_writer/.claude/skills/treatment-plans/references/regulatory_compliance.md +476 -0
  285. scientific_writer/.claude/skills/treatment-plans/references/specialty_specific_guidelines.md +655 -0
  286. scientific_writer/.claude/skills/treatment-plans/references/treatment_plan_standards.md +485 -0
  287. scientific_writer/.claude/skills/treatment-plans/scripts/check_completeness.py +318 -0
  288. scientific_writer/.claude/skills/treatment-plans/scripts/generate_template.py +244 -0
  289. scientific_writer/.claude/skills/treatment-plans/scripts/timeline_generator.py +369 -0
  290. scientific_writer/.claude/skills/treatment-plans/scripts/validate_treatment_plan.py +367 -0
  291. scientific_writer/.claude/skills/venue-templates/SKILL.md +590 -0
  292. scientific_writer/.claude/skills/venue-templates/assets/grants/nih_specific_aims.tex +235 -0
  293. scientific_writer/.claude/skills/venue-templates/assets/grants/nsf_proposal_template.tex +375 -0
  294. scientific_writer/.claude/skills/venue-templates/assets/journals/nature_article.tex +171 -0
  295. scientific_writer/.claude/skills/venue-templates/assets/journals/neurips_article.tex +283 -0
  296. scientific_writer/.claude/skills/venue-templates/assets/journals/plos_one.tex +317 -0
  297. scientific_writer/.claude/skills/venue-templates/assets/posters/beamerposter_academic.tex +311 -0
  298. scientific_writer/.claude/skills/venue-templates/references/conferences_formatting.md +564 -0
  299. scientific_writer/.claude/skills/venue-templates/references/grants_requirements.md +787 -0
  300. scientific_writer/.claude/skills/venue-templates/references/journals_formatting.md +486 -0
  301. scientific_writer/.claude/skills/venue-templates/references/posters_guidelines.md +628 -0
  302. scientific_writer/.claude/skills/venue-templates/scripts/customize_template.py +206 -0
  303. scientific_writer/.claude/skills/venue-templates/scripts/query_template.py +260 -0
  304. scientific_writer/.claude/skills/venue-templates/scripts/validate_format.py +255 -0
  305. scientific_writer/__init__.py +43 -0
  306. scientific_writer/api.py +393 -0
  307. scientific_writer/cli.py +326 -0
  308. scientific_writer/core.py +275 -0
  309. scientific_writer/models.py +76 -0
  310. scientific_writer/utils.py +289 -0
  311. scientific_writer-2.3.1.dist-info/METADATA +272 -0
  312. scientific_writer-2.3.1.dist-info/RECORD +315 -0
  313. scientific_writer-2.3.1.dist-info/WHEEL +4 -0
  314. scientific_writer-2.3.1.dist-info/entry_points.txt +2 -0
  315. scientific_writer-2.3.1.dist-info/licenses/LICENSE +22 -0
@@ -0,0 +1,346 @@
1
+ #!/usr/bin/env python3
2
+ """
3
+ Check clinical reports for HIPAA identifiers that need removal.
4
+
5
+ Scans text for 18 HIPAA identifiers and flags potential privacy violations.
6
+
7
+ Usage:
8
+ python check_deidentification.py <input_file>
9
+ python check_deidentification.py <input_file> --output violations.json
10
+ """
11
+
12
+ import argparse
13
+ import json
14
+ import re
15
+ from pathlib import Path
16
+ from typing import Dict, List
17
+
18
+
19
+ # 18 HIPAA Identifiers patterns
20
+ HIPAA_IDENTIFIERS = {
21
+ "1_names": {
22
+ "description": "Names (patient, family, providers)",
23
+ "patterns": [
24
+ r"\b(Dr\.|Mr\.|Mrs\.|Ms\.)\s+[A-Z][a-z]+",
25
+ r"\b[A-Z][a-z]+,\s+[A-Z][a-z]+\b", # Last, First
26
+ ],
27
+ "severity": "HIGH"
28
+ },
29
+ "2_geographic": {
30
+ "description": "Geographic subdivisions smaller than state",
31
+ "patterns": [
32
+ r"\b\d+\s+[A-Z][a-z]+\s+(Street|St|Avenue|Ave|Road|Rd|Boulevard|Blvd|Lane|Ln|Drive|Dr)\b",
33
+ r"\b[A-Z][a-z]+,\s+[A-Z]{2}\s+\d{5}\b", # City, ST ZIP
34
+ ],
35
+ "severity": "HIGH"
36
+ },
37
+ "3_dates": {
38
+ "description": "Dates (except year)",
39
+ "patterns": [
40
+ r"\b(0?[1-9]|1[0-2])/(0?[1-9]|[12][0-9]|3[01])/\d{4}\b",
41
+ r"\b(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)[a-z]*\s+\d{1,2},\s+\d{4}\b",
42
+ r"\b\d{1,2}\s+(January|February|March|April|May|June|July|August|September|October|November|December)\s+\d{4}\b",
43
+ ],
44
+ "severity": "HIGH"
45
+ },
46
+ "4_telephone": {
47
+ "description": "Telephone numbers",
48
+ "patterns": [
49
+ r"\b\(?\d{3}\)?[-.\s]?\d{3}[-.\s]?\d{4}\b",
50
+ r"\b1-\d{3}-\d{3}-\d{4}\b",
51
+ ],
52
+ "severity": "HIGH"
53
+ },
54
+ "5_fax": {
55
+ "description": "Fax numbers",
56
+ "patterns": [
57
+ r"(?i)fax[:]\s*\(?\d{3}\)?[-.\s]?\d{3}[-.\s]?\d{4}",
58
+ ],
59
+ "severity": "HIGH"
60
+ },
61
+ "6_email": {
62
+ "description": "Email addresses",
63
+ "patterns": [
64
+ r"\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Z|a-z]{2,}\b",
65
+ ],
66
+ "severity": "HIGH"
67
+ },
68
+ "7_ssn": {
69
+ "description": "Social Security numbers",
70
+ "patterns": [
71
+ r"\b\d{3}-\d{2}-\d{4}\b",
72
+ r"\b\d{9}\b",
73
+ ],
74
+ "severity": "CRITICAL"
75
+ },
76
+ "8_mrn": {
77
+ "description": "Medical record numbers",
78
+ "patterns": [
79
+ r"(?i)(mrn|medical\s+record\s+(number|#))[:]\s*\d+",
80
+ r"(?i)patient\s+id[:]\s*\d+",
81
+ ],
82
+ "severity": "HIGH"
83
+ },
84
+ "9_health_plan": {
85
+ "description": "Health plan beneficiary numbers",
86
+ "patterns": [
87
+ r"(?i)(insurance|policy)\s+(number|#|id)[:]\s*[A-Z0-9]+",
88
+ ],
89
+ "severity": "HIGH"
90
+ },
91
+ "10_account": {
92
+ "description": "Account numbers",
93
+ "patterns": [
94
+ r"(?i)account\s+(number|#)[:]\s*\d+",
95
+ ],
96
+ "severity": "MEDIUM"
97
+ },
98
+ "11_license": {
99
+ "description": "Certificate/license numbers",
100
+ "patterns": [
101
+ r"(?i)(driver[']?s\s+license|DL)[:]\s*[A-Z0-9]+",
102
+ ],
103
+ "severity": "MEDIUM"
104
+ },
105
+ "12_vehicle": {
106
+ "description": "Vehicle identifiers",
107
+ "patterns": [
108
+ r"(?i)(license\s+plate|VIN)[:]\s*[A-Z0-9]+",
109
+ ],
110
+ "severity": "MEDIUM"
111
+ },
112
+ "13_device": {
113
+ "description": "Device identifiers and serial numbers",
114
+ "patterns": [
115
+ r"(?i)(serial|device)\s+(number|#)[:]\s*[A-Z0-9-]+",
116
+ ],
117
+ "severity": "MEDIUM"
118
+ },
119
+ "14_url": {
120
+ "description": "Web URLs",
121
+ "patterns": [
122
+ r"https?://[^\s]+",
123
+ r"www\.[^\s]+",
124
+ ],
125
+ "severity": "MEDIUM"
126
+ },
127
+ "15_ip": {
128
+ "description": "IP addresses",
129
+ "patterns": [
130
+ r"\b\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\b",
131
+ ],
132
+ "severity": "HIGH"
133
+ },
134
+ "16_biometric": {
135
+ "description": "Biometric identifiers",
136
+ "patterns": [
137
+ r"(?i)(fingerprint|voiceprint|retinal\s+scan)",
138
+ ],
139
+ "severity": "CRITICAL"
140
+ },
141
+ "17_photos": {
142
+ "description": "Full-face photographs",
143
+ "patterns": [
144
+ r"(?i)(photograph|photo|image).*face",
145
+ r"\.(jpg|jpeg|png|gif)\b",
146
+ ],
147
+ "severity": "HIGH"
148
+ },
149
+ "18_unique": {
150
+ "description": "Any other unique identifying characteristic",
151
+ "patterns": [
152
+ r"(?i)(tattoo|birthmark|scar).*unique",
153
+ ],
154
+ "severity": "MEDIUM"
155
+ },
156
+ }
157
+
158
+
159
+ def check_identifiers(text: str) -> Dict:
160
+ """Check text for HIPAA identifiers."""
161
+ violations = {}
162
+ total_issues = 0
163
+
164
+ for identifier_id, config in HIPAA_IDENTIFIERS.items():
165
+ matches = []
166
+ for pattern in config["patterns"]:
167
+ found = re.findall(pattern, text, re.IGNORECASE)
168
+ matches.extend(found)
169
+
170
+ if matches:
171
+ # Remove duplicates, limit to first 5 examples
172
+ unique_matches = list(set(matches))[:5]
173
+ violations[identifier_id] = {
174
+ "description": config["description"],
175
+ "severity": config["severity"],
176
+ "count": len(matches),
177
+ "examples": unique_matches
178
+ }
179
+ total_issues += len(matches)
180
+
181
+ return {
182
+ "total_violations": len(violations),
183
+ "total_instances": total_issues,
184
+ "violations": violations
185
+ }
186
+
187
+
188
+ def check_age_compliance(text: str) -> Dict:
189
+ """Check if ages >89 are properly aggregated."""
190
+ age_pattern = r"\b(\d{2,3})\s*(?:year|yr)s?[\s-]?old\b"
191
+ ages = [int(age) for age in re.findall(age_pattern, text, re.IGNORECASE)]
192
+
193
+ violations = [age for age in ages if age > 89]
194
+
195
+ return {
196
+ "ages_over_89": len(violations),
197
+ "examples": violations[:5] if violations else [],
198
+ "compliant": len(violations) == 0
199
+ }
200
+
201
+
202
+ def generate_report(filename: str) -> Dict:
203
+ """Generate de-identification compliance report."""
204
+ filepath = Path(filename)
205
+
206
+ if not filepath.exists():
207
+ raise FileNotFoundError(f"File not found: {filename}")
208
+
209
+ with open(filepath, 'r', encoding='utf-8') as f:
210
+ text = f.read()
211
+
212
+ identifier_check = check_identifiers(text)
213
+ age_check = check_age_compliance(text)
214
+
215
+ # Determine overall compliance
216
+ critical_violations = sum(
217
+ 1 for v in identifier_check["violations"].values()
218
+ if v["severity"] == "CRITICAL"
219
+ )
220
+ high_violations = sum(
221
+ 1 for v in identifier_check["violations"].values()
222
+ if v["severity"] == "HIGH"
223
+ )
224
+
225
+ if critical_violations > 0 or high_violations >= 3:
226
+ status = "NON_COMPLIANT"
227
+ elif high_violations > 0 or not age_check["compliant"]:
228
+ status = "NEEDS_REVIEW"
229
+ else:
230
+ status = "COMPLIANT"
231
+
232
+ report = {
233
+ "filename": str(filename),
234
+ "status": status,
235
+ "identifier_violations": identifier_check,
236
+ "age_compliance": age_check,
237
+ "recommendation": get_recommendation(status, identifier_check, age_check)
238
+ }
239
+
240
+ return report
241
+
242
+
243
+ def get_recommendation(status: str, identifiers: Dict, ages: Dict) -> str:
244
+ """Generate recommendation based on findings."""
245
+ if status == "COMPLIANT":
246
+ return "Document appears compliant. Perform final manual review before publication."
247
+
248
+ recommendations = []
249
+
250
+ if identifiers["total_violations"] > 0:
251
+ recommendations.append(
252
+ f"Remove or redact {identifiers['total_instances']} identified HIPAA identifiers."
253
+ )
254
+
255
+ if not ages["compliant"]:
256
+ recommendations.append(
257
+ f"Aggregate {ages['ages_over_89']} age(s) >89 years to '90 or older' or '>89 years'."
258
+ )
259
+
260
+ return " ".join(recommendations)
261
+
262
+
263
+ def print_report(report: Dict):
264
+ """Print human-readable report."""
265
+ print("=" * 70)
266
+ print("HIPAA DE-IDENTIFICATION CHECK")
267
+ print(f"File: {report['filename']}")
268
+ print("=" * 70)
269
+ print()
270
+
271
+ print(f"Overall Status: {report['status']}")
272
+ print()
273
+
274
+ if report["identifier_violations"]["total_violations"] == 0:
275
+ print("✓ No HIPAA identifiers detected")
276
+ else:
277
+ print(f"⚠ Found {report['identifier_violations']['total_violations']} types of violations")
278
+ print(f" Total instances: {report['identifier_violations']['total_instances']}")
279
+ print()
280
+
281
+ print("Violations by type:")
282
+ print("-" * 70)
283
+
284
+ for id_type, details in sorted(
285
+ report["identifier_violations"]["violations"].items(),
286
+ key=lambda x: {"CRITICAL": 0, "HIGH": 1, "MEDIUM": 2}[x[1]["severity"]]
287
+ ):
288
+ severity_symbol = "⚠⚠⚠" if details["severity"] == "CRITICAL" else "⚠⚠" if details["severity"] == "HIGH" else "⚠"
289
+ print(f"{severity_symbol} [{details['severity']:8}] {details['description']}")
290
+ print(f" Count: {details['count']}")
291
+ print(f" Examples:")
292
+ for example in details["examples"]:
293
+ print(f" - {example}")
294
+ print()
295
+
296
+ age_check = report["age_compliance"]
297
+ if age_check["compliant"]:
298
+ print("✓ Age reporting compliant (no ages >89 or properly aggregated)")
299
+ else:
300
+ print(f"⚠ Age compliance issue: {age_check['ages_over_89']} age(s) >89 detected")
301
+ print(f" Ages must be aggregated to '90 or older' or '>89 years'")
302
+ print(f" Ages found: {age_check['examples']}")
303
+
304
+ print()
305
+ print("Recommendation:")
306
+ print(report["recommendation"])
307
+ print("=" * 70)
308
+
309
+
310
+ def main():
311
+ """Main entry point."""
312
+ parser = argparse.ArgumentParser(
313
+ description="Check clinical reports for HIPAA identifiers"
314
+ )
315
+ parser.add_argument("input_file", help="Path to clinical report file")
316
+ parser.add_argument("--output", "-o", help="Output JSON report to file")
317
+ parser.add_argument("--json", action="store_true", help="Output JSON to stdout")
318
+
319
+ args = parser.parse_args()
320
+
321
+ try:
322
+ report = generate_report(args.input_file)
323
+
324
+ if args.json:
325
+ print(json.dumps(report, indent=2))
326
+ else:
327
+ print_report(report)
328
+
329
+ if args.output:
330
+ with open(args.output, 'w') as f:
331
+ json.dump(report, f, indent=2)
332
+ print(f"\nJSON report saved to: {args.output}")
333
+
334
+ # Exit with non-zero if violations found
335
+ exit_code = 0 if report["status"] == "COMPLIANT" else 1
336
+ return exit_code
337
+
338
+ except Exception as e:
339
+ print(f"Error: {e}")
340
+ return 1
341
+
342
+
343
+ if __name__ == "__main__":
344
+ import sys
345
+ sys.exit(main())
346
+
@@ -0,0 +1,78 @@
1
+ #!/usr/bin/env python3
2
+ """
3
+ Check clinical reports for regulatory compliance (HIPAA, GCP, FDA).
4
+
5
+ Usage:
6
+ python compliance_checker.py <report_file>
7
+ """
8
+
9
+ import argparse
10
+ import json
11
+ import re
12
+
13
+
14
+ COMPLIANCE_CHECKS = {
15
+ "hipaa": {
16
+ "consent_statement": r"(?i)(informed\s+consent|written\s+consent).*obtained",
17
+ "deidentification": r"(?i)(de-identif|anonymi[sz])",
18
+ },
19
+ "gcp": {
20
+ "irb_approval": r"(?i)(IRB|IEC|ethics\s+committee).*approv",
21
+ "protocol_compliance": r"(?i)protocol",
22
+ "informed_consent": r"(?i)informed\s+consent",
23
+ },
24
+ "fda": {
25
+ "study_id": r"(?i)(IND|IDE|protocol)\s+(number|#)[:]\s*\S+",
26
+ "safety_reporting": r"(?i)(adverse\s+event|SAE)",
27
+ }
28
+ }
29
+
30
+
31
+ def check_compliance(filename: str) -> dict:
32
+ """Check regulatory compliance."""
33
+ with open(filename, 'r', encoding='utf-8') as f:
34
+ content = f.read()
35
+
36
+ results = {}
37
+ for regulation, checks in COMPLIANCE_CHECKS.items():
38
+ reg_results = {}
39
+ for check_name, pattern in checks.items():
40
+ reg_results[check_name] = bool(re.search(pattern, content))
41
+ results[regulation] = reg_results
42
+
43
+ return {"filename": filename, "compliance": results}
44
+
45
+
46
+ def main():
47
+ """Main entry point."""
48
+ parser = argparse.ArgumentParser(description="Check regulatory compliance")
49
+ parser.add_argument("input_file", help="Path to clinical report")
50
+ parser.add_argument("--json", action="store_true")
51
+
52
+ args = parser.parse_args()
53
+
54
+ try:
55
+ report = check_compliance(args.input_file)
56
+
57
+ if args.json:
58
+ print(json.dumps(report, indent=2))
59
+ else:
60
+ print("\nRegulatory Compliance Check:\n")
61
+ for reg, checks in report["compliance"].items():
62
+ print(f"{reg.upper()}:")
63
+ for check, passed in checks.items():
64
+ symbol = "✓" if passed else "✗"
65
+ print(f" {symbol} {check}")
66
+ print()
67
+
68
+ return 0
69
+
70
+ except Exception as e:
71
+ print(f"Error: {e}")
72
+ return 1
73
+
74
+
75
+ if __name__ == "__main__":
76
+ import sys
77
+ sys.exit(main())
78
+
@@ -0,0 +1,102 @@
1
+ #!/usr/bin/env python3
2
+ """
3
+ Extract structured clinical data from reports.
4
+
5
+ Usage:
6
+ python extract_clinical_data.py <report_file>
7
+ """
8
+
9
+ import argparse
10
+ import json
11
+ import re
12
+
13
+
14
+ def extract_vital_signs(content: str) -> dict:
15
+ """Extract vital signs."""
16
+ vitals = {}
17
+ patterns = {
18
+ "temperature": r"(?i)temp(?:erature)?[:]\s*([\d.]+)\s*°?F",
19
+ "bp": r"(?i)BP[:]\s*(\d+/\d+)",
20
+ "hr": r"(?i)HR[:]\s*(\d+)",
21
+ "rr": r"(?i)RR[:]\s*(\d+)",
22
+ "spo2": r"(?i)SpO2[:]\s*([\d.]+)%",
23
+ }
24
+
25
+ for vital, pattern in patterns.items():
26
+ match = re.search(pattern, content)
27
+ if match:
28
+ vitals[vital] = match.group(1)
29
+
30
+ return vitals
31
+
32
+
33
+ def extract_demographics(content: str) -> dict:
34
+ """Extract patient demographics."""
35
+ demographics = {}
36
+ patterns = {
37
+ "age": r"(?i)(\d+)[\s-]year[\s-]old",
38
+ "sex": r"(?i)(male|female|M|F)",
39
+ }
40
+
41
+ for demo, pattern in patterns.items():
42
+ match = re.search(pattern, content)
43
+ if match:
44
+ demographics[demo] = match.group(1)
45
+
46
+ return demographics
47
+
48
+
49
+ def extract_medications(content: str) -> list:
50
+ """Extract medication list."""
51
+ meds = []
52
+ # Simple pattern for common medication format
53
+ pattern = r"(?i)(\w+)\s+(\d+\s*mg)\s+(PO|IV|SC)\s+(daily|BID|TID|QID)"
54
+ matches = re.findall(pattern, content)
55
+
56
+ for match in matches:
57
+ meds.append({
58
+ "drug": match[0],
59
+ "dose": match[1],
60
+ "route": match[2],
61
+ "frequency": match[3]
62
+ })
63
+
64
+ return meds
65
+
66
+
67
+ def main():
68
+ """Main entry point."""
69
+ parser = argparse.ArgumentParser(description="Extract clinical data")
70
+ parser.add_argument("input_file", help="Path to clinical report")
71
+ parser.add_argument("--output", "-o", help="Output JSON file")
72
+
73
+ args = parser.parse_args()
74
+
75
+ try:
76
+ with open(args.input_file, 'r', encoding='utf-8') as f:
77
+ content = f.read()
78
+
79
+ extracted_data = {
80
+ "demographics": extract_demographics(content),
81
+ "vital_signs": extract_vital_signs(content),
82
+ "medications": extract_medications(content),
83
+ }
84
+
85
+ if args.output:
86
+ with open(args.output, 'w') as f:
87
+ json.dump(extracted_data, f, indent=2)
88
+ print(f"✓ Data extracted to: {args.output}")
89
+ else:
90
+ print(json.dumps(extracted_data, indent=2))
91
+
92
+ return 0
93
+
94
+ except Exception as e:
95
+ print(f"Error: {e}")
96
+ return 1
97
+
98
+
99
+ if __name__ == "__main__":
100
+ import sys
101
+ sys.exit(main())
102
+
@@ -0,0 +1,103 @@
1
+ #!/usr/bin/env python3
2
+ """
3
+ Format adverse event data into tables for clinical trial reports.
4
+
5
+ Converts CSV or structured data into formatted AE summary tables.
6
+
7
+ Usage:
8
+ python format_adverse_events.py <ae_data.csv>
9
+ """
10
+
11
+ import argparse
12
+ import csv
13
+ from collections import defaultdict
14
+ from pathlib import Path
15
+
16
+
17
+ def format_ae_summary_table(data: list) -> str:
18
+ """Generate AE summary table in markdown format."""
19
+ # Group by treatment arm
20
+ arm_stats = defaultdict(lambda: {
21
+ 'total': 0,
22
+ 'any_ae': 0,
23
+ 'related_ae': 0,
24
+ 'sae': 0,
25
+ 'deaths': 0,
26
+ 'discontinuations': 0
27
+ })
28
+
29
+ for row in data:
30
+ arm = row.get('treatment_arm', 'Unknown')
31
+ arm_stats[arm]['total'] += 1
32
+
33
+ if row.get('any_ae', '').lower() == 'yes':
34
+ arm_stats[arm]['any_ae'] += 1
35
+ if row.get('related', '').lower() == 'yes':
36
+ arm_stats[arm]['related_ae'] += 1
37
+ if row.get('serious', '').lower() == 'yes':
38
+ arm_stats[arm]['sae'] += 1
39
+ if row.get('fatal', '').lower() == 'yes':
40
+ arm_stats[arm]['deaths'] += 1
41
+ if row.get('discontinuation', '').lower() == 'yes':
42
+ arm_stats[arm]['discontinuations'] += 1
43
+
44
+ # Generate table
45
+ table = "| Category | " + " | ".join(arm_stats.keys()) + " |\n"
46
+ table += "|----------|" + "|".join(["--------"] * len(arm_stats)) + "|\n"
47
+
48
+ categories = [
49
+ ('Total N', 'total'),
50
+ ('Any AE', 'any_ae'),
51
+ ('Treatment-related AE', 'related_ae'),
52
+ ('Serious AE', 'sae'),
53
+ ('Deaths', 'deaths'),
54
+ ('Discontinuation due to AE', 'discontinuations')
55
+ ]
56
+
57
+ for cat_name, cat_key in categories:
58
+ row_data = [cat_name]
59
+ for arm_data in arm_stats.values():
60
+ count = arm_data[cat_key]
61
+ total = arm_data['total']
62
+ pct = (count / total * 100) if total > 0 and cat_key != 'total' else 0
63
+ value = f"{count}" if cat_key == 'total' else f"{count} ({pct:.1f}%)"
64
+ row_data.append(value)
65
+ table += "| " + " | ".join(row_data) + " |\n"
66
+
67
+ return table
68
+
69
+
70
+ def main():
71
+ """Main entry point."""
72
+ parser = argparse.ArgumentParser(description="Format AE data into tables")
73
+ parser.add_argument("input_file", help="Path to AE data CSV")
74
+ parser.add_argument("--output", "-o", help="Output markdown file")
75
+
76
+ args = parser.parse_args()
77
+
78
+ try:
79
+ with open(args.input_file, 'r') as f:
80
+ reader = csv.DictReader(f)
81
+ data = list(reader)
82
+
83
+ table = format_ae_summary_table(data)
84
+
85
+ if args.output:
86
+ with open(args.output, 'w') as f:
87
+ f.write(table)
88
+ print(f"✓ Table saved to: {args.output}")
89
+ else:
90
+ print("\nAdverse Events Summary Table:\n")
91
+ print(table)
92
+
93
+ return 0
94
+
95
+ except Exception as e:
96
+ print(f"Error: {e}")
97
+ return 1
98
+
99
+
100
+ if __name__ == "__main__":
101
+ import sys
102
+ sys.exit(main())
103
+