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,177 @@
|
|
|
1
|
+
# Panel Review Template (Phase 2.6)
|
|
2
|
+
|
|
3
|
+
Reusable scaffolding for the multi-agent panel: a reviewer output schema, a
|
|
4
|
+
generic reviewer prompt skeleton with per-domain focus checklists, and an
|
|
5
|
+
editor synthesis prompt skeleton. This is a template, not a runtime program —
|
|
6
|
+
it carries no manuscript-specific content. Fill the `{...}` placeholders from
|
|
7
|
+
the manuscript under review and from the reviewer-set mapping in Phase 2.6.
|
|
8
|
+
|
|
9
|
+
The per-domain focus checklists below name *categories of concern*; the precise
|
|
10
|
+
probes (and their output templates) live in the vendored domain-probe modules
|
|
11
|
+
(`references/domain-probes/*.md`), which each reviewer should load.
|
|
12
|
+
|
|
13
|
+
---
|
|
14
|
+
|
|
15
|
+
## Reviewer output schema
|
|
16
|
+
|
|
17
|
+
Each reviewer returns one object with these fields:
|
|
18
|
+
|
|
19
|
+
```json
|
|
20
|
+
{
|
|
21
|
+
"reviewer_id": "R1",
|
|
22
|
+
"expertise_area": "Biostatistics & Study Design",
|
|
23
|
+
"overall_assessment": "3-5 sentences. State explicitly whether a fatal flaw exists and name the single biggest threat to the conclusions.",
|
|
24
|
+
"strengths": ["...", "..."],
|
|
25
|
+
"major": [
|
|
26
|
+
{
|
|
27
|
+
"number": 1,
|
|
28
|
+
"heading": "Short title of the issue",
|
|
29
|
+
"comment": "Detailed critique. Quote the manuscript where relevant. Explain why it threatens validity.",
|
|
30
|
+
"location": "section / table / figure / specific claim",
|
|
31
|
+
"severity": "Fatal | Fixable",
|
|
32
|
+
"suggested_fix": "What the authors should do to address it"
|
|
33
|
+
}
|
|
34
|
+
],
|
|
35
|
+
"minor": [
|
|
36
|
+
{ "number": 1, "comment": "...", "location": "..." }
|
|
37
|
+
]
|
|
38
|
+
}
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
`severity` uses this skill's own scale: **Fatal** for a conclusion-threatening /
|
|
42
|
+
design-level finding, **Fixable** for a reporting-level finding.
|
|
43
|
+
|
|
44
|
+
---
|
|
45
|
+
|
|
46
|
+
## Reviewer prompt skeleton
|
|
47
|
+
|
|
48
|
+
> You are an expert peer reviewer for a competitive journal in {field}, performing a
|
|
49
|
+
> blinded pre-submission review of the author's own manuscript. Read the full
|
|
50
|
+
> manuscript (and any supplement) first.
|
|
51
|
+
>
|
|
52
|
+
> TONE: rigorous and skeptical, but fair and constructive. Hunt for the issues that
|
|
53
|
+
> threaten the manuscript's conclusions. Keep strengths to 2–3 genuine items. Every
|
|
54
|
+
> major comment must threaten an actual conclusion or a reporting requirement; quote
|
|
55
|
+
> the manuscript when you criticize a specific claim, and cite the location.
|
|
56
|
+
>
|
|
57
|
+
> Stay strictly within YOUR assigned area of expertise: {expertise_area}. Do not
|
|
58
|
+
> stray into the other reviewers' domains. Load and apply the probes in
|
|
59
|
+
> {domain_probe_module} where it applies. Produce 4–8 major comments and 4–10 minor
|
|
60
|
+
> comments, and return them in the reviewer output schema above. Set `reviewer_id`
|
|
61
|
+
> to "{reviewer_id}" and `expertise_area` to "{expertise_area}".
|
|
62
|
+
>
|
|
63
|
+
> YOUR FOCUS:
|
|
64
|
+
> {focus_checklist}
|
|
65
|
+
|
|
66
|
+
### Per-domain focus checklists (generic)
|
|
67
|
+
|
|
68
|
+
**Biostatistics & Study Design**
|
|
69
|
+
- Model specification: is the primary model pre-specified, or chosen post hoc in a results-favorable direction? Over-adjustment / conditioning on mediators on the causal pathway?
|
|
70
|
+
- Assumption checks appropriate to the model (e.g., proportional hazards for Cox), and adequacy of any corrections.
|
|
71
|
+
- Missing data: extent, plausibility of the missingness mechanism, whether the headline estimate survives a principled imputation, and whether imputation is primary or relegated to sensitivity.
|
|
72
|
+
- Competing risks / informative censoring where multiple event types exist.
|
|
73
|
+
- Sparse events: events-per-variable, penalization adequacy, CI stability.
|
|
74
|
+
- Multiplicity across multiple outcomes, subgroups, and exploratory analyses.
|
|
75
|
+
- Sensitivity / bias analyses (e.g., E-value) computed and interpreted correctly.
|
|
76
|
+
- Time-zero / immortal-time / left-truncation; power for any null finding.
|
|
77
|
+
|
|
78
|
+
**Clinical (domain)**
|
|
79
|
+
- Clinical actionability: do the stated recommendations follow from the actual (possibly attenuated) results, or do they overreach?
|
|
80
|
+
- Residual confounding by the dominant clinical driver of the outcome; can the exposure be disentangled from it?
|
|
81
|
+
- Screening vs symptomatic population framing; external validity to the target readership.
|
|
82
|
+
- Plausibility of the pattern of findings (e.g., a selective association without an expected concomitant one) — biology vs confounding vs chance.
|
|
83
|
+
- Whether the findings would change management for a real patient.
|
|
84
|
+
- Missing clinical variables and their interpretive cost.
|
|
85
|
+
|
|
86
|
+
**Imaging / Radiology**
|
|
87
|
+
- Exposure / measurement validity: how the imaging variable was defined and measured; visual/binary vs quantitative; threshold dependence.
|
|
88
|
+
- Interobserver reliability measured in THIS cohort vs cited from the literature; defensibility of any non-differential-misclassification "bias toward the null" claim.
|
|
89
|
+
- Protocol heterogeneity over time (scanner generation, slice thickness, reconstruction, dose) and its effect on the measurement.
|
|
90
|
+
- Unavailable / non-retrievable images and selection implications.
|
|
91
|
+
- Subtype/severity collapsed into a binary; loss of dose-response.
|
|
92
|
+
- Reliability of routine clinical reports used as a research-grade variable.
|
|
93
|
+
|
|
94
|
+
**Methodology (SR/MA)**
|
|
95
|
+
- Search comprehensiveness and reproducibility; screening reviewer count.
|
|
96
|
+
- Extraction fidelity vs source; comparator existence and consistent definition.
|
|
97
|
+
- Non-independence (overlapping cohorts / shared public benchmarks).
|
|
98
|
+
- Risk-of-bias instrument and per-study application; supplementary completeness.
|
|
99
|
+
- Registration (PROSPERO) format and amendment discipline.
|
|
100
|
+
|
|
101
|
+
**ML / Statistics (radiomics, AI)**
|
|
102
|
+
- Design-grid circularity: is an outcome predicted from the very axes used to construct the dataset?
|
|
103
|
+
- Construct validity: reliability ≠ predictiveness; orthogonality of proxy and target.
|
|
104
|
+
- Transportability: cross-domain failure framed as success; negative R² read as a weak metric.
|
|
105
|
+
- Multiplicity across model × threshold / cohort grids; small-cohort bootstrap intervals.
|
|
106
|
+
- Leakage (patient-level vs image-level splits); calibration beyond discrimination.
|
|
107
|
+
|
|
108
|
+
**Clinical translation / reference standard**
|
|
109
|
+
- Reference-standard validity and verification bias.
|
|
110
|
+
- Whether reported performance reflects the intended-use population and decision point.
|
|
111
|
+
- Incremental value over the comparator already in routine use.
|
|
112
|
+
|
|
113
|
+
**Methodology / SANRA (narrative review)**
|
|
114
|
+
- Novelty / value-add against recent reviews; scope and aims clarity.
|
|
115
|
+
- Evidence-gathering transparency (suggestion-level; not PRISMA).
|
|
116
|
+
- Taxonomy / synthesis coherence; balance, currency, citation accuracy.
|
|
117
|
+
- Load-bearing figures/tables; proportionate gap-filling ("consider adding", never "must cite").
|
|
118
|
+
|
|
119
|
+
**Technical accuracy (narrative review)**
|
|
120
|
+
- Engineering and domain correctness of specific claims; itemize errors with location.
|
|
121
|
+
- Verify-your-own-criticism: cross-check each asserted inaccuracy against a current authoritative source before raising it.
|
|
122
|
+
|
|
123
|
+
---
|
|
124
|
+
|
|
125
|
+
## Editor synthesis prompt skeleton
|
|
126
|
+
|
|
127
|
+
> You are the handling editor. {N} expert reviewers (areas: {areas}) have returned
|
|
128
|
+
> independent blinded reviews of this pre-submission manuscript. Here are their
|
|
129
|
+
> structured reviews as JSON:
|
|
130
|
+
>
|
|
131
|
+
> {reviews_json}
|
|
132
|
+
>
|
|
133
|
+
> Read enough of the manuscript to adjudicate conflicts and weigh severity yourself.
|
|
134
|
+
> Then:
|
|
135
|
+
> 1. Reach an internal readiness decision and state the rationale honestly. (This sets
|
|
136
|
+
> the Phase 3c verdict / score; it is not a journal recommendation to print.)
|
|
137
|
+
> 2. De-duplicate and consolidate the major comments by theme. For each consolidated
|
|
138
|
+
> point, flag CONSENSUS (raised by ≥2 reviewers) or single-reviewer, and attribute
|
|
139
|
+
> (R1/R2/R3).
|
|
140
|
+
> 3. List the top priority pre-submission actions, ranked and concrete.
|
|
141
|
+
> 4. Give an honest readiness verdict: ready for the target tier now, fix specific
|
|
142
|
+
> items first, or consider a different tier.
|
|
143
|
+
>
|
|
144
|
+
> Map every finding onto the self-review framing (Fatal / Fixable, category letters
|
|
145
|
+
> A–K) and emit it through the Phase 3 report, Phase 3b R0 numbering, and Phase 3c
|
|
146
|
+
> JSON, adding the optional `consensus` field where ≥2 reviewers agreed. Follow the
|
|
147
|
+
> manuscript-style rules: no "§" symbols, minimal em-dashes, full prose, cite specific
|
|
148
|
+
> locations.
|
|
149
|
+
|
|
150
|
+
---
|
|
151
|
+
|
|
152
|
+
## Lens-diversity gate (Step 3.5)
|
|
153
|
+
|
|
154
|
+
Before finalizing, the editor runs `scripts/check_panel_diversity.py` on the collected
|
|
155
|
+
reviewer JSON. The gate classifies each major finding into a concern family and checks
|
|
156
|
+
that the panel spans the axes its research type is expected to probe — the deterministic
|
|
157
|
+
backstop against a panel converging on one easy theme while a high-risk axis goes unprobed.
|
|
158
|
+
|
|
159
|
+
**Expected high-risk axes per research type** (each should yield ≥1 major; mirrors the
|
|
160
|
+
Phase 2.6 reviewer-set table). Optional axes — for example imaging when the exposure is
|
|
161
|
+
non-imaging — are not required:
|
|
162
|
+
|
|
163
|
+
| Research type | Expected axes (families) |
|
|
164
|
+
|---|---|
|
|
165
|
+
| Survival / prognostic | statistics, clinical |
|
|
166
|
+
| Systematic review / meta-analysis | search_screening, clinical, statistics |
|
|
167
|
+
| Radiomics | imaging, statistics, clinical |
|
|
168
|
+
| Diagnostic-accuracy / AI model | design_leakage, statistics, clinical |
|
|
169
|
+
| Observational (STROBE) | confounding, clinical, statistics |
|
|
170
|
+
| Narrative / review article | clinical, reporting |
|
|
171
|
+
|
|
172
|
+
Concern families the classifier recognizes: `search_screening`, `design_leakage`,
|
|
173
|
+
`confounding`, `imaging`, `reporting`, `reproducibility`, `statistics`, `clinical`
|
|
174
|
+
(everything else falls to `other` and does not count toward coverage). When the research
|
|
175
|
+
type is unknown, the axis-coverage check is skipped (the monoculture and lens-collapse
|
|
176
|
+
checks still run). The gate never penalizes genuine consensus — only full reviewer
|
|
177
|
+
redundancy (`LENS_COLLAPSE`) or panel-level concentration (`FAMILY_MONOCULTURE`).
|
|
@@ -0,0 +1,301 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
"""Methods <-> Results <-> disk artifact coverage gate (self-review Phase 2.5f).
|
|
3
|
+
|
|
4
|
+
Two directional failures survive a single prose pass because the manuscript is
|
|
5
|
+
internally consistent:
|
|
6
|
+
|
|
7
|
+
FORWARD PROMISED_ABSENT an analysis named in the Methods / Statistical
|
|
8
|
+
Analysis subsection (a sensitivity analysis, multiple
|
|
9
|
+
imputation, an interaction test, a subgroup, mediation,
|
|
10
|
+
a competing-risk or landmark model, an E-value) never
|
|
11
|
+
reaches Results. Methods promised it; the paper never
|
|
12
|
+
delivered it.
|
|
13
|
+
REVERSE DISK_UNREPORTED an analysis output that exists on disk (an
|
|
14
|
+
added-value DeLong CSV, a calibration table) is never
|
|
15
|
+
mentioned in the manuscript. The work was done and run
|
|
16
|
+
but its result — which may contradict the headline —
|
|
17
|
+
is silently absent.
|
|
18
|
+
|
|
19
|
+
The reverse direction is the false-positive-prone one, so it is calibrated: when
|
|
20
|
+
an `_analysis_outputs.md` manifest exists (written by /analyze-stats) it is the
|
|
21
|
+
source of truth; otherwise the analysis directory is globbed and a finding is only
|
|
22
|
+
a Major when the file stem carries an analysis-bearing token (delong, nested,
|
|
23
|
+
added-value, interaction, sensitivity, subgroup, mediation, imputation, landmark,
|
|
24
|
+
calibration, dca, nri, idi). A cryptic stem with no such token is a Minor flag.
|
|
25
|
+
|
|
26
|
+
INPUTS
|
|
27
|
+
--manuscript manuscript markdown/text (required).
|
|
28
|
+
--analysis-dir directory of analysis outputs. If omitted, the first existing of
|
|
29
|
+
output/analysis/, analysis/, results/ is used. An
|
|
30
|
+
`_analysis_outputs.md` manifest in that dir (or alongside the
|
|
31
|
+
manuscript) takes precedence as the output source of truth.
|
|
32
|
+
|
|
33
|
+
OUTPUT
|
|
34
|
+
A reconciliation table (stdout) and, with --out, a JSON artifact:
|
|
35
|
+
{manuscript, analysis_dir, manifest, claims[{verdict, severity, detail, where}], summary}
|
|
36
|
+
PROMISED_ABSENT is always Major; DISK_UNREPORTED is Major or Minor per the rule
|
|
37
|
+
above. Exit 1 (with --strict) when any Major-severity claim exists.
|
|
38
|
+
|
|
39
|
+
Stdlib-only (json / re / argparse / pathlib). Exit codes: 0 clean (or report-only),
|
|
40
|
+
1 Major claim(s) found (with --strict), 2 input/usage error.
|
|
41
|
+
"""
|
|
42
|
+
|
|
43
|
+
from __future__ import annotations
|
|
44
|
+
|
|
45
|
+
import argparse
|
|
46
|
+
import json
|
|
47
|
+
import re
|
|
48
|
+
import sys
|
|
49
|
+
from pathlib import Path
|
|
50
|
+
|
|
51
|
+
# Promised analyses: key -> (detect-in-Methods regex, appears-in-Results regex).
|
|
52
|
+
# The Results regex is intentionally looser (the concept can be phrased differently
|
|
53
|
+
# downstream) but still anchored to the analysis name.
|
|
54
|
+
PROMISED = {
|
|
55
|
+
"multiple imputation": (r"multiple imputation|\bm\s*=\s*\d+\s*imput|imputed using",
|
|
56
|
+
r"imput-|imputation|imputed"),
|
|
57
|
+
"sensitivity analysis": (r"sensitivity analys[ie]s", r"sensitivity analys[ie]s"),
|
|
58
|
+
"leave-one-out": (r"leave[-\s]one[-\s]out", r"leave[-\s]one[-\s]out"),
|
|
59
|
+
"interaction": (r"interaction (?:term|test|analys|effect)|tested? for interaction|"
|
|
60
|
+
r"p[-\s]?(?:for[-\s])?interaction",
|
|
61
|
+
r"interaction|p[-\s]?(?:for[-\s])?interaction|effect modif"),
|
|
62
|
+
"subgroup": (r"subgroup analys", r"subgroup"),
|
|
63
|
+
"mediation": (r"mediation (?:analys|model)", r"mediation|mediat"),
|
|
64
|
+
"competing risk": (r"competing[-\s]risk|fine[-\s]?gray|subdistribution",
|
|
65
|
+
r"competing[-\s]risk|fine[-\s]?gray|subdistribution|cumulative incidence"),
|
|
66
|
+
"landmark": (r"landmark analys", r"landmark"),
|
|
67
|
+
"E-value": (r"e[-\s]?value", r"e[-\s]?value"),
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
ANALYSIS_TOKENS = (
|
|
71
|
+
"delong", "nested", "added", "addedvalue", "incremental", "interaction",
|
|
72
|
+
"sensitivity", "subgroup", "mediation", "imputation", "imputed", "landmark",
|
|
73
|
+
"calibration", "dca", "netbenefit", "nri", "idi", "competing", "finegray",
|
|
74
|
+
"tipping", "leaveone", "bootstrap",
|
|
75
|
+
)
|
|
76
|
+
OUTPUT_EXT = (".csv", ".tsv", ".r", ".py", ".rds")
|
|
77
|
+
MANIFEST_NAME = "_analysis_outputs.md"
|
|
78
|
+
|
|
79
|
+
|
|
80
|
+
def _norm(s: str) -> str:
|
|
81
|
+
return re.sub(r"[^a-z0-9]+", "", s.lower())
|
|
82
|
+
|
|
83
|
+
|
|
84
|
+
def split_sections(text: str) -> list[tuple[str, str]]:
|
|
85
|
+
"""Return (heading, body) for each markdown heading region."""
|
|
86
|
+
sections, heading, buf = [], "(preamble)", []
|
|
87
|
+
for line in text.splitlines():
|
|
88
|
+
m = re.match(r"^#{1,4}\s+(.*)", line)
|
|
89
|
+
if m:
|
|
90
|
+
sections.append((heading, "\n".join(buf)))
|
|
91
|
+
heading = re.sub(r"[*_`]", "", m.group(1)).strip()
|
|
92
|
+
buf = []
|
|
93
|
+
else:
|
|
94
|
+
buf.append(line)
|
|
95
|
+
sections.append((heading, "\n".join(buf)))
|
|
96
|
+
return sections
|
|
97
|
+
|
|
98
|
+
|
|
99
|
+
def section_text(sections: list[tuple[str, str]], names: tuple[str, ...]) -> str:
|
|
100
|
+
out = []
|
|
101
|
+
for heading, body in sections:
|
|
102
|
+
h = heading.lower()
|
|
103
|
+
if any(n in h for n in names):
|
|
104
|
+
out.append(body)
|
|
105
|
+
return "\n".join(out)
|
|
106
|
+
|
|
107
|
+
|
|
108
|
+
# --- FORWARD: promised-but-absent ------------------------------------------
|
|
109
|
+
|
|
110
|
+
def check_forward(text: str) -> list[dict]:
|
|
111
|
+
sections = split_sections(text)
|
|
112
|
+
methods = section_text(sections, ("method", "statistical analys", "analysis plan"))
|
|
113
|
+
results = section_text(sections, ("result", "finding"))
|
|
114
|
+
if not methods.strip():
|
|
115
|
+
return [] # no Methods section to read promises from
|
|
116
|
+
# If there is no separate Results section, compare against the whole document
|
|
117
|
+
# minus the Methods text (conservative: avoids matching a promise to itself).
|
|
118
|
+
haystack = results if results.strip() else text
|
|
119
|
+
claims = []
|
|
120
|
+
for key, (mre, rre) in PROMISED.items():
|
|
121
|
+
if re.search(mre, methods, re.I):
|
|
122
|
+
if not re.search(rre, haystack, re.I):
|
|
123
|
+
claims.append({
|
|
124
|
+
"verdict": "PROMISED_ABSENT",
|
|
125
|
+
"severity": "Major",
|
|
126
|
+
"detail": (f"Methods promises a '{key}' analysis, but it does not "
|
|
127
|
+
f"appear in Results"),
|
|
128
|
+
"where": "Methods → Results",
|
|
129
|
+
})
|
|
130
|
+
return claims
|
|
131
|
+
|
|
132
|
+
|
|
133
|
+
# --- REVERSE: disk-present-but-unreported -----------------------------------
|
|
134
|
+
|
|
135
|
+
def find_analysis_dir(manuscript: Path, override: str | None) -> Path | None:
|
|
136
|
+
if override:
|
|
137
|
+
p = Path(override)
|
|
138
|
+
return p if p.is_dir() else None
|
|
139
|
+
base = manuscript.resolve().parent
|
|
140
|
+
for cand in ("output/analysis", "analysis", "results", "output"):
|
|
141
|
+
for root in (base, base.parent):
|
|
142
|
+
p = root / cand
|
|
143
|
+
if p.is_dir():
|
|
144
|
+
return p
|
|
145
|
+
return None
|
|
146
|
+
|
|
147
|
+
|
|
148
|
+
def parse_manifest(path: Path) -> list[str]:
|
|
149
|
+
"""Return declared output basenames from an _analysis_outputs.md manifest.
|
|
150
|
+
Lines like '- `table1.csv` -- desc' or '* roc_curve.pdf'."""
|
|
151
|
+
items = []
|
|
152
|
+
for line in path.read_text(encoding="utf-8").splitlines():
|
|
153
|
+
for m in re.finditer(r"`([^`]+\.[A-Za-z0-9]{1,5})`", line):
|
|
154
|
+
items.append(m.group(1))
|
|
155
|
+
if not re.search(r"`", line):
|
|
156
|
+
m = re.search(r"[-*]\s+([\w./-]+\.[A-Za-z0-9]{1,5})", line)
|
|
157
|
+
if m:
|
|
158
|
+
items.append(m.group(1))
|
|
159
|
+
return items
|
|
160
|
+
|
|
161
|
+
|
|
162
|
+
def stem_tokens(name: str) -> list[str]:
|
|
163
|
+
stem = Path(name).stem
|
|
164
|
+
toks = re.split(r"[_\-.\s]+", stem)
|
|
165
|
+
return [t for t in toks if len(t) >= 4 and re.search(r"[a-z]", t.lower())]
|
|
166
|
+
|
|
167
|
+
|
|
168
|
+
def mentioned(name: str, body_norm: str) -> bool:
|
|
169
|
+
toks = stem_tokens(name)
|
|
170
|
+
if not toks:
|
|
171
|
+
return True # nothing distinctive to look for -> do not flag
|
|
172
|
+
return any(_norm(t) in body_norm for t in toks)
|
|
173
|
+
|
|
174
|
+
|
|
175
|
+
def check_reverse(text: str, manuscript: Path, analysis_dir: str | None) -> tuple[list[dict], dict]:
|
|
176
|
+
body_norm = _norm(text)
|
|
177
|
+
meta = {"analysis_dir": None, "manifest": None}
|
|
178
|
+
# 1) manifest precedence
|
|
179
|
+
manifest_files: list[str] = []
|
|
180
|
+
for cand in (manuscript.resolve().parent / MANIFEST_NAME,):
|
|
181
|
+
if cand.is_file():
|
|
182
|
+
manifest_files = parse_manifest(cand)
|
|
183
|
+
meta["manifest"] = str(cand)
|
|
184
|
+
break
|
|
185
|
+
adir = find_analysis_dir(manuscript, analysis_dir)
|
|
186
|
+
if adir is not None:
|
|
187
|
+
meta["analysis_dir"] = str(adir)
|
|
188
|
+
mpath = adir / MANIFEST_NAME
|
|
189
|
+
if not manifest_files and mpath.is_file():
|
|
190
|
+
manifest_files = parse_manifest(mpath)
|
|
191
|
+
meta["manifest"] = str(mpath)
|
|
192
|
+
|
|
193
|
+
claims = []
|
|
194
|
+
if manifest_files:
|
|
195
|
+
for name in sorted(set(manifest_files)):
|
|
196
|
+
if Path(name).suffix.lower() not in OUTPUT_EXT:
|
|
197
|
+
continue # figures (.pdf/.png) are checked by /make-figures legends
|
|
198
|
+
if not mentioned(name, body_norm):
|
|
199
|
+
claims.append({
|
|
200
|
+
"verdict": "DISK_UNREPORTED",
|
|
201
|
+
"severity": "Major",
|
|
202
|
+
"detail": (f"manifest output '{name}' is not mentioned anywhere in "
|
|
203
|
+
f"the manuscript"),
|
|
204
|
+
"where": meta["manifest"],
|
|
205
|
+
})
|
|
206
|
+
return claims, meta
|
|
207
|
+
|
|
208
|
+
# 2) glob fallback (calibrated severity)
|
|
209
|
+
if adir is None:
|
|
210
|
+
return claims, meta
|
|
211
|
+
for f in sorted(adir.rglob("*")):
|
|
212
|
+
if not f.is_file() or f.suffix.lower() not in OUTPUT_EXT:
|
|
213
|
+
continue
|
|
214
|
+
if mentioned(f.name, body_norm):
|
|
215
|
+
continue
|
|
216
|
+
analysis_bearing = any(_norm(t) in ANALYSIS_TOKENS for t in stem_tokens(f.name))
|
|
217
|
+
claims.append({
|
|
218
|
+
"verdict": "DISK_UNREPORTED",
|
|
219
|
+
"severity": "Major" if analysis_bearing else "Minor",
|
|
220
|
+
"detail": (f"analysis output '{f.name}' exists on disk but is not mentioned "
|
|
221
|
+
f"in the manuscript" + (" (analysis-bearing name)" if analysis_bearing else "")),
|
|
222
|
+
"where": str(f.relative_to(adir.parent) if adir.parent in f.parents else f),
|
|
223
|
+
})
|
|
224
|
+
return claims, meta
|
|
225
|
+
|
|
226
|
+
|
|
227
|
+
# --- driver ----------------------------------------------------------------
|
|
228
|
+
|
|
229
|
+
def analyze(manuscript: str, analysis_dir: str | None) -> dict:
|
|
230
|
+
p = Path(manuscript)
|
|
231
|
+
if not p.is_file():
|
|
232
|
+
sys.stderr.write(f"ERROR: manuscript not found: {manuscript}\n")
|
|
233
|
+
sys.exit(2)
|
|
234
|
+
text = p.read_text(encoding="utf-8")
|
|
235
|
+
|
|
236
|
+
claims = check_forward(text)
|
|
237
|
+
rev, meta = check_reverse(text, p, analysis_dir)
|
|
238
|
+
claims += rev
|
|
239
|
+
|
|
240
|
+
n_major = sum(1 for c in claims if c["severity"] == "Major")
|
|
241
|
+
return {
|
|
242
|
+
"manuscript": str(p),
|
|
243
|
+
"analysis_dir": meta["analysis_dir"],
|
|
244
|
+
"manifest": meta["manifest"],
|
|
245
|
+
"claims": claims,
|
|
246
|
+
"summary": {
|
|
247
|
+
"n_claims": len(claims),
|
|
248
|
+
"n_major": n_major,
|
|
249
|
+
"n_flag": len(claims) - n_major,
|
|
250
|
+
"verdict": "MAJOR_CANDIDATE" if n_major else "OK",
|
|
251
|
+
},
|
|
252
|
+
}
|
|
253
|
+
|
|
254
|
+
|
|
255
|
+
def render(result: dict) -> str:
|
|
256
|
+
lines = ["| Direction | Severity | Detail |", "|---|---|---|"]
|
|
257
|
+
for c in result["claims"]:
|
|
258
|
+
lines.append(f"| {c['verdict']} | {c['severity']} | {c['detail']} |")
|
|
259
|
+
if len(lines) == 2:
|
|
260
|
+
lines.append("| (none) | — | Methods↔Results↔disk all reconciled |")
|
|
261
|
+
return "\n".join(lines)
|
|
262
|
+
|
|
263
|
+
|
|
264
|
+
def main() -> int:
|
|
265
|
+
ap = argparse.ArgumentParser(description="Methods<->Results<->disk coverage gate (Phase 2.5f).")
|
|
266
|
+
ap.add_argument("--manuscript", required=True, help="manuscript markdown/text")
|
|
267
|
+
ap.add_argument("--analysis-dir", help="analysis-output dir (default: output/analysis, analysis, results)")
|
|
268
|
+
ap.add_argument("--out", help="write JSON artifact to this path")
|
|
269
|
+
ap.add_argument("--strict", action="store_true", help="exit 1 if any Major claim exists")
|
|
270
|
+
ap.add_argument("--quiet", action="store_true", help="suppress stdout table")
|
|
271
|
+
args = ap.parse_args()
|
|
272
|
+
|
|
273
|
+
result = analyze(args.manuscript, args.analysis_dir)
|
|
274
|
+
|
|
275
|
+
if not args.quiet:
|
|
276
|
+
print("=" * 41)
|
|
277
|
+
print(" Artifact Coverage (Phase 2.5f)")
|
|
278
|
+
print("=" * 41)
|
|
279
|
+
if result["manifest"]:
|
|
280
|
+
print(f"manifest: {result['manifest']}")
|
|
281
|
+
elif result["analysis_dir"]:
|
|
282
|
+
print(f"analysis dir (globbed): {result['analysis_dir']}")
|
|
283
|
+
print(render(result))
|
|
284
|
+
print()
|
|
285
|
+
s = result["summary"]
|
|
286
|
+
if s["n_major"]:
|
|
287
|
+
print(f"MAJOR candidate: {s['n_major']} coverage gap(s).")
|
|
288
|
+
else:
|
|
289
|
+
print("OK: Methods/Results/disk reconciled.")
|
|
290
|
+
|
|
291
|
+
if args.out:
|
|
292
|
+
Path(args.out).parent.mkdir(parents=True, exist_ok=True)
|
|
293
|
+
Path(args.out).write_text(json.dumps(result, indent=2), encoding="utf-8")
|
|
294
|
+
if not args.quiet:
|
|
295
|
+
print(f"\nwrote {args.out}")
|
|
296
|
+
|
|
297
|
+
return 1 if (args.strict and result["summary"]["n_major"]) else 0
|
|
298
|
+
|
|
299
|
+
|
|
300
|
+
if __name__ == "__main__":
|
|
301
|
+
sys.exit(main())
|