scientific-writer 2.2.1__py3-none-any.whl → 2.2.3__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/WRITER.md +748 -0
- 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/__init__.py +1 -1
- scientific_writer/api.py +9 -5
- scientific_writer/cli.py +9 -5
- scientific_writer/core.py +28 -5
- {scientific_writer-2.2.1.dist-info → scientific_writer-2.2.3.dist-info}/METADATA +1 -1
- scientific_writer-2.2.3.dist-info/RECORD +312 -0
- scientific_writer-2.2.1.dist-info/RECORD +0 -11
- {scientific_writer-2.2.1.dist-info → scientific_writer-2.2.3.dist-info}/WHEEL +0 -0
- {scientific_writer-2.2.1.dist-info → scientific_writer-2.2.3.dist-info}/entry_points.txt +0 -0
- {scientific_writer-2.2.1.dist-info → scientific_writer-2.2.3.dist-info}/licenses/LICENSE +0 -0
|
@@ -0,0 +1,255 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
"""
|
|
3
|
+
Validate Format Script
|
|
4
|
+
Check if document meets venue-specific formatting requirements.
|
|
5
|
+
|
|
6
|
+
Usage:
|
|
7
|
+
python validate_format.py --file my_paper.pdf --venue "Nature" --check-all
|
|
8
|
+
python validate_format.py --file my_paper.pdf --venue "NeurIPS" --check page-count,margins
|
|
9
|
+
python validate_format.py --file my_paper.pdf --venue "PLOS ONE" --report validation_report.txt
|
|
10
|
+
"""
|
|
11
|
+
|
|
12
|
+
import argparse
|
|
13
|
+
import subprocess
|
|
14
|
+
from pathlib import Path
|
|
15
|
+
import re
|
|
16
|
+
|
|
17
|
+
# Venue requirements database
|
|
18
|
+
VENUE_REQUIREMENTS = {
|
|
19
|
+
"nature": {
|
|
20
|
+
"page_limit": 5, # Approximate for ~3000 words
|
|
21
|
+
"margins": {"top": 2.5, "bottom": 2.5, "left": 2.5, "right": 2.5}, # cm
|
|
22
|
+
"font_size": 12, # pt
|
|
23
|
+
"font_family": "Times",
|
|
24
|
+
"line_spacing": "double"
|
|
25
|
+
},
|
|
26
|
+
"neurips": {
|
|
27
|
+
"page_limit": 8, # Excluding refs
|
|
28
|
+
"margins": {"top": 2.54, "bottom": 2.54, "left": 2.54, "right": 2.54}, # cm (1 inch)
|
|
29
|
+
"font_size": 10,
|
|
30
|
+
"font_family": "Times",
|
|
31
|
+
"format": "two-column"
|
|
32
|
+
},
|
|
33
|
+
"plos_one": {
|
|
34
|
+
"page_limit": None, # No limit
|
|
35
|
+
"margins": {"top": 2.54, "bottom": 2.54, "left": 2.54, "right": 2.54},
|
|
36
|
+
"font_size": 10,
|
|
37
|
+
"font_family": "Arial",
|
|
38
|
+
"line_spacing": "double"
|
|
39
|
+
},
|
|
40
|
+
"nsf": {
|
|
41
|
+
"page_limit": 15, # Project description
|
|
42
|
+
"margins": {"top": 2.54, "bottom": 2.54, "left": 2.54, "right": 2.54}, # 1 inch required
|
|
43
|
+
"font_size": 11, # Minimum
|
|
44
|
+
"font_family": "Times Roman",
|
|
45
|
+
"line_spacing": "single or double"
|
|
46
|
+
},
|
|
47
|
+
"nih": {
|
|
48
|
+
"page_limit": 12, # Research strategy
|
|
49
|
+
"margins": {"top": 1.27, "bottom": 1.27, "left": 1.27, "right": 1.27}, # 0.5 inch minimum
|
|
50
|
+
"font_size": 11, # Arial 11pt minimum
|
|
51
|
+
"font_family": "Arial",
|
|
52
|
+
"line_spacing": "any"
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
def get_pdf_info(pdf_path):
|
|
57
|
+
"""Extract information from PDF using pdfinfo."""
|
|
58
|
+
try:
|
|
59
|
+
result = subprocess.run(
|
|
60
|
+
['pdfinfo', str(pdf_path)],
|
|
61
|
+
capture_output=True,
|
|
62
|
+
text=True,
|
|
63
|
+
check=True
|
|
64
|
+
)
|
|
65
|
+
|
|
66
|
+
info = {}
|
|
67
|
+
for line in result.stdout.split('\n'):
|
|
68
|
+
if ':' in line:
|
|
69
|
+
key, value = line.split(':', 1)
|
|
70
|
+
info[key.strip()] = value.strip()
|
|
71
|
+
|
|
72
|
+
return info
|
|
73
|
+
except FileNotFoundError:
|
|
74
|
+
print("⚠️ pdfinfo not found. Install poppler-utils for full PDF analysis.")
|
|
75
|
+
print(" macOS: brew install poppler")
|
|
76
|
+
print(" Linux: sudo apt-get install poppler-utils")
|
|
77
|
+
return None
|
|
78
|
+
except subprocess.CalledProcessError as e:
|
|
79
|
+
print(f"Error running pdfinfo: {e}")
|
|
80
|
+
return None
|
|
81
|
+
|
|
82
|
+
def check_page_count(pdf_path, venue_reqs):
|
|
83
|
+
"""Check if page count is within limit."""
|
|
84
|
+
pdf_info = get_pdf_info(pdf_path)
|
|
85
|
+
|
|
86
|
+
if not pdf_info:
|
|
87
|
+
return {"status": "skip", "message": "Could not determine page count"}
|
|
88
|
+
|
|
89
|
+
pages = int(pdf_info.get('Pages', 0))
|
|
90
|
+
limit = venue_reqs.get('page_limit')
|
|
91
|
+
|
|
92
|
+
if limit is None:
|
|
93
|
+
return {"status": "pass", "message": f"No page limit. Document has {pages} pages."}
|
|
94
|
+
|
|
95
|
+
if pages <= limit:
|
|
96
|
+
return {"status": "pass", "message": f"✓ Page count OK: {pages}/{limit} pages"}
|
|
97
|
+
else:
|
|
98
|
+
return {"status": "fail", "message": f"✗ Page count exceeded: {pages}/{limit} pages"}
|
|
99
|
+
|
|
100
|
+
def check_margins(pdf_path, venue_reqs):
|
|
101
|
+
"""Check if margins meet requirements."""
|
|
102
|
+
# Note: This is a simplified check. Full margin analysis requires more sophisticated tools.
|
|
103
|
+
req_margins = venue_reqs.get('margins', {})
|
|
104
|
+
|
|
105
|
+
if not req_margins:
|
|
106
|
+
return {"status": "skip", "message": "No margin requirements specified"}
|
|
107
|
+
|
|
108
|
+
# This is a placeholder - accurate margin checking requires parsing PDF content
|
|
109
|
+
return {
|
|
110
|
+
"status": "info",
|
|
111
|
+
"message": f"ℹ️ Required margins: {req_margins} cm (manual verification recommended)"
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
def check_fonts(pdf_path, venue_reqs):
|
|
115
|
+
"""Check fonts in PDF."""
|
|
116
|
+
try:
|
|
117
|
+
result = subprocess.run(
|
|
118
|
+
['pdffonts', str(pdf_path)],
|
|
119
|
+
capture_output=True,
|
|
120
|
+
text=True,
|
|
121
|
+
check=True
|
|
122
|
+
)
|
|
123
|
+
|
|
124
|
+
fonts_found = []
|
|
125
|
+
for line in result.stdout.split('\n')[2:]: # Skip header
|
|
126
|
+
if line.strip():
|
|
127
|
+
parts = line.split()
|
|
128
|
+
if parts:
|
|
129
|
+
fonts_found.append(parts[0])
|
|
130
|
+
|
|
131
|
+
req_font = venue_reqs.get('font_family', '')
|
|
132
|
+
req_size = venue_reqs.get('font_size')
|
|
133
|
+
|
|
134
|
+
message = f"ℹ️ Fonts found: {', '.join(set(fonts_found))}\n"
|
|
135
|
+
message += f" Required: {req_font}"
|
|
136
|
+
if req_size:
|
|
137
|
+
message += f" {req_size}pt minimum"
|
|
138
|
+
|
|
139
|
+
return {"status": "info", "message": message}
|
|
140
|
+
|
|
141
|
+
except FileNotFoundError:
|
|
142
|
+
return {"status": "skip", "message": "pdffonts not available"}
|
|
143
|
+
except subprocess.CalledProcessError:
|
|
144
|
+
return {"status": "skip", "message": "Could not extract font information"}
|
|
145
|
+
|
|
146
|
+
def validate_document(pdf_path, venue, checks):
|
|
147
|
+
"""Validate document against venue requirements."""
|
|
148
|
+
|
|
149
|
+
venue_key = venue.lower().replace(" ", "_")
|
|
150
|
+
|
|
151
|
+
if venue_key not in VENUE_REQUIREMENTS:
|
|
152
|
+
print(f"❌ Unknown venue: {venue}")
|
|
153
|
+
print(f"Available venues: {', '.join(VENUE_REQUIREMENTS.keys())}")
|
|
154
|
+
return
|
|
155
|
+
|
|
156
|
+
venue_reqs = VENUE_REQUIREMENTS[venue_key]
|
|
157
|
+
|
|
158
|
+
print(f"\n{'='*60}")
|
|
159
|
+
print(f"VALIDATING: {pdf_path.name}")
|
|
160
|
+
print(f"VENUE: {venue}")
|
|
161
|
+
print(f"{'='*60}\n")
|
|
162
|
+
|
|
163
|
+
results = {}
|
|
164
|
+
|
|
165
|
+
# Run requested checks
|
|
166
|
+
if 'page-count' in checks or 'all' in checks:
|
|
167
|
+
results['page-count'] = check_page_count(pdf_path, venue_reqs)
|
|
168
|
+
|
|
169
|
+
if 'margins' in checks or 'all' in checks:
|
|
170
|
+
results['margins'] = check_margins(pdf_path, venue_reqs)
|
|
171
|
+
|
|
172
|
+
if 'fonts' in checks or 'all' in checks:
|
|
173
|
+
results['fonts'] = check_fonts(pdf_path, venue_reqs)
|
|
174
|
+
|
|
175
|
+
# Print results
|
|
176
|
+
for check_name, result in results.items():
|
|
177
|
+
print(f"{check_name.upper()}:")
|
|
178
|
+
print(f" {result['message']}\n")
|
|
179
|
+
|
|
180
|
+
# Summary
|
|
181
|
+
failures = sum(1 for r in results.values() if r['status'] == 'fail')
|
|
182
|
+
passes = sum(1 for r in results.values() if r['status'] == 'pass')
|
|
183
|
+
|
|
184
|
+
print(f"{'='*60}")
|
|
185
|
+
if failures == 0:
|
|
186
|
+
print(f"✓ VALIDATION PASSED ({passes} checks)")
|
|
187
|
+
else:
|
|
188
|
+
print(f"✗ VALIDATION FAILED ({failures} issues)")
|
|
189
|
+
print(f"{'='*60}\n")
|
|
190
|
+
|
|
191
|
+
return results
|
|
192
|
+
|
|
193
|
+
def generate_report(pdf_path, venue, results, report_path):
|
|
194
|
+
"""Generate validation report."""
|
|
195
|
+
|
|
196
|
+
with open(report_path, 'w') as f:
|
|
197
|
+
f.write(f"Validation Report\n")
|
|
198
|
+
f.write(f"{'='*60}\n\n")
|
|
199
|
+
f.write(f"File: {pdf_path}\n")
|
|
200
|
+
f.write(f"Venue: {venue}\n")
|
|
201
|
+
f.write(f"Date: {Path.ctime(pdf_path)}\n\n")
|
|
202
|
+
|
|
203
|
+
for check_name, result in results.items():
|
|
204
|
+
f.write(f"{check_name.upper()}:\n")
|
|
205
|
+
f.write(f" Status: {result['status']}\n")
|
|
206
|
+
f.write(f" {result['message']}\n\n")
|
|
207
|
+
|
|
208
|
+
failures = sum(1 for r in results.values() if r['status'] == 'fail')
|
|
209
|
+
f.write(f"\nSummary: {'PASSED' if failures == 0 else 'FAILED'}\n")
|
|
210
|
+
|
|
211
|
+
print(f"Report saved to: {report_path}")
|
|
212
|
+
|
|
213
|
+
def main():
|
|
214
|
+
parser = argparse.ArgumentParser(
|
|
215
|
+
description="Validate document formatting for venue requirements",
|
|
216
|
+
formatter_class=argparse.RawDescriptionHelpFormatter,
|
|
217
|
+
epilog="""
|
|
218
|
+
Examples:
|
|
219
|
+
%(prog)s --file my_paper.pdf --venue "Nature" --check-all
|
|
220
|
+
%(prog)s --file my_paper.pdf --venue "NeurIPS" --check page-count,fonts
|
|
221
|
+
%(prog)s --file proposal.pdf --venue "NSF" --report validation.txt
|
|
222
|
+
"""
|
|
223
|
+
)
|
|
224
|
+
|
|
225
|
+
parser.add_argument('--file', type=str, required=True, help='PDF file to validate')
|
|
226
|
+
parser.add_argument('--venue', type=str, required=True, help='Target venue')
|
|
227
|
+
parser.add_argument('--check', type=str, default='all',
|
|
228
|
+
help='Checks to perform: page-count, margins, fonts, all (comma-separated)')
|
|
229
|
+
parser.add_argument('--check-all', action='store_true', help='Perform all checks')
|
|
230
|
+
parser.add_argument('--report', type=str, help='Save report to file')
|
|
231
|
+
|
|
232
|
+
args = parser.parse_args()
|
|
233
|
+
|
|
234
|
+
# Check file exists
|
|
235
|
+
pdf_path = Path(args.file)
|
|
236
|
+
if not pdf_path.exists():
|
|
237
|
+
print(f"Error: File not found: {pdf_path}")
|
|
238
|
+
return
|
|
239
|
+
|
|
240
|
+
# Parse checks
|
|
241
|
+
if args.check_all:
|
|
242
|
+
checks = ['all']
|
|
243
|
+
else:
|
|
244
|
+
checks = [c.strip() for c in args.check.split(',')]
|
|
245
|
+
|
|
246
|
+
# Validate
|
|
247
|
+
results = validate_document(pdf_path, args.venue, checks)
|
|
248
|
+
|
|
249
|
+
# Generate report if requested
|
|
250
|
+
if args.report and results:
|
|
251
|
+
generate_report(pdf_path, args.venue, results, Path(args.report))
|
|
252
|
+
|
|
253
|
+
if __name__ == "__main__":
|
|
254
|
+
main()
|
|
255
|
+
|
scientific_writer/__init__.py
CHANGED
scientific_writer/api.py
CHANGED
|
@@ -15,6 +15,7 @@ from .core import (
|
|
|
15
15
|
get_data_files,
|
|
16
16
|
process_data_files,
|
|
17
17
|
create_data_context_message,
|
|
18
|
+
setup_claude_skills,
|
|
18
19
|
)
|
|
19
20
|
from .models import ProgressUpdate, PaperResult, PaperMetadata, PaperFiles
|
|
20
21
|
from .utils import (
|
|
@@ -79,8 +80,11 @@ async def generate_paper(
|
|
|
79
80
|
# Default to user's current working directory
|
|
80
81
|
work_dir = Path.cwd()
|
|
81
82
|
|
|
82
|
-
# Get package directory for
|
|
83
|
-
package_dir = Path(__file__).parent.
|
|
83
|
+
# Get package directory for copying skills to working directory
|
|
84
|
+
package_dir = Path(__file__).parent.absolute() # scientific_writer/ directory
|
|
85
|
+
|
|
86
|
+
# Set up Claude skills in the working directory (includes WRITER.md)
|
|
87
|
+
setup_claude_skills(package_dir, work_dir)
|
|
84
88
|
|
|
85
89
|
# Ensure output folder exists in user's directory
|
|
86
90
|
output_folder = ensure_output_folder(work_dir, output_dir)
|
|
@@ -92,8 +96,8 @@ async def generate_paper(
|
|
|
92
96
|
percentage=0,
|
|
93
97
|
).to_dict()
|
|
94
98
|
|
|
95
|
-
# Load system instructions from
|
|
96
|
-
system_instructions = load_system_instructions(
|
|
99
|
+
# Load system instructions from .claude/WRITER.md in working directory
|
|
100
|
+
system_instructions = load_system_instructions(work_dir)
|
|
97
101
|
|
|
98
102
|
# Add conversation continuity instruction
|
|
99
103
|
system_instructions += "\n\n" + """
|
|
@@ -123,7 +127,7 @@ IMPORTANT - CONVERSATION CONTINUITY:
|
|
|
123
127
|
model=model,
|
|
124
128
|
allowed_tools=["Read", "Write", "Edit", "Bash", "research-lookup"],
|
|
125
129
|
permission_mode="bypassPermissions",
|
|
126
|
-
setting_sources=[
|
|
130
|
+
setting_sources=["project"], # Load skills from project .claude directory
|
|
127
131
|
cwd=str(work_dir), # User's working directory
|
|
128
132
|
)
|
|
129
133
|
|
scientific_writer/cli.py
CHANGED
|
@@ -20,6 +20,7 @@ from .core import (
|
|
|
20
20
|
get_data_files,
|
|
21
21
|
process_data_files,
|
|
22
22
|
create_data_context_message,
|
|
23
|
+
setup_claude_skills,
|
|
23
24
|
)
|
|
24
25
|
from .utils import find_existing_papers, detect_paper_reference
|
|
25
26
|
|
|
@@ -35,13 +36,16 @@ async def main():
|
|
|
35
36
|
|
|
36
37
|
# Get the current working directory (user's directory) and package directory
|
|
37
38
|
cwd = Path.cwd() # User's current working directory
|
|
38
|
-
package_dir = Path(__file__).parent.
|
|
39
|
+
package_dir = Path(__file__).parent.absolute() # Package installation directory (scientific_writer/)
|
|
40
|
+
|
|
41
|
+
# Set up Claude skills in the working directory (includes WRITER.md)
|
|
42
|
+
setup_claude_skills(package_dir, cwd)
|
|
39
43
|
|
|
40
44
|
# Ensure paper_outputs folder exists in user's directory
|
|
41
45
|
output_folder = ensure_output_folder(cwd)
|
|
42
46
|
|
|
43
|
-
# Load system instructions from
|
|
44
|
-
system_instructions = load_system_instructions(
|
|
47
|
+
# Load system instructions from .claude/WRITER.md in working directory
|
|
48
|
+
system_instructions = load_system_instructions(cwd)
|
|
45
49
|
|
|
46
50
|
# Add conversation continuity instruction
|
|
47
51
|
# Note: The Python CLI handles session tracking via current_paper_path
|
|
@@ -58,10 +62,10 @@ IMPORTANT - CONVERSATION CONTINUITY:
|
|
|
58
62
|
# Configure the Claude agent options
|
|
59
63
|
options = ClaudeAgentOptions(
|
|
60
64
|
system_prompt=system_instructions,
|
|
61
|
-
model="claude-sonnet-4-
|
|
65
|
+
model="claude-sonnet-4-5", # Always use Claude Sonnet 4.5
|
|
62
66
|
allowed_tools=["Read", "Write", "Edit", "Bash", "research-lookup"], # Default Claude Code tools + research lookup
|
|
63
67
|
permission_mode="bypassPermissions", # Execute immediately without approval prompts
|
|
64
|
-
setting_sources=[
|
|
68
|
+
setting_sources=["project"], # Load skills from project .claude directory
|
|
65
69
|
cwd=str(cwd), # Set working directory to user's current directory
|
|
66
70
|
)
|
|
67
71
|
|
scientific_writer/core.py
CHANGED
|
@@ -10,6 +10,29 @@ from dotenv import load_dotenv
|
|
|
10
10
|
load_dotenv()
|
|
11
11
|
|
|
12
12
|
|
|
13
|
+
def setup_claude_skills(package_dir: Path, work_dir: Path) -> None:
|
|
14
|
+
"""
|
|
15
|
+
Set up Claude skills and WRITER.md by copying .claude/ from package to working directory.
|
|
16
|
+
|
|
17
|
+
Args:
|
|
18
|
+
package_dir: Package installation directory containing .claude/
|
|
19
|
+
work_dir: User's working directory where .claude/ should be copied
|
|
20
|
+
"""
|
|
21
|
+
source_claude = package_dir / ".claude"
|
|
22
|
+
dest_claude = work_dir / ".claude"
|
|
23
|
+
|
|
24
|
+
# Copy .claude directory (which includes skills/ and WRITER.md) if source exists and destination doesn't
|
|
25
|
+
if source_claude.exists() and not dest_claude.exists():
|
|
26
|
+
try:
|
|
27
|
+
shutil.copytree(source_claude, dest_claude)
|
|
28
|
+
print(f"✓ Initialized Claude configuration in {dest_claude}")
|
|
29
|
+
print(f"✓ Skills and system instructions (WRITER.md) ready")
|
|
30
|
+
except Exception as e:
|
|
31
|
+
print(f"Warning: Could not copy Claude configuration: {e}")
|
|
32
|
+
elif not source_claude.exists():
|
|
33
|
+
print(f"Warning: .claude directory not found in package: {source_claude}")
|
|
34
|
+
|
|
35
|
+
|
|
13
36
|
def get_api_key(api_key: Optional[str] = None) -> str:
|
|
14
37
|
"""
|
|
15
38
|
Get the Anthropic API key.
|
|
@@ -35,23 +58,23 @@ def get_api_key(api_key: Optional[str] = None) -> str:
|
|
|
35
58
|
return env_key
|
|
36
59
|
|
|
37
60
|
|
|
38
|
-
def load_system_instructions(
|
|
61
|
+
def load_system_instructions(work_dir: Path) -> str:
|
|
39
62
|
"""
|
|
40
|
-
Load system instructions from
|
|
63
|
+
Load system instructions from .claude/WRITER.md in the working directory.
|
|
41
64
|
|
|
42
65
|
Args:
|
|
43
|
-
|
|
66
|
+
work_dir: Working directory containing .claude/WRITER.md.
|
|
44
67
|
|
|
45
68
|
Returns:
|
|
46
69
|
System instructions string.
|
|
47
70
|
"""
|
|
48
|
-
instructions_file =
|
|
71
|
+
instructions_file = work_dir / ".claude" / "WRITER.md"
|
|
49
72
|
|
|
50
73
|
if instructions_file.exists():
|
|
51
74
|
with open(instructions_file, 'r', encoding='utf-8') as f:
|
|
52
75
|
return f.read()
|
|
53
76
|
else:
|
|
54
|
-
# Fallback if
|
|
77
|
+
# Fallback if WRITER.md doesn't exist
|
|
55
78
|
return (
|
|
56
79
|
"You are a scientific writing assistant. Follow best practices for "
|
|
57
80
|
"scientific communication and always present a plan before execution."
|