medsci-skills 4.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +50 -0
- package/README.md +602 -0
- package/README_FIRST.md +27 -0
- package/bin/medsci-skills.js +159 -0
- package/installers/install-macos.command +19 -0
- package/installers/install-windows.cmd +26 -0
- package/installers/install-windows.ps1 +17 -0
- package/installers/install.py +218 -0
- package/metadata/skills_catalog.json +452 -0
- package/package.json +48 -0
- package/skills/academic-aio/SKILL.md +408 -0
- package/skills/academic-aio/references/case_studies/kjr_mllm_2025.md +82 -0
- package/skills/academic-aio/references/checklists/AIO_GENERAL.md +354 -0
- package/skills/academic-aio/references/journal_summarybox_templates.yaml +126 -0
- package/skills/academic-aio/references/oac_funding_checklist.yaml +129 -0
- package/skills/academic-aio/references/reporting_guideline_mapping.md +39 -0
- package/skills/academic-aio/references/schema_markup_templates/CodeRepository.jsonld +32 -0
- package/skills/academic-aio/references/schema_markup_templates/Dataset.jsonld +36 -0
- package/skills/academic-aio/references/schema_markup_templates/Person.jsonld +30 -0
- package/skills/academic-aio/references/schema_markup_templates/README.md +43 -0
- package/skills/academic-aio/references/schema_markup_templates/ScholarlyArticle.jsonld +55 -0
- package/skills/academic-aio/scripts/batch_metadata_audit.py +169 -0
- package/skills/academic-aio/scripts/validate_schema.py +118 -0
- package/skills/academic-aio/skill.yml +36 -0
- package/skills/academic-aio/templates/aio_audit_checklist.md.j2 +108 -0
- package/skills/add-journal/SKILL.md +482 -0
- package/skills/add-journal/skill.yml +33 -0
- package/skills/analyze-stats/SKILL.md +598 -0
- package/skills/analyze-stats/references/analysis_guides/missing_data.md +109 -0
- package/skills/analyze-stats/references/analysis_guides/nhis_icd10_mapping.md +247 -0
- package/skills/analyze-stats/references/analysis_guides/propensity_score.md +132 -0
- package/skills/analyze-stats/references/analysis_guides/regression.md +115 -0
- package/skills/analyze-stats/references/analysis_guides/repeated_measures.md +160 -0
- package/skills/analyze-stats/references/analysis_guides/survey_weighted.md +366 -0
- package/skills/analyze-stats/references/analysis_guides/test_selection.md +86 -0
- package/skills/analyze-stats/references/style/figure_style.mplstyle +69 -0
- package/skills/analyze-stats/references/style/theme_publication.R +147 -0
- package/skills/analyze-stats/references/table-standards/journal-profiles/ajr.yaml +51 -0
- package/skills/analyze-stats/references/table-standards/journal-profiles/european_radiology.yaml +55 -0
- package/skills/analyze-stats/references/table-standards/journal-profiles/jama.yaml +66 -0
- package/skills/analyze-stats/references/table-standards/journal-profiles/lancet.yaml +57 -0
- package/skills/analyze-stats/references/table-standards/journal-profiles/nejm.yaml +51 -0
- package/skills/analyze-stats/references/table-standards/journal-profiles/radiology.yaml +66 -0
- package/skills/analyze-stats/references/table-standards/table-standards.md +287 -0
- package/skills/analyze-stats/references/table-standards/table-types/diagnostic_accuracy.md +36 -0
- package/skills/analyze-stats/references/table-standards/table-types/meta_analysis.md +58 -0
- package/skills/analyze-stats/references/table-standards/table-types/model_comparison.md +36 -0
- package/skills/analyze-stats/references/table-standards/table-types/regression_results.md +50 -0
- package/skills/analyze-stats/references/table-standards/table-types/table1_demographics.md +51 -0
- package/skills/analyze-stats/references/table-standards/tool-comparison.md +79 -0
- package/skills/analyze-stats/references/templates/agreement_analysis.py +436 -0
- package/skills/analyze-stats/references/templates/dca_plot.R +237 -0
- package/skills/analyze-stats/references/templates/diagnostic_accuracy.py +401 -0
- package/skills/analyze-stats/references/templates/dta_meta_analysis.R +384 -0
- package/skills/analyze-stats/references/templates/forest_plot.py +412 -0
- package/skills/analyze-stats/references/templates/likert_summary.py +356 -0
- package/skills/analyze-stats/references/templates/meta_analysis.R +365 -0
- package/skills/analyze-stats/references/templates/propensity_score.py +478 -0
- package/skills/analyze-stats/references/templates/regression.py +425 -0
- package/skills/analyze-stats/references/templates/repeated_measures.py +434 -0
- package/skills/analyze-stats/references/templates/sample_size.R +382 -0
- package/skills/analyze-stats/references/templates/survey_weighted_analysis.py +411 -0
- package/skills/analyze-stats/references/templates/survival_analysis.py +325 -0
- package/skills/analyze-stats/references/templates/table1_demographics.py +287 -0
- package/skills/analyze-stats/scripts/check_generated_code.py +335 -0
- package/skills/analyze-stats/skill.yml +38 -0
- package/skills/analyze-stats/tests/fixtures/gen_bad.R +16 -0
- package/skills/analyze-stats/tests/fixtures/gen_bad.py +24 -0
- package/skills/analyze-stats/tests/fixtures/gen_clean.py +21 -0
- package/skills/analyze-stats/tests/test_generated_code.sh +59 -0
- package/skills/analyze-stats/tests/test_survival_template.sh +53 -0
- package/skills/author-strategy/SKILL.md +117 -0
- package/skills/author-strategy/analyze_patterns.py +303 -0
- package/skills/author-strategy/fetch_pubmed.py +374 -0
- package/skills/author-strategy/skill.yml +34 -0
- package/skills/batch-cohort/SKILL.md +223 -0
- package/skills/batch-cohort/references/base_template_knhanes.R +210 -0
- package/skills/batch-cohort/references/batch_template_generator.R +222 -0
- package/skills/batch-cohort/references/variable_coding_registry.md +136 -0
- package/skills/batch-cohort/skill.yml +35 -0
- package/skills/calc-sample-size/SKILL.md +491 -0
- package/skills/calc-sample-size/references/formulas.md +655 -0
- package/skills/calc-sample-size/references/observational_cohort.md +49 -0
- package/skills/calc-sample-size/skill.yml +51 -0
- package/skills/check-reporting/SKILL.md +534 -0
- package/skills/check-reporting/references/LICENSES.md +41 -0
- package/skills/check-reporting/references/checklists/AMSTAR2.md +54 -0
- package/skills/check-reporting/references/checklists/ARRIVE_2.md +234 -0
- package/skills/check-reporting/references/checklists/CARE.md +102 -0
- package/skills/check-reporting/references/checklists/CLAIM_2024.md +128 -0
- package/skills/check-reporting/references/checklists/CLEAR.md +113 -0
- package/skills/check-reporting/references/checklists/CONSORT.md +86 -0
- package/skills/check-reporting/references/checklists/COSMIN_RoB.md +136 -0
- package/skills/check-reporting/references/checklists/GRRAS.md +61 -0
- package/skills/check-reporting/references/checklists/MI_CLEAR_LLM.md +167 -0
- package/skills/check-reporting/references/checklists/MOOSE.md +85 -0
- package/skills/check-reporting/references/checklists/NOS.md +88 -0
- package/skills/check-reporting/references/checklists/PRISMA_2020.md +135 -0
- package/skills/check-reporting/references/checklists/PRISMA_DTA.md +36 -0
- package/skills/check-reporting/references/checklists/PRISMA_P.md +56 -0
- package/skills/check-reporting/references/checklists/PROBAST.md +75 -0
- package/skills/check-reporting/references/checklists/PROBAST_AI.md +130 -0
- package/skills/check-reporting/references/checklists/QUADAS2.md +77 -0
- package/skills/check-reporting/references/checklists/QUADAS_C.md +131 -0
- package/skills/check-reporting/references/checklists/ROBINS_E.md +179 -0
- package/skills/check-reporting/references/checklists/ROBINS_I.md +87 -0
- package/skills/check-reporting/references/checklists/ROBIS.md +114 -0
- package/skills/check-reporting/references/checklists/ROB_ME.md +126 -0
- package/skills/check-reporting/references/checklists/RoB2.md +79 -0
- package/skills/check-reporting/references/checklists/RoB_NMA.md +96 -0
- package/skills/check-reporting/references/checklists/SPIRIT.md +112 -0
- package/skills/check-reporting/references/checklists/SQUIRE_2.md +68 -0
- package/skills/check-reporting/references/checklists/STARD.md +129 -0
- package/skills/check-reporting/references/checklists/STARD_AI.md +211 -0
- package/skills/check-reporting/references/checklists/STROBE.md +80 -0
- package/skills/check-reporting/references/checklists/SWiM.md +33 -0
- package/skills/check-reporting/references/checklists/TRIPOD.md +157 -0
- package/skills/check-reporting/references/checklists/TRIPOD_AI.md +140 -0
- package/skills/check-reporting/references/step4c_registration_timing.md +93 -0
- package/skills/check-reporting/references/step4d_prisma_figure_audit.md +137 -0
- package/skills/check-reporting/scripts/check_checklist_exists.py +183 -0
- package/skills/check-reporting/scripts/check_checklist_version.py +168 -0
- package/skills/check-reporting/scripts/check_framework_naming.py +206 -0
- package/skills/check-reporting/scripts/check_prisma_figure.py +209 -0
- package/skills/check-reporting/scripts/prisma_cascade_check.py +274 -0
- package/skills/check-reporting/skill.yml +41 -0
- package/skills/check-reporting/tests/fixtures/framework_bad.md +8 -0
- package/skills/check-reporting/tests/fixtures/framework_clean.md +7 -0
- package/skills/check-reporting/tests/test_checklist_fail_fast.sh +77 -0
- package/skills/check-reporting/tests/test_checklist_version.sh +72 -0
- package/skills/check-reporting/tests/test_framework_naming.sh +45 -0
- package/skills/check-reporting/tests/test_prisma_cascade.sh +104 -0
- package/skills/clean-data/SKILL.md +180 -0
- package/skills/clean-data/references/cleaning_patterns.md +299 -0
- package/skills/clean-data/references/profiling_template.py +304 -0
- package/skills/clean-data/scripts/check_structural_zero.py +174 -0
- package/skills/clean-data/skill.yml +35 -0
- package/skills/clean-data/tests/fixtures/smoking.csv +8 -0
- package/skills/clean-data/tests/test_structural_zero.sh +49 -0
- package/skills/cross-national/SKILL.md +264 -0
- package/skills/cross-national/skill.yml +37 -0
- package/skills/define-variables/SKILL.md +146 -0
- package/skills/define-variables/references/common_definitions.md +190 -0
- package/skills/define-variables/skill.yml +34 -0
- package/skills/define-variables/templates/variable_operationalization.md +64 -0
- package/skills/deidentify/SKILL.md +203 -0
- package/skills/deidentify/deidentify.py +1224 -0
- package/skills/deidentify/locales/_template.json +45 -0
- package/skills/deidentify/locales/au.json +43 -0
- package/skills/deidentify/locales/ca.json +44 -0
- package/skills/deidentify/locales/cn.json +47 -0
- package/skills/deidentify/locales/de.json +48 -0
- package/skills/deidentify/locales/fr.json +48 -0
- package/skills/deidentify/locales/in.json +48 -0
- package/skills/deidentify/locales/jp.json +48 -0
- package/skills/deidentify/locales/kr.json +48 -0
- package/skills/deidentify/locales/uk.json +45 -0
- package/skills/deidentify/locales/us.json +43 -0
- package/skills/deidentify/references/date_shift_guide.md +82 -0
- package/skills/deidentify/references/hipaa_18_identifiers.md +48 -0
- package/skills/deidentify/references/korean_phi_patterns.md +135 -0
- package/skills/deidentify/skill.yml +43 -0
- package/skills/deidentify/tests/README.md +26 -0
- package/skills/deidentify/tests/test_clean.csv +16 -0
- package/skills/deidentify/tests/test_edge_cases.csv +11 -0
- package/skills/deidentify/tests/test_phi_korean.csv +11 -0
- package/skills/design-ai-benchmarking/SKILL.md +214 -0
- package/skills/design-ai-benchmarking/references/benchmark_export_schema.json +69 -0
- package/skills/design-ai-benchmarking/references/elicitation_rubric_template.md +37 -0
- package/skills/design-ai-benchmarking/skill.yml +38 -0
- package/skills/design-study/SKILL.md +298 -0
- package/skills/design-study/skill.yml +33 -0
- package/skills/fill-icmje-coi/SKILL.md +216 -0
- package/skills/fill-icmje-coi/scripts/fill_icmje_coi.py +140 -0
- package/skills/fill-icmje-coi/skill.yml +35 -0
- package/skills/fill-icmje-coi/templates/icmje_coi_seed_synthetic.docx +0 -0
- package/skills/fill-protocol/SKILL.md +248 -0
- package/skills/fill-protocol/examples/example_irb_template.yaml +53 -0
- package/skills/fill-protocol/references/best_practices.md +121 -0
- package/skills/fill-protocol/scripts/doc_to_docx.py +111 -0
- package/skills/fill-protocol/scripts/fill_form.py +611 -0
- package/skills/fill-protocol/scripts/inspect_template.py +61 -0
- package/skills/fill-protocol/setup.sh +162 -0
- package/skills/fill-protocol/skill.yml +37 -0
- package/skills/find-cohort-gap/SKILL.md +309 -0
- package/skills/find-cohort-gap/references/cohort_profile_template.md +93 -0
- package/skills/find-cohort-gap/references/onepager_template.md +84 -0
- package/skills/find-cohort-gap/references/pattern_scoring_rubric.md +169 -0
- package/skills/find-cohort-gap/references/saturation_query_templates.md +143 -0
- package/skills/find-cohort-gap/skill.yml +35 -0
- package/skills/find-journal/POLICY.md +87 -0
- package/skills/find-journal/SKILL.md +340 -0
- package/skills/find-journal/references/journal_profiles/AJNR.md +29 -0
- package/skills/find-journal/references/journal_profiles/AJR.md +30 -0
- package/skills/find-journal/references/journal_profiles/Abdominal_Radiology.md +30 -0
- package/skills/find-journal/references/journal_profiles/Academic_Radiology.md +30 -0
- package/skills/find-journal/references/journal_profiles/Annals_of_Internal_Medicine.md +33 -0
- package/skills/find-journal/references/journal_profiles/Artificial_Intelligence_in_Medicine.md +28 -0
- package/skills/find-journal/references/journal_profiles/BMC_Medicine.md +31 -0
- package/skills/find-journal/references/journal_profiles/British_Journal_of_Radiology.md +39 -0
- package/skills/find-journal/references/journal_profiles/CVIR.md +30 -0
- package/skills/find-journal/references/journal_profiles/Chest.md +39 -0
- package/skills/find-journal/references/journal_profiles/Clinical_Radiology.md +30 -0
- package/skills/find-journal/references/journal_profiles/Clinical_and_Molecular_Hepatology.md +32 -0
- package/skills/find-journal/references/journal_profiles/Diabetes_Metabolism_Journal.md +36 -0
- package/skills/find-journal/references/journal_profiles/Diagnostic_and_Interventional_Radiology.md +32 -0
- package/skills/find-journal/references/journal_profiles/Endocrinology_and_Metabolism.md +37 -0
- package/skills/find-journal/references/journal_profiles/European_Journal_of_Preventive_Cardiology.md +39 -0
- package/skills/find-journal/references/journal_profiles/European_Radiology.md +29 -0
- package/skills/find-journal/references/journal_profiles/Hepatology_Communications.md +40 -0
- package/skills/find-journal/references/journal_profiles/Hepatology_International.md +37 -0
- package/skills/find-journal/references/journal_profiles/IEEE_JBHI.md +28 -0
- package/skills/find-journal/references/journal_profiles/IEEE_TMI.md +28 -0
- package/skills/find-journal/references/journal_profiles/INSI.md +29 -0
- package/skills/find-journal/references/journal_profiles/Investigative_Radiology.md +25 -0
- package/skills/find-journal/references/journal_profiles/JACC_Advances.md +41 -0
- package/skills/find-journal/references/journal_profiles/JACC_Asia.md +30 -0
- package/skills/find-journal/references/journal_profiles/JACR.md +28 -0
- package/skills/find-journal/references/journal_profiles/JAMA.md +40 -0
- package/skills/find-journal/references/journal_profiles/JAMA_Network_Open.md +30 -0
- package/skills/find-journal/references/journal_profiles/JCSM.md +39 -0
- package/skills/find-journal/references/journal_profiles/JKMS.md +32 -0
- package/skills/find-journal/references/journal_profiles/JMIR.md +29 -0
- package/skills/find-journal/references/journal_profiles/JMIR_Medical_Education.md +29 -0
- package/skills/find-journal/references/journal_profiles/JNIS.md +35 -0
- package/skills/find-journal/references/journal_profiles/JVIR.md +31 -0
- package/skills/find-journal/references/journal_profiles/Journal_of_Biomedical_Informatics.md +29 -0
- package/skills/find-journal/references/journal_profiles/Journal_of_Clinical_Endocrinology_and_Metabolism.md +40 -0
- package/skills/find-journal/references/journal_profiles/Journal_of_Magnetic_Resonance_Imaging.md +30 -0
- package/skills/find-journal/references/journal_profiles/Journal_of_Nuclear_Medicine.md +31 -0
- package/skills/find-journal/references/journal_profiles/Journal_of_Stroke.md +32 -0
- package/skills/find-journal/references/journal_profiles/KJR.md +38 -0
- package/skills/find-journal/references/journal_profiles/Korean_Circulation_Journal.md +38 -0
- package/skills/find-journal/references/journal_profiles/Korean_Journal_of_Internal_Medicine.md +36 -0
- package/skills/find-journal/references/journal_profiles/Lancet_Diabetes_and_Endocrinology.md +40 -0
- package/skills/find-journal/references/journal_profiles/Lancet_Gastroenterology_and_Hepatology.md +49 -0
- package/skills/find-journal/references/journal_profiles/Lancet_Infectious_Diseases.md +38 -0
- package/skills/find-journal/references/journal_profiles/Lancet_Neurology.md +39 -0
- package/skills/find-journal/references/journal_profiles/Lancet_Oncology.md +40 -0
- package/skills/find-journal/references/journal_profiles/Lancet_Psychiatry.md +38 -0
- package/skills/find-journal/references/journal_profiles/Lancet_Public_Health.md +30 -0
- package/skills/find-journal/references/journal_profiles/Lancet_Respiratory_Medicine.md +39 -0
- package/skills/find-journal/references/journal_profiles/Liver_International.md +33 -0
- package/skills/find-journal/references/journal_profiles/Medical_Image_Analysis.md +28 -0
- package/skills/find-journal/references/journal_profiles/NEJM.md +33 -0
- package/skills/find-journal/references/journal_profiles/Nature_Machine_Intelligence.md +31 -0
- package/skills/find-journal/references/journal_profiles/Nature_Medicine.md +39 -0
- package/skills/find-journal/references/journal_profiles/Neuroradiology.md +31 -0
- package/skills/find-journal/references/journal_profiles/Nutrition_Metabolism_and_Cardiovascular_Diseases.md +39 -0
- package/skills/find-journal/references/journal_profiles/PLOS_Medicine.md +32 -0
- package/skills/find-journal/references/journal_profiles/RYAI.md +28 -0
- package/skills/find-journal/references/journal_profiles/Radiology.md +29 -0
- package/skills/find-journal/references/journal_profiles/Skeletal_Radiology.md +31 -0
- package/skills/find-journal/references/journal_profiles/Stroke.md +37 -0
- package/skills/find-journal/references/journal_profiles/The_BMJ.md +31 -0
- package/skills/find-journal/references/journal_profiles/The_Lancet.md +31 -0
- package/skills/find-journal/references/journal_profiles/The_Lancet_Digital_Health.md +29 -0
- package/skills/find-journal/references/journal_profiles/World_Journal_of_Hepatology.md +53 -0
- package/skills/find-journal/references/journal_profiles/npj_Digital_Medicine.md +29 -0
- package/skills/find-journal/skill.yml +34 -0
- package/skills/fulltext-retrieval/SKILL.md +174 -0
- package/skills/fulltext-retrieval/fetch_oa.py +433 -0
- package/skills/fulltext-retrieval/pdf_to_md.py +160 -0
- package/skills/fulltext-retrieval/skill.yml +41 -0
- package/skills/generate-codebook/SKILL.md +155 -0
- package/skills/generate-codebook/references/codebook_schema.md +76 -0
- package/skills/generate-codebook/scripts/generate_codebook.py +278 -0
- package/skills/generate-codebook/skill.yml +35 -0
- package/skills/generate-codebook/tests/test_generate_codebook.sh +76 -0
- package/skills/grant-builder/SKILL.md +251 -0
- package/skills/grant-builder/skill.yml +34 -0
- package/skills/humanize/SKILL.md +251 -0
- package/skills/humanize/references/ai_patterns.md +571 -0
- package/skills/humanize/skill.yml +33 -0
- package/skills/intake-project/SKILL.md +264 -0
- package/skills/intake-project/skill.yml +34 -0
- package/skills/lit-sync/SKILL.md +448 -0
- package/skills/lit-sync/references/locale/ko/note_templates.md +110 -0
- package/skills/lit-sync/skill.yml +52 -0
- package/skills/lit-sync/tests/test_poll_logic.sh +92 -0
- package/skills/ma-scout/SKILL.md +640 -0
- package/skills/ma-scout/references/project_readme_template.md +95 -0
- package/skills/ma-scout/references/project_readme_template_ko.md +82 -0
- package/skills/ma-scout/skill.yml +33 -0
- package/skills/make-figures/SKILL.md +957 -0
- package/skills/make-figures/references/critic_rubrics/data_plot.md +166 -0
- package/skills/make-figures/references/critic_rubrics/flow_diagram.md +169 -0
- package/skills/make-figures/references/design_principles.md +181 -0
- package/skills/make-figures/references/exemplar_diagrams/README.md +65 -0
- package/skills/make-figures/references/exemplar_diagrams/consort/README.md +15 -0
- package/skills/make-figures/references/exemplar_diagrams/consort/template_input.yaml +37 -0
- package/skills/make-figures/references/exemplar_diagrams/consort/template_output.pdf +0 -0
- package/skills/make-figures/references/exemplar_diagrams/consort/template_output.png +0 -0
- package/skills/make-figures/references/exemplar_diagrams/consort/template_output_600.png +0 -0
- package/skills/make-figures/references/exemplar_diagrams/other/other_02.meta.yaml +4 -0
- package/skills/make-figures/references/exemplar_diagrams/other/other_02.png +0 -0
- package/skills/make-figures/references/exemplar_diagrams/other/other_02_why.md +13 -0
- package/skills/make-figures/references/exemplar_diagrams/pipeline/README.md +15 -0
- package/skills/make-figures/references/exemplar_diagrams/pipeline/pipeline_01.meta.yaml +4 -0
- package/skills/make-figures/references/exemplar_diagrams/pipeline/pipeline_01.png +0 -0
- package/skills/make-figures/references/exemplar_diagrams/pipeline/pipeline_01_why.md +13 -0
- package/skills/make-figures/references/exemplar_diagrams/pipeline/pipeline_03.meta.yaml +4 -0
- package/skills/make-figures/references/exemplar_diagrams/pipeline/pipeline_03.png +0 -0
- package/skills/make-figures/references/exemplar_diagrams/pipeline/pipeline_03_why.md +13 -0
- package/skills/make-figures/references/exemplar_diagrams/pipeline/pipeline_04.meta.yaml +4 -0
- package/skills/make-figures/references/exemplar_diagrams/pipeline/pipeline_04.png +0 -0
- package/skills/make-figures/references/exemplar_diagrams/pipeline/pipeline_04_why.md +13 -0
- package/skills/make-figures/references/exemplar_diagrams/pipeline/pipeline_05.meta.yaml +4 -0
- package/skills/make-figures/references/exemplar_diagrams/pipeline/pipeline_05.png +0 -0
- package/skills/make-figures/references/exemplar_diagrams/pipeline/pipeline_05_why.md +13 -0
- package/skills/make-figures/references/exemplar_diagrams/pipeline/pipeline_06.meta.yaml +4 -0
- package/skills/make-figures/references/exemplar_diagrams/pipeline/pipeline_06.png +0 -0
- package/skills/make-figures/references/exemplar_diagrams/pipeline/pipeline_06_why.md +13 -0
- package/skills/make-figures/references/exemplar_diagrams/pipeline/pipeline_07.meta.yaml +4 -0
- package/skills/make-figures/references/exemplar_diagrams/pipeline/pipeline_07.png +0 -0
- package/skills/make-figures/references/exemplar_diagrams/pipeline/pipeline_07_why.md +13 -0
- package/skills/make-figures/references/exemplar_diagrams/pipeline/pipeline_08.meta.yaml +4 -0
- package/skills/make-figures/references/exemplar_diagrams/pipeline/pipeline_08.png +0 -0
- package/skills/make-figures/references/exemplar_diagrams/pipeline/pipeline_08_why.md +13 -0
- package/skills/make-figures/references/exemplar_diagrams/pipeline/pipeline_09.meta.yaml +4 -0
- package/skills/make-figures/references/exemplar_diagrams/pipeline/pipeline_09.png +0 -0
- package/skills/make-figures/references/exemplar_diagrams/pipeline/pipeline_09_why.md +13 -0
- package/skills/make-figures/references/exemplar_diagrams/pipeline/pipeline_10.meta.yaml +4 -0
- package/skills/make-figures/references/exemplar_diagrams/pipeline/pipeline_10.png +0 -0
- package/skills/make-figures/references/exemplar_diagrams/pipeline/pipeline_10_why.md +13 -0
- package/skills/make-figures/references/exemplar_diagrams/prisma/README.md +15 -0
- package/skills/make-figures/references/exemplar_diagrams/prisma/template_input.yaml +47 -0
- package/skills/make-figures/references/exemplar_diagrams/prisma/template_output.pdf +0 -0
- package/skills/make-figures/references/exemplar_diagrams/prisma/template_output.png +0 -0
- package/skills/make-figures/references/exemplar_diagrams/prisma/template_output_600.png +0 -0
- package/skills/make-figures/references/exemplar_diagrams/stard/README.md +15 -0
- package/skills/make-figures/references/exemplar_diagrams/stard/template_input.yaml +40 -0
- package/skills/make-figures/references/exemplar_diagrams/stard/template_output.pdf +0 -0
- package/skills/make-figures/references/exemplar_diagrams/stard/template_output.png +0 -0
- package/skills/make-figures/references/exemplar_diagrams/stard/template_output_600.png +0 -0
- package/skills/make-figures/references/exemplar_diagrams/strobe/template_input.yaml +43 -0
- package/skills/make-figures/references/exemplar_diagrams/strobe/template_input_pptx.yaml +43 -0
- package/skills/make-figures/references/exemplar_diagrams/strobe/template_output.pdf +0 -0
- package/skills/make-figures/references/exemplar_diagrams/strobe/template_output.png +0 -0
- package/skills/make-figures/references/exemplar_diagrams/strobe/template_output.pptx +0 -0
- package/skills/make-figures/references/exemplar_diagrams/strobe/template_output_600.png +0 -0
- package/skills/make-figures/references/figure_specs.md +291 -0
- package/skills/make-figures/references/flow_diagram_lessons.md +164 -0
- package/skills/make-figures/references/jacc_central_illustration_principles.md +91 -0
- package/skills/make-figures/references/medical_illustration_sources.md +98 -0
- package/skills/make-figures/references/pipeline_concepts_medical_ai.md +240 -0
- package/skills/make-figures/references/reporting_guideline_figure_map.md +104 -0
- package/skills/make-figures/references/visual_abstract_templates/european_radiology.pptx +0 -0
- package/skills/make-figures/references/visual_abstract_templates/jacc_central_illustration.pptx +0 -0
- package/skills/make-figures/references/visual_abstract_templates/medsci_default.pptx +0 -0
- package/skills/make-figures/references/visual_abstract_templates/template_guide.md +114 -0
- package/skills/make-figures/scripts/build_jacc_template.py +77 -0
- package/skills/make-figures/scripts/build_prisma2020_template.py +371 -0
- package/skills/make-figures/scripts/build_strobe_template.py +351 -0
- package/skills/make-figures/scripts/critic_figure.py +264 -0
- package/skills/make-figures/scripts/derive_figure_legend_counts.py +138 -0
- package/skills/make-figures/scripts/extract_exemplar_from_pdf.py +186 -0
- package/skills/make-figures/scripts/fetch_official_templates.sh +88 -0
- package/skills/make-figures/scripts/fill_prisma_template.py +142 -0
- package/skills/make-figures/scripts/generate_flow_diagram.R +133 -0
- package/skills/make-figures/scripts/generate_image.py +99 -0
- package/skills/make-figures/scripts/generate_visual_abstract.py +438 -0
- package/skills/make-figures/scripts/validate_pptx_mac_compat.py +233 -0
- package/skills/make-figures/skill.yml +52 -0
- package/skills/make-figures/templates/official/NOTES.md +62 -0
- package/skills/make-figures/templates/official/consort2010/CONSORT_2025_editable_checklist.docx +0 -0
- package/skills/make-figures/templates/official/consort2010/CONSORT_2025_flow_diagram.docx +0 -0
- package/skills/make-figures/templates/official/prisma2020/PRISMA_2020_flow_new_v1.pptx +0 -0
- package/skills/make-figures/templates/official/prisma2020/PRISMA_2020_flow_new_v2.pptx +0 -0
- package/skills/make-figures/templates/official/prisma2020/PRISMA_2020_flow_updated_v2.pptx +0 -0
- package/skills/make-figures/templates/official/spirit2013/SPIRIT_2025_editable_checklist.docx +0 -0
- package/skills/make-figures/templates/official/spirit2013/SPIRIT_2025_participant_timeline.docx +0 -0
- package/skills/make-figures/templates/official/stard2015/STARD_2015_checklist.docx +0 -0
- package/skills/make-figures/templates/official/stard2015/STARD_2015_flow_diagram.pdf +0 -0
- package/skills/make-figures/tests/fixtures/figure1_flow.yaml +8 -0
- package/skills/make-figures/tests/fixtures/manuscript_ok.md +9 -0
- package/skills/make-figures/tests/fixtures/manuscript_stale.md +4 -0
- package/skills/make-figures/tests/test_legend_reconcile.sh +36 -0
- package/skills/manage-project/SKILL.md +358 -0
- package/skills/manage-project/references/pre_submission_checklist.md +53 -0
- package/skills/manage-project/references/project_state_template.json +37 -0
- package/skills/manage-project/references/scaffold_templates.md +118 -0
- package/skills/manage-project/references/status_output_format.md +44 -0
- package/skills/manage-project/references/timeline_example.md +20 -0
- package/skills/manage-project/skill.yml +36 -0
- package/skills/manage-project/templates/SSOT.yaml.template +41 -0
- package/skills/manage-refs/LICENSE.zotero-mcp +21 -0
- package/skills/manage-refs/NOTICE.md +29 -0
- package/skills/manage-refs/SKILL.md +289 -0
- package/skills/manage-refs/citation_styles/README.md +40 -0
- package/skills/manage-refs/citation_styles/american-journal-of-roentgenology.csl +211 -0
- package/skills/manage-refs/citation_styles/cardiovascular-and-interventional-radiology.csl +19 -0
- package/skills/manage-refs/citation_styles/european-radiology.csl +19 -0
- package/skills/manage-refs/citation_styles/journal-of-cachexia-sarcopenia-and-muscle.csl +150 -0
- package/skills/manage-refs/citation_styles/journal-of-korean-medical-science-strict.csl +533 -0
- package/skills/manage-refs/citation_styles/journal-of-korean-medical-science.csl +16 -0
- package/skills/manage-refs/citation_styles/korean-journal-of-radiology.csl +155 -0
- package/skills/manage-refs/citation_styles/nature.csl +189 -0
- package/skills/manage-refs/citation_styles/nlm-citation-sequence.csl +535 -0
- package/skills/manage-refs/citation_styles/radiology.csl +228 -0
- package/skills/manage-refs/citation_styles/springer-basic-brackets.csl +187 -0
- package/skills/manage-refs/citation_styles/springer-vancouver-brackets.csl +276 -0
- package/skills/manage-refs/citation_styles/vancouver-superscript.csl +536 -0
- package/skills/manage-refs/citation_styles/vancouver.csl +535 -0
- package/skills/manage-refs/references/REFERENCE_STYLE_SPECS.md +59 -0
- package/skills/manage-refs/references/check_xref_symptoms.md +35 -0
- package/skills/manage-refs/scripts/_vendor_citation_writer.py +600 -0
- package/skills/manage-refs/scripts/check_citation_keys.py +112 -0
- package/skills/manage-refs/scripts/check_csl_render.py +102 -0
- package/skills/manage-refs/scripts/check_xref.py +633 -0
- package/skills/manage-refs/scripts/fill_journal_abbrev.py +104 -0
- package/skills/manage-refs/scripts/inject_zotero_cwyw.py +133 -0
- package/skills/manage-refs/scripts/md_marker_convert.py +193 -0
- package/skills/manage-refs/scripts/pre_submission_gate.sh +238 -0
- package/skills/manage-refs/scripts/render_pandoc.sh +88 -0
- package/skills/manage-refs/skill.yml +70 -0
- package/skills/manage-refs/tests/fixtures/pre_submission_gate/README.md +32 -0
- package/skills/manage-refs/tests/fixtures/pre_submission_gate/manuscript.md +10 -0
- package/skills/manage-refs/tests/fixtures/pre_submission_gate/refs.bib +34 -0
- package/skills/manage-refs/tests/fixtures/pre_submission_gate/run.sh +117 -0
- package/skills/manage-refs/tests/test_vN_docx_check.sh +145 -0
- package/skills/meta-analysis/SKILL.md +739 -0
- package/skills/meta-analysis/references/LICENSES.md +21 -0
- package/skills/meta-analysis/references/PROSPERO_template.md +221 -0
- package/skills/meta-analysis/references/ai_pre_screening_template.py +245 -0
- package/skills/meta-analysis/references/checklists/JBI_Case_Series.md +45 -0
- package/skills/meta-analysis/references/checklists/NOS.md +88 -0
- package/skills/meta-analysis/references/checklists/PRISMA_DTA.md +36 -0
- package/skills/meta-analysis/references/checklists/PROBAST.md +75 -0
- package/skills/meta-analysis/references/checklists/QUADAS2.md +77 -0
- package/skills/meta-analysis/references/checklists/ROBINS_I.md +87 -0
- package/skills/meta-analysis/references/checklists/RoB2.md +79 -0
- package/skills/meta-analysis/references/data_integrity_checklist.md +57 -0
- package/skills/meta-analysis/references/icmje_coi_guide.md +181 -0
- package/skills/meta-analysis/references/phase10_recovery.md +136 -0
- package/skills/meta-analysis/references/phase4_km_composite.md +58 -0
- package/skills/meta-analysis/references/phase6_statistical_synthesis.md +148 -0
- package/skills/meta-analysis/references/phase9_circulation.md +84 -0
- package/skills/meta-analysis/references/post_submission_release_ops.md +41 -0
- package/skills/meta-analysis/references/r_templates.md +132 -0
- package/skills/meta-analysis/references/review_orchestration.md +40 -0
- package/skills/meta-analysis/references/submission_package_drift.md +71 -0
- package/skills/meta-analysis/scripts/check_pool_consistency.py +201 -0
- package/skills/meta-analysis/scripts/cohort_overlap_check.py +242 -0
- package/skills/meta-analysis/scripts/dta_extraction_qc.py +137 -0
- package/skills/meta-analysis/scripts/screening_reconcile.py +160 -0
- package/skills/meta-analysis/skill.yml +47 -0
- package/skills/meta-analysis/templates/FINAL_POOL_LOCK.yaml.template +70 -0
- package/skills/meta-analysis/templates/extraction_form_v2.md +129 -0
- package/skills/meta-analysis/templates/supplementary_8file_checklist.md +94 -0
- package/skills/meta-analysis/tests/test_pool_consistency.sh +123 -0
- package/skills/orchestrate/SKILL.md +501 -0
- package/skills/orchestrate/references/dialogue_nodes.md +196 -0
- package/skills/orchestrate/references/report_template.md +109 -0
- package/skills/orchestrate/references/report_template_ko.md +88 -0
- package/skills/orchestrate/skill.yml +44 -0
- package/skills/peer-review/SKILL.md +381 -0
- package/skills/peer-review/references/aczel_2021_reviewer2_patterns.md +88 -0
- package/skills/peer-review/references/domain-probes/ai_overclaiming.md +47 -0
- package/skills/peer-review/references/domain-probes/narrative_review.md +44 -0
- package/skills/peer-review/references/domain-probes/observational_confounding.md +48 -0
- package/skills/peer-review/references/domain-probes/radiomics.md +38 -0
- package/skills/peer-review/references/domain-probes/sr_ma.md +87 -0
- package/skills/peer-review/references/domain-probes/survival_prognostic.md +68 -0
- package/skills/peer-review/references/exemplar_reviews/README.md +43 -0
- package/skills/peer-review/references/exemplar_reviews/ai_overclaiming.md +47 -0
- package/skills/peer-review/references/exemplar_reviews/calibration_missing.md +44 -0
- package/skills/peer-review/references/exemplar_reviews/data_leakage.md +48 -0
- package/skills/peer-review/references/exemplar_reviews/reference_standard_validity.md +45 -0
- package/skills/peer-review/references/narrative_review_audit.md +67 -0
- package/skills/peer-review/references/reviewer_calibration/README.md +34 -0
- package/skills/peer-review/references/reviewer_calibration/compliance_floor.md +52 -0
- package/skills/peer-review/references/reviewer_profiles/AJR.md +82 -0
- package/skills/peer-review/references/reviewer_profiles/EURE.md +64 -0
- package/skills/peer-review/references/reviewer_profiles/INSI.md +57 -0
- package/skills/peer-review/references/reviewer_profiles/KJR.md +100 -0
- package/skills/peer-review/references/reviewer_profiles/README.md +32 -0
- package/skills/peer-review/references/reviewer_profiles/RYAI.md +86 -0
- package/skills/peer-review/skill.yml +39 -0
- package/skills/present-paper/SKILL.md +675 -0
- package/skills/present-paper/references/critic_rubrics/slide.md +155 -0
- package/skills/present-paper/references/generate_pptx_templates.py +604 -0
- package/skills/present-paper/references/medical_presentation_templates.md +277 -0
- package/skills/present-paper/references/slide_design_principles.md +202 -0
- package/skills/present-paper/references/slide_visual_styles/nature_lancet.md +168 -0
- package/skills/present-paper/references/workflow-checklist.md +109 -0
- package/skills/present-paper/scripts/extract_pdf_figures.py +243 -0
- package/skills/present-paper/scripts/inject_pronunciation_notes.py +178 -0
- package/skills/present-paper/scripts/inject_speaker_notes.py +133 -0
- package/skills/present-paper/scripts/strip_notes_for_sharing.py +140 -0
- package/skills/present-paper/scripts/trim_caption.py +271 -0
- package/skills/present-paper/skill.yml +41 -0
- package/skills/present-paper/templates/build_pptx_nature_lancet.py +688 -0
- package/skills/publish-skill/SKILL.md +370 -0
- package/skills/publish-skill/references/license-compatibility-matrix.md +132 -0
- package/skills/publish-skill/references/pii-patterns.md +130 -0
- package/skills/publish-skill/scripts/audit_skill.sh +278 -0
- package/skills/publish-skill/skill.yml +35 -0
- package/skills/render-pdf-doc/SKILL.md +146 -0
- package/skills/render-pdf-doc/references/known_pitfalls.md +53 -0
- package/skills/render-pdf-doc/references/pandoc_korean_cheatsheet.md +77 -0
- package/skills/render-pdf-doc/scripts/check_deps.sh +42 -0
- package/skills/render-pdf-doc/scripts/infer_colwidths.py +164 -0
- package/skills/render-pdf-doc/scripts/render_pdf.sh +98 -0
- package/skills/render-pdf-doc/skill.yml +57 -0
- package/skills/render-pdf-doc/templates/anchor-doc.md +27 -0
- package/skills/render-pdf-doc/templates/anchor-doc_ko.md +25 -0
- package/skills/render-pdf-doc/templates/briefing-handout.md +33 -0
- package/skills/render-pdf-doc/templates/briefing-handout_ko.md +31 -0
- package/skills/render-pdf-doc/templates/proposal-cover.md +33 -0
- package/skills/render-pdf-doc/templates/proposal-cover_ko.md +31 -0
- package/skills/render-pdf-doc/templates/reference-table.md +22 -0
- package/skills/render-pdf-doc/templates/reference-table_ko.md +20 -0
- package/skills/replicate-study/SKILL.md +150 -0
- package/skills/replicate-study/references/harmonization_3country.csv +47 -0
- package/skills/replicate-study/references/harmonization_knhanes_nhanes.csv +68 -0
- package/skills/replicate-study/references/methodology_extraction_template.md +134 -0
- package/skills/replicate-study/skill.yml +37 -0
- package/skills/review-paper/SKILL.md +104 -0
- package/skills/review-paper/references/macro_skeleton.md +6 -0
- package/skills/review-paper/skill.yml +25 -0
- package/skills/revise/SKILL.md +515 -0
- package/skills/revise/references/r2r_voice.md +346 -0
- package/skills/revise/skill.yml +43 -0
- package/skills/search-lit/SKILL.md +443 -0
- package/skills/search-lit/references/parse_pubmed.py +326 -0
- package/skills/search-lit/references/pubmed_eutils.sh +111 -0
- package/skills/search-lit/skill.yml +46 -0
- package/skills/self-review/SKILL.md +1045 -0
- package/skills/self-review/references/domain-probes/ai_overclaiming.md +47 -0
- package/skills/self-review/references/domain-probes/narrative_review.md +44 -0
- package/skills/self-review/references/domain-probes/observational_confounding.md +48 -0
- package/skills/self-review/references/domain-probes/radiomics.md +38 -0
- package/skills/self-review/references/domain-probes/sr_ma.md +87 -0
- package/skills/self-review/references/domain-probes/survival_prognostic.md +68 -0
- package/skills/self-review/references/exemplar_findings/README.md +43 -0
- package/skills/self-review/references/exemplar_findings/cohort_arithmetic_mismatch.md +35 -0
- package/skills/self-review/references/exemplar_findings/estimand_drift_posthoc_primary.md +39 -0
- package/skills/self-review/references/exemplar_findings/scope_overreach_cross_sectional.md +35 -0
- package/skills/self-review/references/exemplar_findings/unadjusted_confounder.md +36 -0
- package/skills/self-review/references/panel_review_template.md +177 -0
- package/skills/self-review/scripts/check_artifact_coverage.py +301 -0
- package/skills/self-review/scripts/check_claim_artifact.py +248 -0
- package/skills/self-review/scripts/check_classical_style.py +185 -0
- package/skills/self-review/scripts/check_cohort_arithmetic.py +481 -0
- package/skills/self-review/scripts/check_confounding_completeness.py +287 -0
- package/skills/self-review/scripts/check_panel_diversity.py +336 -0
- package/skills/self-review/scripts/check_reference_adequacy.py +392 -0
- package/skills/self-review/scripts/check_reviewer_team_consistency.py +412 -0
- package/skills/self-review/scripts/check_scope_coherence.py +177 -0
- package/skills/self-review/skill.yml +47 -0
- package/skills/self-review/tests/fixtures/claim_manuscript.md +17 -0
- package/skills/self-review/tests/fixtures/claim_prereg.md +6 -0
- package/skills/self-review/tests/fixtures/cohort_bad.md +21 -0
- package/skills/self-review/tests/fixtures/cohort_clean.md +21 -0
- package/skills/self-review/tests/fixtures/cohort_partition.csv +5 -0
- package/skills/self-review/tests/fixtures/coverage_analysis/31_delong_nested_added_value.csv +3 -0
- package/skills/self-review/tests/fixtures/coverage_analysis/table1_demographics.csv +3 -0
- package/skills/self-review/tests/fixtures/coverage_clean.md +13 -0
- package/skills/self-review/tests/fixtures/coverage_manuscript.md +11 -0
- package/skills/self-review/tests/fixtures/panel_collapse.json +27 -0
- package/skills/self-review/tests/fixtures/panel_good.json +32 -0
- package/skills/self-review/tests/fixtures/panel_monoculture.json +32 -0
- package/skills/self-review/tests/fixtures/refadeq_letter.md +13 -0
- package/skills/self-review/tests/fixtures/refadeq_original_fixed.md +42 -0
- package/skills/self-review/tests/fixtures/refadeq_original_uncited.md +40 -0
- package/skills/self-review/tests/fixtures/scope_bad.md +9 -0
- package/skills/self-review/tests/fixtures/scope_clean.md +8 -0
- package/skills/self-review/tests/fixtures/scope_surrogate.md +8 -0
- package/skills/self-review/tests/fixtures/style_bad.md +13 -0
- package/skills/self-review/tests/fixtures/style_clean.md +11 -0
- package/skills/self-review/tests/fixtures/table1_by_exposure.csv +11 -0
- package/skills/self-review/tests/test_artifact_coverage.sh +44 -0
- package/skills/self-review/tests/test_claim_artifact.sh +50 -0
- package/skills/self-review/tests/test_classical_style.sh +44 -0
- package/skills/self-review/tests/test_cohort_arithmetic.sh +49 -0
- package/skills/self-review/tests/test_confounding_completeness.sh +66 -0
- package/skills/self-review/tests/test_panel_diversity.sh +55 -0
- package/skills/self-review/tests/test_panel_mode.sh +69 -0
- package/skills/self-review/tests/test_reference_adequacy.sh +68 -0
- package/skills/self-review/tests/test_reviewer_team_consistency.sh +138 -0
- package/skills/self-review/tests/test_scope_coherence.sh +46 -0
- package/skills/setup-medsci/SKILL.md +110 -0
- package/skills/setup-medsci/references/setup-checklist.md +51 -0
- package/skills/setup-medsci/skill.yml +30 -0
- package/skills/sync-submission/SKILL.md +382 -0
- package/skills/sync-submission/scripts/author_registry_example.yaml +36 -0
- package/skills/sync-submission/scripts/blind_sweep.py +203 -0
- package/skills/sync-submission/scripts/check_asset_anonymization.py +300 -0
- package/skills/sync-submission/scripts/check_cross_artifact_stale.py +211 -0
- package/skills/sync-submission/scripts/cover_letter_drift_check.py +451 -0
- package/skills/sync-submission/scripts/cross_document_n_check.py +486 -0
- package/skills/sync-submission/scripts/detect_copy_divergence.py +136 -0
- package/skills/sync-submission/scripts/preflight_gate.py +458 -0
- package/skills/sync-submission/scripts/scope_drift_check.py +362 -0
- package/skills/sync-submission/scripts/sync_submission.py +169 -0
- package/skills/sync-submission/skill.yml +43 -0
- package/skills/sync-submission/tests/fixtures/copy_ok.md +5 -0
- package/skills/sync-submission/tests/fixtures/copy_stale.md +5 -0
- package/skills/sync-submission/tests/fixtures/ssot.md +5 -0
- package/skills/sync-submission/tests/test_asset_anonymization.sh +99 -0
- package/skills/sync-submission/tests/test_copy_divergence.sh +44 -0
- package/skills/sync-submission/tests/test_cross_artifact_stale.sh +80 -0
- package/skills/sync-submission/tests/test_cross_document_n.sh +132 -0
- package/skills/sync-submission/tests/test_preflight_gate.sh +112 -0
- package/skills/sync-submission/tests/test_scope_drift.sh +122 -0
- package/skills/sync-submission/tests/test_vN_docx_assertion.sh +51 -0
- package/skills/verify-refs/SKILL.md +177 -0
- package/skills/verify-refs/references/manual_checkpoint_guide.md +100 -0
- package/skills/verify-refs/scripts/verify_cli.sh +62 -0
- package/skills/verify-refs/scripts/verify_refs.py +782 -0
- package/skills/verify-refs/skill.yml +44 -0
- package/skills/verify-refs/tests/fixtures/pagination_placeholder.bib +17 -0
- package/skills/verify-refs/tests/test_pagination_placeholder.sh +42 -0
- package/skills/version-dataset/SKILL.md +143 -0
- package/skills/version-dataset/references/manifest_schema.md +72 -0
- package/skills/version-dataset/scripts/version_dataset.py +242 -0
- package/skills/version-dataset/skill.yml +35 -0
- package/skills/version-dataset/tests/test_version_dataset.sh +52 -0
- package/skills/write-paper/SKILL.md +1148 -0
- package/skills/write-paper/references/exemplar_methods/README.md +38 -0
- package/skills/write-paper/references/exemplar_methods/ai_validation_tripod_claim.md +47 -0
- package/skills/write-paper/references/exemplar_methods/diagnostic_accuracy_stard.md +50 -0
- package/skills/write-paper/references/exemplar_methods/observational_cohort_strobe.md +43 -0
- package/skills/write-paper/references/journal_profiles/AJNR.md +185 -0
- package/skills/write-paper/references/journal_profiles/AJR.md +149 -0
- package/skills/write-paper/references/journal_profiles/Abdominal_Radiology.md +139 -0
- package/skills/write-paper/references/journal_profiles/Academic_Radiology.md +90 -0
- package/skills/write-paper/references/journal_profiles/Annals_of_Internal_Medicine.md +150 -0
- package/skills/write-paper/references/journal_profiles/Artificial_Intelligence_in_Medicine.md +82 -0
- package/skills/write-paper/references/journal_profiles/British_Journal_of_Radiology.md +161 -0
- package/skills/write-paper/references/journal_profiles/CVIR.md +157 -0
- package/skills/write-paper/references/journal_profiles/Chest.md +270 -0
- package/skills/write-paper/references/journal_profiles/Clinical_Radiology.md +160 -0
- package/skills/write-paper/references/journal_profiles/Clinical_and_Molecular_Hepatology.md +147 -0
- package/skills/write-paper/references/journal_profiles/Diabetes_Metabolism_Journal.md +163 -0
- package/skills/write-paper/references/journal_profiles/Diagnostic_and_Interventional_Radiology.md +216 -0
- package/skills/write-paper/references/journal_profiles/Endocrinology_and_Metabolism.md +167 -0
- package/skills/write-paper/references/journal_profiles/European_Journal_of_Preventive_Cardiology.md +192 -0
- package/skills/write-paper/references/journal_profiles/European_Radiology.md +159 -0
- package/skills/write-paper/references/journal_profiles/Hepatology_Communications.md +110 -0
- package/skills/write-paper/references/journal_profiles/Hepatology_International.md +106 -0
- package/skills/write-paper/references/journal_profiles/IEEE_TMI.md +180 -0
- package/skills/write-paper/references/journal_profiles/INSI.md +163 -0
- package/skills/write-paper/references/journal_profiles/Investigative_Radiology.md +86 -0
- package/skills/write-paper/references/journal_profiles/JACC_Advances.md +197 -0
- package/skills/write-paper/references/journal_profiles/JACC_Asia.md +168 -0
- package/skills/write-paper/references/journal_profiles/JACR.md +87 -0
- package/skills/write-paper/references/journal_profiles/JAMA.md +188 -0
- package/skills/write-paper/references/journal_profiles/JAMA_Network_Open.md +170 -0
- package/skills/write-paper/references/journal_profiles/JCSM.md +266 -0
- package/skills/write-paper/references/journal_profiles/JKMS.md +201 -0
- package/skills/write-paper/references/journal_profiles/JMIR.md +88 -0
- package/skills/write-paper/references/journal_profiles/JMIR_Medical_Education.md +86 -0
- package/skills/write-paper/references/journal_profiles/JNIS.md +227 -0
- package/skills/write-paper/references/journal_profiles/JVIR.md +158 -0
- package/skills/write-paper/references/journal_profiles/Journal_of_Clinical_Endocrinology_and_Metabolism.md +191 -0
- package/skills/write-paper/references/journal_profiles/Journal_of_Stroke.md +176 -0
- package/skills/write-paper/references/journal_profiles/KJR.md +185 -0
- package/skills/write-paper/references/journal_profiles/Korean_Circulation_Journal.md +184 -0
- package/skills/write-paper/references/journal_profiles/Korean_Journal_of_Internal_Medicine.md +178 -0
- package/skills/write-paper/references/journal_profiles/Lancet_Gastroenterology_and_Hepatology.md +127 -0
- package/skills/write-paper/references/journal_profiles/Liver_International.md +165 -0
- package/skills/write-paper/references/journal_profiles/Medical_Image_Analysis.md +147 -0
- package/skills/write-paper/references/journal_profiles/NEJM.md +147 -0
- package/skills/write-paper/references/journal_profiles/Nature_Medicine.md +181 -0
- package/skills/write-paper/references/journal_profiles/Neuroradiology.md +151 -0
- package/skills/write-paper/references/journal_profiles/Nutrition_Metabolism_and_Cardiovascular_Diseases.md +184 -0
- package/skills/write-paper/references/journal_profiles/PLOS_Medicine.md +166 -0
- package/skills/write-paper/references/journal_profiles/RYAI.md +124 -0
- package/skills/write-paper/references/journal_profiles/Radiology.md +173 -0
- package/skills/write-paper/references/journal_profiles/Skeletal_Radiology.md +135 -0
- package/skills/write-paper/references/journal_profiles/Stroke.md +210 -0
- package/skills/write-paper/references/journal_profiles/The_BMJ.md +121 -0
- package/skills/write-paper/references/journal_profiles/The_Lancet.md +112 -0
- package/skills/write-paper/references/journal_profiles/The_Lancet_Digital_Health.md +104 -0
- package/skills/write-paper/references/journal_profiles/World_Journal_of_Hepatology.md +106 -0
- package/skills/write-paper/references/journal_profiles/npj_Digital_Medicine.md +93 -0
- package/skills/write-paper/references/paper_types/ai_validation.md +270 -0
- package/skills/write-paper/references/paper_types/animal_study.md +194 -0
- package/skills/write-paper/references/paper_types/case_report.md +237 -0
- package/skills/write-paper/references/paper_types/cross_national.md +328 -0
- package/skills/write-paper/references/paper_types/letter.md +127 -0
- package/skills/write-paper/references/paper_types/meta_analysis.md +181 -0
- package/skills/write-paper/references/paper_types/nhis_cohort.md +297 -0
- package/skills/write-paper/references/paper_types/original_article.md +221 -0
- package/skills/write-paper/references/paper_types/technical_note.md +131 -0
- package/skills/write-paper/references/section_guides/discussion.md +155 -0
- package/skills/write-paper/references/section_guides/introduction.md +108 -0
- package/skills/write-paper/references/section_guides/methods.md +144 -0
- package/skills/write-paper/references/section_guides/results.md +113 -0
- package/skills/write-paper/references/section_guides/step7_1_classical_qc.md +67 -0
- package/skills/write-paper/references/section_guides/step7_4a_audit_recovery.md +74 -0
- package/skills/write-paper/references/section_guides/title_abstract.md +123 -0
- package/skills/write-paper/references/section_templates/methods_statistical.md +147 -0
- package/skills/write-paper/scripts/check_placeholders.py +182 -0
- package/skills/write-paper/skill.yml +48 -0
- package/skills/write-paper/tests/test_placeholders.sh +107 -0
- package/skills/write-protocol/SKILL.md +243 -0
- package/skills/write-protocol/references/ethics_checklist.md +150 -0
- package/skills/write-protocol/references/protocol_template.md +304 -0
- package/skills/write-protocol/skill.yml +34 -0
|
@@ -0,0 +1,140 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
"""
|
|
3
|
+
fill_icmje_coi.py — Batch-fill ICMJE Conflict of Interest Disclosure Forms.
|
|
4
|
+
|
|
5
|
+
Approach: ICMJE's official `coi_disclosure.docx` uses Content Controls (SDTs).
|
|
6
|
+
python-docx's `cell.text` ignores SDT-wrapped content, so we operate on
|
|
7
|
+
`word/document.xml` directly via zipfile + targeted string replacement.
|
|
8
|
+
|
|
9
|
+
Template strategy (works because it avoids authoring SDT XML from scratch):
|
|
10
|
+
- Use a previously-filled ICMJE form ("seed template") as the source, where
|
|
11
|
+
all 13 disclosure items are already marked ☒ + "None" and the final
|
|
12
|
+
certification is ☒.
|
|
13
|
+
- Clone the seed per-author and replace only three fields:
|
|
14
|
+
1. Date (e.g. "April 12, 2026" → "April 20, 2026")
|
|
15
|
+
2. Name (seed author full name → target author full name)
|
|
16
|
+
3. Title (seed manuscript title → target manuscript title)
|
|
17
|
+
|
|
18
|
+
Usage (Python API):
|
|
19
|
+
from fill_icmje_coi import fill_icmje_forms
|
|
20
|
+
fill_icmje_forms(
|
|
21
|
+
seed_docx=Path("/path/to/icmje_seed_filled.docx"),
|
|
22
|
+
seed_name="Placeholder Author",
|
|
23
|
+
seed_title="Placeholder Manuscript Title",
|
|
24
|
+
seed_date="January 1, 2000",
|
|
25
|
+
new_title="Your Manuscript Title",
|
|
26
|
+
new_date="Month D, YYYY",
|
|
27
|
+
authors=[(1, "Author One"), (2, "Author Two"), ...],
|
|
28
|
+
out_dir=Path("submission/{journal}/icmje_forms"),
|
|
29
|
+
)
|
|
30
|
+
|
|
31
|
+
CLI:
|
|
32
|
+
fill_icmje_coi.py --seed <docx> --seed-name "X" --seed-title "Y" \
|
|
33
|
+
--seed-date "April 12, 2026" --new-title "Z" \
|
|
34
|
+
--new-date "April 20, 2026" --out-dir <dir> \
|
|
35
|
+
--authors '[[1,"A"],[2,"B"]]'
|
|
36
|
+
|
|
37
|
+
Safety:
|
|
38
|
+
- Only a literal-string replacement in word/document.xml; no SDT surgery.
|
|
39
|
+
- Seed-value collisions inside other document text are unlikely but verify
|
|
40
|
+
by dumping the seed XML first (see test section in source).
|
|
41
|
+
- All other .docx parts (styles.xml, rels, etc.) copied byte-identically.
|
|
42
|
+
"""
|
|
43
|
+
from __future__ import annotations
|
|
44
|
+
|
|
45
|
+
import argparse
|
|
46
|
+
import json
|
|
47
|
+
import re
|
|
48
|
+
import shutil
|
|
49
|
+
import sys
|
|
50
|
+
import zipfile
|
|
51
|
+
from pathlib import Path
|
|
52
|
+
from typing import Iterable
|
|
53
|
+
|
|
54
|
+
|
|
55
|
+
DOCUMENT_XML = "word/document.xml"
|
|
56
|
+
|
|
57
|
+
|
|
58
|
+
def _replace_in_zip(src: Path, dst: Path, replacements: dict[str, str]) -> None:
|
|
59
|
+
"""Copy src → dst, replacing text in word/document.xml per replacements."""
|
|
60
|
+
with zipfile.ZipFile(src, "r") as zin, zipfile.ZipFile(dst, "w", zipfile.ZIP_DEFLATED) as zout:
|
|
61
|
+
for item in zin.infolist():
|
|
62
|
+
data = zin.read(item.filename)
|
|
63
|
+
if item.filename == DOCUMENT_XML:
|
|
64
|
+
text = data.decode("utf-8")
|
|
65
|
+
for old, new in replacements.items():
|
|
66
|
+
if old and old not in text:
|
|
67
|
+
raise ValueError(
|
|
68
|
+
f"[{dst.name}] seed string not found in document.xml: {old!r}\n"
|
|
69
|
+
f"Dump with: unzip -p <seed.docx> word/document.xml | grep -o '<w:t[^>]*>[^<]*</w:t>'"
|
|
70
|
+
)
|
|
71
|
+
if old:
|
|
72
|
+
# XML-escape new value (& < > " ')
|
|
73
|
+
escaped = (new.replace("&", "&")
|
|
74
|
+
.replace("<", "<")
|
|
75
|
+
.replace(">", ">"))
|
|
76
|
+
text = text.replace(old, escaped)
|
|
77
|
+
data = text.encode("utf-8")
|
|
78
|
+
zout.writestr(item, data)
|
|
79
|
+
|
|
80
|
+
|
|
81
|
+
def fill_icmje_forms(
|
|
82
|
+
seed_docx: Path,
|
|
83
|
+
seed_name: str,
|
|
84
|
+
seed_title: str,
|
|
85
|
+
seed_date: str,
|
|
86
|
+
new_title: str,
|
|
87
|
+
new_date: str,
|
|
88
|
+
authors: Iterable[tuple[int, str]],
|
|
89
|
+
out_dir: Path,
|
|
90
|
+
filename_template: str = "ICMJE_COI_{idx:02d}_{slug}.docx",
|
|
91
|
+
) -> list[Path]:
|
|
92
|
+
"""Generate one filled docx per author. Returns list of written paths."""
|
|
93
|
+
out_dir.mkdir(parents=True, exist_ok=True)
|
|
94
|
+
written: list[Path] = []
|
|
95
|
+
for idx, author_name in authors:
|
|
96
|
+
slug = re.sub(r"\s+", "_", author_name.strip())
|
|
97
|
+
out_path = out_dir / filename_template.format(idx=idx, slug=slug)
|
|
98
|
+
replacements = {
|
|
99
|
+
seed_title: new_title,
|
|
100
|
+
seed_date: new_date,
|
|
101
|
+
seed_name: author_name,
|
|
102
|
+
}
|
|
103
|
+
_replace_in_zip(seed_docx, out_path, replacements)
|
|
104
|
+
written.append(out_path)
|
|
105
|
+
print(f" ✓ {out_path.name} ({author_name})")
|
|
106
|
+
return written
|
|
107
|
+
|
|
108
|
+
|
|
109
|
+
def main() -> int:
|
|
110
|
+
p = argparse.ArgumentParser(description=__doc__.split("\n\n")[0])
|
|
111
|
+
p.add_argument("--seed", type=Path, required=True, help="Filled ICMJE docx to clone")
|
|
112
|
+
p.add_argument("--seed-name", required=True)
|
|
113
|
+
p.add_argument("--seed-title", required=True)
|
|
114
|
+
p.add_argument("--seed-date", required=True)
|
|
115
|
+
p.add_argument("--new-title", required=True)
|
|
116
|
+
p.add_argument("--new-date", required=True)
|
|
117
|
+
p.add_argument("--out-dir", type=Path, required=True)
|
|
118
|
+
p.add_argument("--authors", required=True, help='JSON list: [[1,"Full Name"],...]')
|
|
119
|
+
args = p.parse_args()
|
|
120
|
+
|
|
121
|
+
authors = [tuple(x) for x in json.loads(args.authors)]
|
|
122
|
+
print(f"Seed: {args.seed}")
|
|
123
|
+
print(f"Output dir: {args.out_dir}")
|
|
124
|
+
print(f"Authors: {len(authors)}")
|
|
125
|
+
fill_icmje_forms(
|
|
126
|
+
seed_docx=args.seed,
|
|
127
|
+
seed_name=args.seed_name,
|
|
128
|
+
seed_title=args.seed_title,
|
|
129
|
+
seed_date=args.seed_date,
|
|
130
|
+
new_title=args.new_title,
|
|
131
|
+
new_date=args.new_date,
|
|
132
|
+
authors=authors,
|
|
133
|
+
out_dir=args.out_dir,
|
|
134
|
+
)
|
|
135
|
+
print(f"Done. {len(authors)} forms written to {args.out_dir}")
|
|
136
|
+
return 0
|
|
137
|
+
|
|
138
|
+
|
|
139
|
+
if __name__ == "__main__":
|
|
140
|
+
sys.exit(main())
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
schema_version: 2
|
|
2
|
+
name: fill-icmje-coi
|
|
3
|
+
layer: A
|
|
4
|
+
owner_domain: form_filling
|
|
5
|
+
|
|
6
|
+
when_to_use: "Batch-generate per-author ICMJE COI disclosure forms from a synthetic seed, pre-filled as 'None' with date/name/title replaced."
|
|
7
|
+
when_NOT_to_use: "Filling an IRB or institutional Word form (use fill-protocol)."
|
|
8
|
+
|
|
9
|
+
inputs:
|
|
10
|
+
- "author list"
|
|
11
|
+
- "manuscript title"
|
|
12
|
+
- "date"
|
|
13
|
+
outputs:
|
|
14
|
+
- "per-author coi_disclosure.docx files"
|
|
15
|
+
deterministic_scripts:
|
|
16
|
+
- scripts/fill_icmje_coi.py
|
|
17
|
+
side_effects:
|
|
18
|
+
- writes_docx_forms
|
|
19
|
+
downstream_consumers:
|
|
20
|
+
- none
|
|
21
|
+
forbidden_actions:
|
|
22
|
+
- alter_checkboxes_or_disclosure_items
|
|
23
|
+
- use_a_seed_containing_real_author_pii
|
|
24
|
+
|
|
25
|
+
# v2.1 quality card
|
|
26
|
+
purpose: "Clone the ICMJE COI form per author with date/name/title filled, defaulting all 13 items to 'None' for the no-conflict common case."
|
|
27
|
+
safety_boundaries:
|
|
28
|
+
- "Only date, name, and manuscript title are substituted; the 13 items and certification come from the seed unchanged."
|
|
29
|
+
- "Ships a synthetic PII-free seed; never commits a seed with real author PII."
|
|
30
|
+
known_limitations:
|
|
31
|
+
- "Authors with real disclosures must edit their form in Word; the skill cannot infer conflicts."
|
|
32
|
+
- "A blank ICMJE template cannot be used as the seed (the safety check requires the pre-filled 'None' strings)."
|
|
33
|
+
validation_commands:
|
|
34
|
+
- "verify each output: 14 checked boxes, 13 'None', no seed-placeholder leakage"
|
|
35
|
+
evidence_surface: bundled_script
|
|
Binary file
|
|
@@ -0,0 +1,248 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: fill-protocol
|
|
3
|
+
description: >
|
|
4
|
+
Fill institutional Word form templates (.doc/.docx) for IRB protocols, ethics
|
|
5
|
+
applications, grant proposals, and other structured research documents while
|
|
6
|
+
preserving the original styles, table layouts, fonts, and page geometry. Pairs
|
|
7
|
+
with write-protocol — write-protocol drafts the scientific content, fill-protocol
|
|
8
|
+
renders it into the institutional template. Korean-aware (CJK eastAsia font
|
|
9
|
+
enforcement, table cantSplit) but works for any language template.
|
|
10
|
+
triggers: fill protocol, fill template, fill IRB form, IRB template, ethics template, grant template, 양식 채우기, 연구계획서 작성, 신청서 작성, 정부 양식, 병원 양식, 워드 템플릿
|
|
11
|
+
tools: Read, Write, Edit, Bash, Grep, Glob
|
|
12
|
+
model: inherit
|
|
13
|
+
---
|
|
14
|
+
|
|
15
|
+
# Fill-Protocol Skill
|
|
16
|
+
|
|
17
|
+
You are helping a researcher populate an institutional Word form (IRB protocol,
|
|
18
|
+
ethics application, grant proposal, etc.) without breaking the original document
|
|
19
|
+
formatting. This skill is the formatting counterpart to `write-protocol`: where
|
|
20
|
+
`write-protocol` drafts content, `fill-protocol` lays that content into the
|
|
21
|
+
institutional template.
|
|
22
|
+
|
|
23
|
+
## Why This Skill Exists
|
|
24
|
+
|
|
25
|
+
Recreating institutional forms from scratch with `python-docx` reliably destroys
|
|
26
|
+
table layouts, page breaks, and font consistency. The only safe approach is to
|
|
27
|
+
**open the existing template** and replace cell/paragraph text in place. This
|
|
28
|
+
skill enforces that pattern.
|
|
29
|
+
|
|
30
|
+
## Core Principles (Do Not Violate)
|
|
31
|
+
|
|
32
|
+
1. **Open the existing template — never create from scratch.** Use
|
|
33
|
+
`Document(template_path)`, not `Document()`.
|
|
34
|
+
2. **Convert .doc → .docx via LibreOffice headless** before any editing.
|
|
35
|
+
`pandoc -f doc` is not supported; `textutil` corrupts table structure.
|
|
36
|
+
3. **Match cells by left-label text**, not row/column coordinates. Templates
|
|
37
|
+
evolve and coordinate matching breaks silently.
|
|
38
|
+
4. **Apply `cantSplit` to every filled row** so a row never breaks across pages.
|
|
39
|
+
5. **For CJK languages, set the `eastAsia` font attribute**, not just
|
|
40
|
+
`run.font.name`. Hangul/Kanji/Hanzi will render in fallback fonts otherwise.
|
|
41
|
+
6. **Validate** every fill operation: report unmatched labels, count empty cells,
|
|
42
|
+
and surface mismatches before saving.
|
|
43
|
+
|
|
44
|
+
## Dependencies
|
|
45
|
+
|
|
46
|
+
If the template is already `.docx`, **LibreOffice is not required** — only the
|
|
47
|
+
three Python packages below. LibreOffice is needed only when the template is a
|
|
48
|
+
legacy `.doc` and must be converted first.
|
|
49
|
+
|
|
50
|
+
```bash
|
|
51
|
+
# Python libraries (always required)
|
|
52
|
+
pip install --user docxtpl python-docx pyyaml
|
|
53
|
+
|
|
54
|
+
# LibreOffice (only for legacy .doc input; ~700 MB on macOS)
|
|
55
|
+
brew install --cask libreoffice # macOS
|
|
56
|
+
sudo apt-get install -y libreoffice # Debian/Ubuntu
|
|
57
|
+
sudo dnf install -y libreoffice # Fedora
|
|
58
|
+
sudo pacman -S --needed libreoffice-fresh # Arch
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
### Bundled setup script
|
|
62
|
+
|
|
63
|
+
The skill ships a `setup.sh` that detects what is missing and installs only
|
|
64
|
+
those parts, with a confirmation prompt before each step:
|
|
65
|
+
|
|
66
|
+
```bash
|
|
67
|
+
bash setup.sh check # report what's installed (read-only)
|
|
68
|
+
bash setup.sh install # install missing pieces (asks before each)
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
### Auto-install behavior (for Claude as the caller)
|
|
72
|
+
|
|
73
|
+
When invoking this skill on behalf of a user:
|
|
74
|
+
|
|
75
|
+
1. **Before calling `doc_to_docx.py`**, run `bash setup.sh check`. If
|
|
76
|
+
LibreOffice is missing, **ask the user** before installing — the cask is
|
|
77
|
+
~700 MB and proceeding silently is unfriendly.
|
|
78
|
+
2. **Skip LibreOffice entirely** if the template is already `.docx`. Only
|
|
79
|
+
surface the install prompt when a `.doc` is encountered.
|
|
80
|
+
3. **Never** pass `--yes` to `setup.sh install` unless the user has explicitly
|
|
81
|
+
authorized unattended installation in this session.
|
|
82
|
+
4. If the user declines installation, fall back to asking them to convert
|
|
83
|
+
the `.doc` manually (open in Word/LibreOffice/Pages → Save As → .docx) and
|
|
84
|
+
then re-run with the converted file.
|
|
85
|
+
|
|
86
|
+
## Workflow
|
|
87
|
+
|
|
88
|
+
### Step 1 — Convert legacy .doc to .docx (if needed)
|
|
89
|
+
|
|
90
|
+
```bash
|
|
91
|
+
python scripts/doc_to_docx.py path/to/template.doc path/to/template.docx
|
|
92
|
+
```
|
|
93
|
+
|
|
94
|
+
### Step 2 — Inspect the template structure
|
|
95
|
+
|
|
96
|
+
```bash
|
|
97
|
+
python scripts/inspect_template.py path/to/template.docx
|
|
98
|
+
```
|
|
99
|
+
|
|
100
|
+
This lists every table, every cell (with row/column coordinates and content
|
|
101
|
+
preview), and every top-level paragraph. Use this output to identify the labels
|
|
102
|
+
you will match against in your YAML content file.
|
|
103
|
+
|
|
104
|
+
### Step 3 — Author a content YAML
|
|
105
|
+
|
|
106
|
+
The YAML supports three fill modes. All keys are optional.
|
|
107
|
+
|
|
108
|
+
```yaml
|
|
109
|
+
protections:
|
|
110
|
+
korean_font: "맑은 고딕" # CJK font (set to "Noto Sans CJK KR", "SimSun",
|
|
111
|
+
# "MS Mincho", etc. for other locales)
|
|
112
|
+
cant_split: true # Apply <w:cantSplit/> to every filled row
|
|
113
|
+
|
|
114
|
+
# Readability options (see "Readability" section below for full semantics)
|
|
115
|
+
blank_between_paragraphs: true # default true — Enter between \n\n chunks
|
|
116
|
+
blank_around_section_header: true # default true — Enter above/below filled sections
|
|
117
|
+
blank_around_all_section_headers: false # default false — opt-in; also touches untouched sections
|
|
118
|
+
|
|
119
|
+
# Mode 1 — table key/value (left-label cell → right value cell)
|
|
120
|
+
table_kv:
|
|
121
|
+
"Study Title": "Multi-center prospective validation of ..."
|
|
122
|
+
"Principal Investigator": "Last, First (Department)"
|
|
123
|
+
"연구 목적": "본 연구는 ..."
|
|
124
|
+
|
|
125
|
+
# Mode 2 — section replacement (find numbered header, replace until next header)
|
|
126
|
+
section_replace:
|
|
127
|
+
"1. Background":
|
|
128
|
+
"Hepatocellular carcinoma is the third leading cause of ..."
|
|
129
|
+
"4. 연구 배경 및 이론적 근거":
|
|
130
|
+
"..."
|
|
131
|
+
|
|
132
|
+
# Mode 3 — single paragraph in-place text replacement
|
|
133
|
+
paragraph_replace:
|
|
134
|
+
"Title:":
|
|
135
|
+
"Title: Multi-center prospective validation of ..."
|
|
136
|
+
```
|
|
137
|
+
|
|
138
|
+
### Readability — three blank-line knobs
|
|
139
|
+
|
|
140
|
+
All blank paragraphs inserted by these options use a forced single-line height
|
|
141
|
+
(`<w:spacing w:line="240" w:before="0" w:after="0"/>`) so the gap is exactly
|
|
142
|
+
one body-text line — never inflates the document's apparent line spacing.
|
|
143
|
+
|
|
144
|
+
| Option | Default | What it does | When to flip |
|
|
145
|
+
|---|---|---|---|
|
|
146
|
+
| `blank_between_paragraphs` | `true` | Inserts a blank line between every `\n\n`-split chunk inside `section_replace` | Disable only for forms where every line must be packed tight |
|
|
147
|
+
| `blank_around_section_header` | `true` | Wraps each header that you `section_replace` with a blank above and a blank below | Disable when the template style already adds visual gaps via `space_before/after` |
|
|
148
|
+
| `blank_around_all_section_headers` | `false` | After all fills, scans every numbered header (`\d+\.\s+`) — including ones you didn't replace — and adds blank lines around them | Enable when uniform readability matters more than form fidelity. **Default off because IRB / public-document submissions favor template fidelity over visual consistency** (page count stability, boilerplate untouched, reviewer-expected layout) |
|
|
149
|
+
| `normalize_page_breaks` | `true` | On save, converts dangling empty paragraphs whose sole content is `<w:br w:type="page"/>` into a `<w:pageBreakBefore/>` attribute on the next content paragraph. Prevents visible blank pages when the preceding content (e.g. an abstract table) grows or shrinks and pushes the empty paragraph onto a page of its own, causing the break to land one page later. | Disable only if your template intentionally relies on the empty-paragraph-as-separator pattern for spacing |
|
|
150
|
+
|
|
151
|
+
The third option exists because `section_replace` only touches sections you
|
|
152
|
+
list in the YAML. If a template has 18 numbered sections and you only fill 12,
|
|
153
|
+
the other 6 stay tight against their content — visually inconsistent. Turn the
|
|
154
|
+
opt-in on for documents where you'd rather the consistency than the fidelity.
|
|
155
|
+
|
|
156
|
+
### Step 4 — Run the fill
|
|
157
|
+
|
|
158
|
+
```bash
|
|
159
|
+
python scripts/fill_form.py \
|
|
160
|
+
--template path/to/template.docx \
|
|
161
|
+
--content content.yaml \
|
|
162
|
+
--output path/to/filled.docx
|
|
163
|
+
```
|
|
164
|
+
|
|
165
|
+
The CLI prints `[OK]` / `[MISS]` for every fill operation and a summary at the
|
|
166
|
+
end. Investigate any `[MISS]` before submitting.
|
|
167
|
+
|
|
168
|
+
### Step 5 — Visual verification
|
|
169
|
+
|
|
170
|
+
```bash
|
|
171
|
+
soffice --headless --convert-to pdf path/to/filled.docx
|
|
172
|
+
```
|
|
173
|
+
|
|
174
|
+
Open the PDF and visually confirm: page count is sensible, no table row was
|
|
175
|
+
split across pages, no font fell back to Times New Roman, all required fields
|
|
176
|
+
are populated.
|
|
177
|
+
|
|
178
|
+
## Python API
|
|
179
|
+
|
|
180
|
+
```python
|
|
181
|
+
from fill_form import FormFiller
|
|
182
|
+
|
|
183
|
+
filler = FormFiller("template.docx", korean_font="맑은 고딕")
|
|
184
|
+
|
|
185
|
+
# Fill table cells
|
|
186
|
+
filler.fill_table_kv("Study Title", "...")
|
|
187
|
+
filler.fill_table_kv("연구 목적", "...")
|
|
188
|
+
|
|
189
|
+
# Replace section content (header to next header)
|
|
190
|
+
filler.replace_paragraphs_after("4. Background", new_content)
|
|
191
|
+
|
|
192
|
+
# Replace a single paragraph
|
|
193
|
+
filler.replace_paragraph_matching("Title:", "Title: ...")
|
|
194
|
+
|
|
195
|
+
# Validate and save
|
|
196
|
+
warnings = filler.validate()
|
|
197
|
+
for w in warnings:
|
|
198
|
+
print(w)
|
|
199
|
+
filler.save("filled.docx")
|
|
200
|
+
```
|
|
201
|
+
|
|
202
|
+
## Anti-Patterns (Do Not Do)
|
|
203
|
+
|
|
204
|
+
| Anti-pattern | Consequence |
|
|
205
|
+
|---|---|
|
|
206
|
+
| `Document()` then rebuild table | Loss of header logo, custom margins, footer placeholders, and page numbering |
|
|
207
|
+
| `pandoc -f doc -t docx` | "Unknown input format doc" — pandoc does not parse .doc |
|
|
208
|
+
| `textutil -convert docx` | Table cell merging is dropped or corrupted |
|
|
209
|
+
| `cell.text = "value"` (single assignment) | Run-level styles (bold, color, eastAsia font) are erased |
|
|
210
|
+
| Coordinate-based matching `table.cell(2, 1)` | Silent breakage when the template adds or reorders rows |
|
|
211
|
+
| `run.font.name` alone for Hangul | Hangul characters render in the default Western font |
|
|
212
|
+
|
|
213
|
+
## Companion Skills
|
|
214
|
+
|
|
215
|
+
- `write-protocol` — drafts the scientific content (Background, Study Design,
|
|
216
|
+
Sample Size, Statistical Plan) that `fill-protocol` then renders into the form
|
|
217
|
+
- `hwp-pipeline` — converts Korean Hangul .hwp / .hwpx files; chain it before
|
|
218
|
+
`fill-protocol` when the institutional form is distributed in HWP format
|
|
219
|
+
- `check-reporting` — validates that the filled protocol satisfies CONSORT /
|
|
220
|
+
STARD / TRIPOD / CLAIM checklists before submission
|
|
221
|
+
- `calc-sample-size` — produces the sample size text that `fill-protocol` slots
|
|
222
|
+
into the corresponding section
|
|
223
|
+
|
|
224
|
+
## Files
|
|
225
|
+
|
|
226
|
+
- `scripts/doc_to_docx.py` — LibreOffice headless wrapper for .doc → .docx
|
|
227
|
+
- `scripts/inspect_template.py` — reports tables, cells, and paragraphs
|
|
228
|
+
- `scripts/fill_form.py` — the `FormFiller` library and CLI entry point
|
|
229
|
+
- `examples/` — worked examples for IRB, ethics waiver, and grant templates
|
|
230
|
+
- `references/best_practices.md` — formatting notes (cantSplit, eastAsia,
|
|
231
|
+
multi-line cell text)
|
|
232
|
+
|
|
233
|
+
## Known Limitations
|
|
234
|
+
|
|
235
|
+
- **HWP / HWPX input is not handled directly** — chain with `hwp-pipeline` to
|
|
236
|
+
convert HWP → HWPX → DOCX first.
|
|
237
|
+
- **Merged cells**: filling a label cell that participates in a vertical merge
|
|
238
|
+
may overwrite the merged region's content. Test on a copy first.
|
|
239
|
+
- **Embedded form fields** (Word's content controls): not yet supported. Plain
|
|
240
|
+
paragraph and table cell content only.
|
|
241
|
+
- **Right-to-left scripts** (Arabic, Hebrew): untested.
|
|
242
|
+
|
|
243
|
+
## Anti-Hallucination
|
|
244
|
+
|
|
245
|
+
- **Never fabricate references.** All citations must be verified via `/search-lit` with confirmed DOI or PMID. Mark unverified references as `[UNVERIFIED - NEEDS MANUAL CHECK]`.
|
|
246
|
+
- **Never invent clinical definitions, diagnostic criteria, or guideline recommendations.** If uncertain, flag with `[VERIFY]` and ask the user.
|
|
247
|
+
- **Never fabricate numerical results** — compliance percentages, scores, effect sizes, or sample sizes must come from actual data or analysis output.
|
|
248
|
+
- If a reporting guideline item, journal policy, or clinical standard is uncertain, state the uncertainty rather than guessing.
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
# Example content file for fill-protocol
|
|
2
|
+
# Adapt the labels to match your institution's IRB template exactly
|
|
3
|
+
# (run `inspect_template.py` first to see the actual cell labels)
|
|
4
|
+
|
|
5
|
+
protections:
|
|
6
|
+
korean_font: "맑은 고딕" # Use "Noto Sans CJK KR" on Linux, "Apple SD Gothic Neo" on macOS Apple-default
|
|
7
|
+
cant_split: true
|
|
8
|
+
|
|
9
|
+
# Mode 1: ABSTRACT-style key/value table (most institutional IRB forms)
|
|
10
|
+
table_kv:
|
|
11
|
+
"Study Title": >
|
|
12
|
+
Multi-center prospective validation of [intervention] for [population]
|
|
13
|
+
"Principal Investigator": "Family-Name, Given-Name (Department, Institution)"
|
|
14
|
+
"Study Design": >
|
|
15
|
+
Prospective, multi-center, single-arm validation cohort with [comparator]
|
|
16
|
+
as historical control. Primary endpoint assessed at [timepoint].
|
|
17
|
+
"Study Period": "From IRB approval through [YYYY-MM-DD] (~ X years)"
|
|
18
|
+
"Target Enrollment": "N = X (this institution: n = Y)"
|
|
19
|
+
"Inclusion Criteria": |
|
|
20
|
+
All of the following:
|
|
21
|
+
1. Age ≥ 19 years
|
|
22
|
+
2. [Disease] confirmed by [reference standard] between [date] and [date]
|
|
23
|
+
3. [Imaging modality] with [protocol requirement]
|
|
24
|
+
"Exclusion Criteria": |
|
|
25
|
+
Any of the following:
|
|
26
|
+
1. [Image quality criterion fails]
|
|
27
|
+
2. [Co-existing disease that confounds]
|
|
28
|
+
3. Prior [intervention that alters baseline]
|
|
29
|
+
"Sample Size Justification": >
|
|
30
|
+
[Insert output of /calc-sample-size here, or describe pilot/feasibility framing]
|
|
31
|
+
|
|
32
|
+
# Mode 2: Long-form numbered sections in body text
|
|
33
|
+
section_replace:
|
|
34
|
+
"1. Study Title": >
|
|
35
|
+
English: ...
|
|
36
|
+
Korean (국문): ...
|
|
37
|
+
|
|
38
|
+
"4. Background and Rationale":
|
|
39
|
+
"..." # Insert output of /write-protocol Background section
|
|
40
|
+
|
|
41
|
+
"5. Study Objectives":
|
|
42
|
+
"..." # Insert output of /write-protocol Objectives section
|
|
43
|
+
|
|
44
|
+
"12. Statistical Analysis Plan":
|
|
45
|
+
"..." # Insert output of /write-protocol + /analyze-stats Statistical Plan
|
|
46
|
+
|
|
47
|
+
"18. References":
|
|
48
|
+
"..." # Insert verified references from /search-lit
|
|
49
|
+
|
|
50
|
+
# Mode 3: Single-paragraph in-place text replacement (e.g., the title line)
|
|
51
|
+
paragraph_replace:
|
|
52
|
+
"Title:":
|
|
53
|
+
"Title: Multi-center prospective validation of ..."
|
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
# fill-protocol — Best Practices Reference
|
|
2
|
+
|
|
3
|
+
## CJK Font Setting (mandatory for Korean / Japanese / Chinese)
|
|
4
|
+
|
|
5
|
+
`run.font.name = "맑은 고딕"` alone does **not** apply to Hangul characters in
|
|
6
|
+
docx output. Word and LibreOffice route CJK glyphs through the `eastAsia`
|
|
7
|
+
font slot, which lives in `<w:rPr><w:rFonts w:eastAsia="..."/>`. The skill
|
|
8
|
+
sets all four font slots (`ascii`, `hAnsi`, `cs`, `eastAsia`) to the same
|
|
9
|
+
font name to guarantee consistent rendering.
|
|
10
|
+
|
|
11
|
+
### Recommended fonts by platform
|
|
12
|
+
|
|
13
|
+
| Platform | CJK font that always exists |
|
|
14
|
+
|---|---|
|
|
15
|
+
| Windows | 맑은 고딕 (Malgun Gothic) |
|
|
16
|
+
| macOS | Apple SD Gothic Neo |
|
|
17
|
+
| Linux | Noto Sans CJK KR |
|
|
18
|
+
|
|
19
|
+
If the document will be opened on multiple platforms, embed the font in the
|
|
20
|
+
.docx (Word: File → Options → Save → Embed fonts in the file) or stick to
|
|
21
|
+
fonts that exist everywhere (Noto family).
|
|
22
|
+
|
|
23
|
+
## Table Row Page-Break Prevention (`cantSplit`)
|
|
24
|
+
|
|
25
|
+
Korean institutional IRB tables routinely have multi-line cells (e.g.
|
|
26
|
+
inclusion/exclusion criteria with 5–10 items). Without `cantSplit`, a row
|
|
27
|
+
can break across pages and the label cell ends up orphaned on the previous
|
|
28
|
+
page.
|
|
29
|
+
|
|
30
|
+
The XML insertion looks like:
|
|
31
|
+
|
|
32
|
+
```xml
|
|
33
|
+
<w:tr>
|
|
34
|
+
<w:trPr>
|
|
35
|
+
<w:cantSplit/> <!-- this line is added by the skill -->
|
|
36
|
+
</w:trPr>
|
|
37
|
+
...
|
|
38
|
+
</w:tr>
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
The skill applies this automatically to every row that gets filled.
|
|
42
|
+
You can also pre-set this in Word: select the row → Layout → Properties →
|
|
43
|
+
Row → uncheck "Allow row to break across pages".
|
|
44
|
+
|
|
45
|
+
## Multi-line Cell Content
|
|
46
|
+
|
|
47
|
+
YAML `|` (literal block) and `>` (folded block) both produce strings with
|
|
48
|
+
embedded newlines. `fill-protocol` splits on `\n` and writes each line as a
|
|
49
|
+
separate paragraph in the cell, cloning the first paragraph's `pPr` so
|
|
50
|
+
indentation, line spacing, and alignment are preserved.
|
|
51
|
+
|
|
52
|
+
```yaml
|
|
53
|
+
"Inclusion Criteria": |
|
|
54
|
+
All of the following:
|
|
55
|
+
1. Age ≥ 19 years
|
|
56
|
+
2. Confirmed diagnosis ...
|
|
57
|
+
3. Imaging within 30 days
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
If you want bullets (•) instead of numbers, type them literally in the
|
|
61
|
+
YAML — Word formatting is preserved at the run level, but list numbering
|
|
62
|
+
markers are not auto-generated.
|
|
63
|
+
|
|
64
|
+
## Label Matching
|
|
65
|
+
|
|
66
|
+
The skill normalizes whitespace (including newlines) before comparing
|
|
67
|
+
cell content to the YAML key. So a cell labeled
|
|
68
|
+
|
|
69
|
+
```
|
|
70
|
+
연구대상자
|
|
71
|
+
정보
|
|
72
|
+
```
|
|
73
|
+
|
|
74
|
+
matches the YAML key `"연구대상자 정보"` (with a space). Confirm exact
|
|
75
|
+
labels via `inspect_template.py` — institutional templates often have
|
|
76
|
+
trailing spaces, half-width vs. full-width parentheses, or zero-width
|
|
77
|
+
characters that are invisible in Word but break exact-match.
|
|
78
|
+
|
|
79
|
+
## Section Header Matching
|
|
80
|
+
|
|
81
|
+
`section_replace` finds a paragraph whose text equals the YAML key, then
|
|
82
|
+
replaces every paragraph from there until the next paragraph that starts
|
|
83
|
+
with `\d+\.\s+` (e.g. "1. ", "12. "). This is robust across templates
|
|
84
|
+
that re-number sections, but assumes numbered headers. For non-numbered
|
|
85
|
+
templates, pass `stop_pattern` to `replace_paragraphs_after()` directly
|
|
86
|
+
in Python.
|
|
87
|
+
|
|
88
|
+
## Merged Cells
|
|
89
|
+
|
|
90
|
+
`python-docx` returns the same `_Cell` object for cells that participate
|
|
91
|
+
in a merge (horizontal or vertical). Filling such a cell once propagates
|
|
92
|
+
the content. The skill detects this via `id(cell._tc)` and skips
|
|
93
|
+
duplicates within a row, so vertical-merge label cells won't be filled
|
|
94
|
+
multiple times.
|
|
95
|
+
|
|
96
|
+
## Validation Before Submission
|
|
97
|
+
|
|
98
|
+
Always run the visual check:
|
|
99
|
+
|
|
100
|
+
```bash
|
|
101
|
+
soffice --headless --convert-to pdf filled.docx
|
|
102
|
+
```
|
|
103
|
+
|
|
104
|
+
Look for:
|
|
105
|
+
|
|
106
|
+
1. Page count is roughly equal to the original template (±20% is normal,
|
|
107
|
+
±50% suggests content overflow or section deletion).
|
|
108
|
+
2. No empty cells in mandatory fields.
|
|
109
|
+
3. Footer / page number formatting unchanged.
|
|
110
|
+
4. CJK characters rendering correctly (not boxes, not Times New Roman
|
|
111
|
+
substitution).
|
|
112
|
+
5. Tables not broken across pages mid-row.
|
|
113
|
+
|
|
114
|
+
## When This Skill Is Not the Right Tool
|
|
115
|
+
|
|
116
|
+
- **HWP / HWPX input**: chain with `hwp-pipeline` first (HWP → HWPX → DOCX)
|
|
117
|
+
- **PDF form filling**: use the `pdf` skill or a dedicated PDF-form library
|
|
118
|
+
- **Free-form research writing**: use `write-paper` or `write-protocol`
|
|
119
|
+
- **Slides / presentations**: use `generate-pptx`
|
|
120
|
+
- **Templates with Word "content controls"** (interactive form fields): not
|
|
121
|
+
yet supported by this skill
|