medsci-skills 5.21.0 → 5.23.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.
Files changed (470) hide show
  1. package/LICENSE +0 -29
  2. package/README.md +108 -13
  3. package/README_FIRST.md +10 -0
  4. package/THIRD-PARTY-NOTICES.md +65 -0
  5. package/installers/install-macos.command +84 -13
  6. package/installers/install-windows.cmd +99 -17
  7. package/installers/install.py +72 -0
  8. package/installers/medsci_txn.py +64 -0
  9. package/installers/update-macos.command +46 -11
  10. package/installers/update-windows.cmd +41 -6
  11. package/installers/update.py +13 -0
  12. package/metadata/distribution_files.json +1518 -328
  13. package/metadata/distribution_manifest.json +4 -1
  14. package/metadata/skills_catalog.json +31 -1
  15. package/package.json +3 -2
  16. package/skills/MAINTENANCE.md +45 -1
  17. package/skills/add-journal/SKILL.md +31 -116
  18. package/skills/add-journal/references/write_paper_profile_template.md +124 -0
  19. package/skills/analyze-stats/SKILL.md +9 -0
  20. package/skills/analyze-stats/references/analysis_guides/burden_decomposition_forecasting.md +156 -0
  21. package/skills/architecture-zoo/SKILL.md +6 -5
  22. package/skills/architecture-zoo/references/classification.md +21 -2
  23. package/skills/architecture-zoo/references/detection.md +41 -11
  24. package/skills/architecture-zoo/references/foundation_models.md +51 -1
  25. package/skills/architecture-zoo/references/index.md +9 -2
  26. package/skills/architecture-zoo/references/segmentation.md +62 -4
  27. package/skills/architecture-zoo/references/synthesis.md +14 -9
  28. package/skills/calc-sample-size/SKILL.md +111 -0
  29. package/skills/calc-sample-size/references/mrmc_reader_study_sample_size.md +94 -0
  30. package/skills/calc-sample-size/references/multi_model_comparison_sample_size.md +89 -0
  31. package/skills/calc-sample-size/references/segmentation_acceptability_sample_size.md +97 -0
  32. package/skills/calc-sample-size/references/segmentation_metric_sample_size.md +63 -0
  33. package/skills/check-reporting/SKILL.md +38 -114
  34. package/skills/check-reporting/references/checklists/CLEAR.md +176 -107
  35. package/skills/check-reporting/references/checklists/GATHER.md +53 -0
  36. package/skills/check-reporting/references/checklists/MI_CLEAR_LLM.md +94 -136
  37. package/skills/check-reporting/references/checklists/TRIPOD_AI.md +127 -117
  38. package/skills/check-reporting/references/report_templates.md +140 -0
  39. package/skills/check-reporting/scripts/verify_checklist_fidelity.py +175 -0
  40. package/skills/check-reporting/tests/test_checklist_fidelity.sh +149 -0
  41. package/skills/contribute/SKILL.md +226 -0
  42. package/skills/contribute/scripts/check_contribution_safety.py +241 -0
  43. package/skills/contribute/scripts/contribution_prefs.py +159 -0
  44. package/skills/contribute/scripts/find_local_changes.py +198 -0
  45. package/skills/contribute/scripts/star_repo.py +165 -0
  46. package/skills/contribute/scripts/submit_contribution.py +203 -0
  47. package/skills/contribute/skill.yml +50 -0
  48. package/skills/contribute/tests/test_contribution_safety.sh +264 -0
  49. package/skills/design-study/SKILL.md +21 -88
  50. package/skills/design-study/references/combine_models_ablation_design.md +71 -0
  51. package/skills/design-study/references/multi_model_comparison_design.md +90 -0
  52. package/skills/design-study/references/reader_elicitation_design.md +97 -0
  53. package/skills/design-study/references/segmentation_failure_characterization_design.md +84 -0
  54. package/skills/design-study/references/venue_accept_recipe.md +85 -0
  55. package/skills/find-journal/SKILL.md +2 -72
  56. package/skills/humanize/SKILL.md +48 -15
  57. package/skills/humanize/references/ai_patterns.md +136 -9
  58. package/skills/humanize/scripts/check_rewrite_fidelity.py +194 -0
  59. package/skills/humanize/scripts/check_sentence_variety.py +174 -0
  60. package/skills/humanize/skill.yml +4 -2
  61. package/skills/humanize/tests/fixtures/rewrite_after_bounded.md +14 -0
  62. package/skills/humanize/tests/fixtures/rewrite_after_numdrift.md +14 -0
  63. package/skills/humanize/tests/fixtures/rewrite_after_wholesale.md +20 -0
  64. package/skills/humanize/tests/fixtures/rewrite_before.md +16 -0
  65. package/skills/humanize/tests/fixtures/variety_mixed.md +18 -0
  66. package/skills/humanize/tests/fixtures/variety_uniform.md +17 -0
  67. package/skills/humanize/tests/test_rewrite_fidelity.sh +60 -0
  68. package/skills/humanize/tests/test_sentence_variety.sh +51 -0
  69. package/skills/lit-sync/SKILL.md +4 -10
  70. package/skills/make-figures/SKILL.md +64 -94
  71. package/skills/make-figures/references/exemplar_diagrams/README.md +65 -50
  72. package/skills/make-figures/references/exemplar_diagrams/consort/template_output.png +0 -0
  73. package/skills/make-figures/references/exemplar_diagrams/consort/template_output_600.png +0 -0
  74. package/skills/make-figures/references/exemplar_diagrams/prisma/template_output.png +0 -0
  75. package/skills/make-figures/references/exemplar_diagrams/prisma/template_output_600.png +0 -0
  76. package/skills/make-figures/references/exemplar_diagrams/stard/template_output.png +0 -0
  77. package/skills/make-figures/references/exemplar_diagrams/stard/template_output_600.png +0 -0
  78. package/skills/make-figures/references/exemplar_diagrams/strobe/template_output.png +0 -0
  79. package/skills/make-figures/references/exemplar_diagrams/strobe/template_output_600.png +0 -0
  80. package/skills/make-figures/references/exemplar_plots/README.md +23 -0
  81. package/skills/make-figures/references/exemplar_plots/ai_assistance_effect.md +47 -0
  82. package/skills/make-figures/references/exemplar_plots/external_validation_comparison.md +44 -0
  83. package/skills/make-figures/references/exemplar_plots/model_comparison_leaderboard.md +53 -0
  84. package/skills/make-figures/references/exemplar_plots/segmentation_failure_panel.md +59 -0
  85. package/skills/make-figures/references/figure_manifest.md +38 -0
  86. package/skills/make-figures/references/flow_diagram_recipe.md +68 -0
  87. package/skills/make-figures/references/pipeline_concepts_medical_ai.md +1 -1
  88. package/skills/make-figures/references/reporting_guideline_figure_map.md +2 -2
  89. package/skills/make-figures/references/visual_abstract_templates/template_guide.md +20 -4
  90. package/skills/make-figures/scripts/_strobe_cascade.py +112 -0
  91. package/skills/make-figures/scripts/build_strobe_template.py +14 -0
  92. package/skills/make-figures/scripts/export_portal_tiff.py +170 -0
  93. package/skills/make-figures/scripts/export_portal_tiff_challenge/problem.md +32 -0
  94. package/skills/make-figures/scripts/export_portal_tiff_challenge/verify.sh +74 -0
  95. package/skills/make-figures/scripts/extract_exemplar_from_pdf.py +14 -2
  96. package/skills/make-figures/skill.yml +1 -0
  97. package/skills/make-figures/tests/fixtures/strobe_cascade_balanced.yaml +7 -0
  98. package/skills/make-figures/tests/fixtures/strobe_cascade_branching.yaml +10 -0
  99. package/skills/make-figures/tests/fixtures/strobe_cascade_imbalanced.yaml +10 -0
  100. package/skills/make-figures/tests/test_strobe_cascade.sh +47 -0
  101. package/skills/manage-project/SKILL.md +20 -88
  102. package/skills/manage-project/references/init_scaffold.md +118 -0
  103. package/skills/manage-refs/scripts/check_citation_keys_challenge/fixture/manuscript.md +4 -0
  104. package/skills/manage-refs/scripts/check_citation_keys_challenge/fixture/refs_clean.bib +2 -0
  105. package/skills/manage-refs/scripts/check_citation_keys_challenge/fixture/refs_undefined.bib +1 -0
  106. package/skills/manage-refs/scripts/check_citation_keys_challenge/verify.sh +30 -0
  107. package/skills/meta-analysis/SKILL.md +119 -273
  108. package/skills/meta-analysis/references/phase3_screening_detail.md +178 -0
  109. package/skills/meta-analysis/references/phase4_extraction_detail.md +189 -0
  110. package/skills/meta-analysis/scripts/check_exclusion_code_validity.py +365 -0
  111. package/skills/meta-analysis/scripts/check_exclusion_code_validity_challenge/fixture/protocol_negative.md +19 -0
  112. package/skills/meta-analysis/scripts/check_exclusion_code_validity_challenge/fixture/protocol_positive.md +18 -0
  113. package/skills/meta-analysis/scripts/check_exclusion_code_validity_challenge/fixture/screening_negative.tsv +6 -0
  114. package/skills/meta-analysis/scripts/check_exclusion_code_validity_challenge/fixture/screening_positive.tsv +7 -0
  115. package/skills/meta-analysis/scripts/check_exclusion_code_validity_challenge/problem.md +44 -0
  116. package/skills/meta-analysis/scripts/check_exclusion_code_validity_challenge/verify.sh +59 -0
  117. package/skills/meta-analysis/scripts/screening_reconcile.py +34 -1
  118. package/skills/meta-analysis/skill.yml +2 -0
  119. package/skills/meta-analysis/tests/test_screening_reconcile.sh +87 -0
  120. package/skills/model-sourcing/SKILL.md +166 -0
  121. package/skills/model-sourcing/scripts/check_model_provenance.py +255 -0
  122. package/skills/model-sourcing/scripts/check_model_provenance_challenge/expected/clean.txt +5 -0
  123. package/skills/model-sourcing/scripts/check_model_provenance_challenge/expected/defect.txt +22 -0
  124. package/skills/model-sourcing/scripts/check_model_provenance_challenge/expected/unstated.txt +10 -0
  125. package/skills/model-sourcing/scripts/check_model_provenance_challenge/fixture/dossier_clean.json +18 -0
  126. package/skills/model-sourcing/scripts/check_model_provenance_challenge/fixture/dossier_defect.json +15 -0
  127. package/skills/model-sourcing/scripts/check_model_provenance_challenge/fixture/dossier_unstated.json +11 -0
  128. package/skills/model-sourcing/scripts/check_model_provenance_challenge/problem.md +48 -0
  129. package/skills/model-sourcing/scripts/check_model_provenance_challenge/verify.sh +43 -0
  130. package/skills/model-sourcing/skill.yml +50 -0
  131. package/skills/model-sourcing/tests/test_model_provenance.sh +103 -0
  132. package/skills/orchestrate/SKILL.md +4 -1
  133. package/skills/peer-review/SKILL.md +66 -67
  134. package/skills/peer-review/references/review_draft_template.md +71 -0
  135. package/skills/peer-review/scripts/check_review_boxes.py +207 -0
  136. package/skills/peer-review/scripts/check_review_length.py +251 -0
  137. package/skills/peer-review/scripts/check_review_request_types.py +293 -0
  138. package/skills/peer-review/scripts/check_review_request_types_challenge/expected/disciplined.txt +3 -0
  139. package/skills/peer-review/scripts/check_review_request_types_challenge/expected/undisciplined.txt +8 -0
  140. package/skills/peer-review/scripts/check_review_request_types_challenge/fixture/disciplined.md +19 -0
  141. package/skills/peer-review/scripts/check_review_request_types_challenge/fixture/undisciplined.md +16 -0
  142. package/skills/peer-review/scripts/check_review_request_types_challenge/problem.md +87 -0
  143. package/skills/peer-review/scripts/check_review_request_types_challenge/verify.sh +24 -0
  144. package/skills/peer-review/scripts/scan_pdf_layers.py +36 -7
  145. package/skills/peer-review/tests/test_review_draft_gates.sh +198 -0
  146. package/skills/peer-review/tests/test_scan_pdf_layers_xmp.sh +122 -0
  147. package/skills/polish-language/SKILL.md +19 -1
  148. package/skills/polish-language/scripts/lint_challenge/expected/report.txt +4 -1
  149. package/skills/polish-language/scripts/lint_challenge/fixture/manuscript.md +4 -0
  150. package/skills/polish-language/scripts/lint_challenge/problem.md +1 -1
  151. package/skills/polish-language/scripts/lint_challenge/verify.sh +1 -1
  152. package/skills/polish-language/scripts/lint_consistency.py +49 -5
  153. package/skills/polish-language/scripts/lint_figure_locale.py +236 -0
  154. package/skills/polish-language/scripts/lint_figure_locale_challenge/problem.md +39 -0
  155. package/skills/polish-language/scripts/lint_figure_locale_challenge/verify.sh +87 -0
  156. package/skills/polish-language/skill.yml +3 -0
  157. package/skills/preprocess-imaging/SKILL.md +7 -1
  158. package/skills/preprocess-imaging/scripts/check_preprocessing_leakage.py +18 -2
  159. package/skills/preprocess-imaging/tests/test_preprocessing_leakage.sh +27 -1
  160. package/skills/present-paper/SKILL.md +115 -25
  161. package/skills/present-paper/references/ai_slide_tells.md +167 -0
  162. package/skills/present-paper/references/critic_rubrics/slide.md +30 -0
  163. package/skills/present-paper/references/presentation_archetypes.md +257 -0
  164. package/skills/present-paper/references/slide_visual_styles/nature_lancet.md +23 -5
  165. package/skills/present-paper/scripts/check_deck_budget.py +263 -0
  166. package/skills/present-paper/scripts/check_deck_budget_challenge/make_fixtures.py +96 -0
  167. package/skills/present-paper/scripts/check_deck_budget_challenge/verify.sh +86 -0
  168. package/skills/present-paper/scripts/check_slide_tells.py +540 -0
  169. package/skills/present-paper/scripts/check_slide_tells_challenge/make_fixtures.py +143 -0
  170. package/skills/present-paper/scripts/check_slide_tells_challenge/verify.sh +86 -0
  171. package/skills/present-paper/scripts/inject_speaker_notes.py +15 -3
  172. package/skills/present-paper/skill.yml +6 -0
  173. package/skills/present-paper/templates/build_pptx_nature_lancet.py +74 -48
  174. package/skills/present-paper/tests/test_backup_off_the_clock.py +141 -0
  175. package/skills/present-paper/tests/test_builder_no_chrome.py +183 -0
  176. package/skills/present-paper/tests/test_md_parity.py +129 -0
  177. package/skills/profile-imaging/SKILL.md +176 -0
  178. package/skills/profile-imaging/scripts/check_dataset_profile.py +332 -0
  179. package/skills/profile-imaging/scripts/check_dataset_profile_challenge/expected/clean.txt +8 -0
  180. package/skills/profile-imaging/scripts/check_dataset_profile_challenge/expected/defect.txt +21 -0
  181. package/skills/profile-imaging/scripts/check_dataset_profile_challenge/fixture/profile_clean.json +196 -0
  182. package/skills/profile-imaging/scripts/check_dataset_profile_challenge/fixture/profile_defect.json +304 -0
  183. package/skills/profile-imaging/scripts/check_dataset_profile_challenge/problem.md +26 -0
  184. package/skills/profile-imaging/scripts/check_dataset_profile_challenge/verify.sh +41 -0
  185. package/skills/profile-imaging/scripts/profile_imaging_dataset.py +168 -0
  186. package/skills/profile-imaging/skill.yml +48 -0
  187. package/skills/profile-imaging/tests/test_dataset_profile.sh +145 -0
  188. package/skills/revise/SKILL.md +32 -4
  189. package/skills/revise/scripts/_quote_match.py +172 -0
  190. package/skills/revise/scripts/check_density_complaint.py +190 -0
  191. package/skills/revise/scripts/check_response_claims.py +70 -7
  192. package/skills/revise/scripts/density_complaint_challenge/fixture/decision_letter.md +9 -0
  193. package/skills/revise/scripts/density_complaint_challenge/fixture/v20_longer.md +20 -0
  194. package/skills/revise/scripts/density_complaint_challenge/fixture/v21_shorter.md +20 -0
  195. package/skills/revise/scripts/density_complaint_challenge/fixture/v_prev.md +20 -0
  196. package/skills/revise/scripts/density_complaint_challenge/verify.sh +65 -0
  197. package/skills/revise/skill.yml +2 -0
  198. package/skills/revise/tests/test_response_claims.sh +62 -0
  199. package/skills/self-review/SKILL.md +400 -910
  200. package/skills/self-review/references/phases/phase2_5a2_design_power.md +62 -0
  201. package/skills/self-review/references/phases/phase2_5a_source_fidelity.md +98 -0
  202. package/skills/self-review/references/phases/phase2_5b_screening_counts.md +127 -0
  203. package/skills/self-review/references/phases/phase2_5c_reference_scans.md +94 -0
  204. package/skills/self-review/references/phases/phase2_5d_xref_qc.md +94 -0
  205. package/skills/self-review/references/phases/phase2_5f_claim_artifact.md +190 -0
  206. package/skills/self-review/references/phases/phase2_6_panel.md +72 -0
  207. package/skills/self-review/references/phases/phase2_systematic_check.md +214 -0
  208. package/skills/self-review/references/phases/phase3c_json_output.md +49 -0
  209. package/skills/self-review/references/phases/phase4_fix_support.md +53 -0
  210. package/skills/self-review/scripts/_frontmatter.py +44 -0
  211. package/skills/self-review/scripts/_prose.py +57 -0
  212. package/skills/self-review/scripts/_qc_findings.py +67 -0
  213. package/skills/self-review/scripts/check_analysis_definitions.py +279 -0
  214. package/skills/self-review/scripts/check_analysis_definitions_challenge/expected/defined.txt +4 -0
  215. package/skills/self-review/scripts/check_analysis_definitions_challenge/expected/undefined.txt +6 -0
  216. package/skills/self-review/scripts/check_analysis_definitions_challenge/fixture/defined.md +25 -0
  217. package/skills/self-review/scripts/check_analysis_definitions_challenge/fixture/undefined.md +20 -0
  218. package/skills/self-review/scripts/check_analysis_definitions_challenge/problem.md +57 -0
  219. package/skills/self-review/scripts/check_analysis_definitions_challenge/verify.sh +21 -0
  220. package/skills/self-review/scripts/check_aphorism_density.py +199 -0
  221. package/skills/self-review/scripts/check_baseline_drift.py +251 -0
  222. package/skills/self-review/scripts/check_baseline_drift_challenge/expected/drifted.txt +7 -0
  223. package/skills/self-review/scripts/check_baseline_drift_challenge/expected/nobaseline.txt +4 -0
  224. package/skills/self-review/scripts/check_baseline_drift_challenge/expected/overhedged.txt +5 -0
  225. package/skills/self-review/scripts/check_baseline_drift_challenge/expected/stable.txt +4 -0
  226. package/skills/self-review/scripts/check_baseline_drift_challenge/fixture/baseline.md +18 -0
  227. package/skills/self-review/scripts/check_baseline_drift_challenge/fixture/drifted.md +16 -0
  228. package/skills/self-review/scripts/check_baseline_drift_challenge/fixture/overhedged.md +17 -0
  229. package/skills/self-review/scripts/check_baseline_drift_challenge/fixture/stable.md +18 -0
  230. package/skills/self-review/scripts/check_baseline_drift_challenge/problem.md +41 -0
  231. package/skills/self-review/scripts/check_baseline_drift_challenge/verify.sh +45 -0
  232. package/skills/self-review/scripts/check_citation_order.py +265 -13
  233. package/skills/self-review/scripts/check_claim_artifact.py +72 -2
  234. package/skills/self-review/scripts/check_classical_style.py +81 -15
  235. package/skills/self-review/scripts/check_cohort_arithmetic.py +296 -8
  236. package/skills/self-review/scripts/check_confounding_completeness.py +20 -6
  237. package/skills/self-review/scripts/check_effect_stability.py +243 -0
  238. package/skills/self-review/scripts/check_effect_stability_challenge/expected/bad.txt +9 -0
  239. package/skills/self-review/scripts/check_effect_stability_challenge/expected/ok.txt +8 -0
  240. package/skills/self-review/scripts/check_effect_stability_challenge/fixture/effect_bad.md +9 -0
  241. package/skills/self-review/scripts/check_effect_stability_challenge/fixture/effect_ok.md +7 -0
  242. package/skills/self-review/scripts/check_effect_stability_challenge/problem.md +16 -0
  243. package/skills/self-review/scripts/check_effect_stability_challenge/verify.sh +41 -0
  244. package/skills/self-review/scripts/check_figure_citation.py +100 -12
  245. package/skills/self-review/scripts/check_figure_citation_challenge/fixture/panel_regression.md +15 -0
  246. package/skills/self-review/scripts/check_figure_citation_challenge/fixture/real_orphan.md +13 -0
  247. package/skills/self-review/scripts/check_figure_citation_challenge/problem.md +28 -0
  248. package/skills/self-review/scripts/check_figure_citation_challenge/verify.sh +31 -0
  249. package/skills/self-review/scripts/check_incorporation_bias.py +191 -0
  250. package/skills/self-review/scripts/check_incorporation_bias_challenge/expected/bad.txt +8 -0
  251. package/skills/self-review/scripts/check_incorporation_bias_challenge/expected/ok.txt +8 -0
  252. package/skills/self-review/scripts/check_incorporation_bias_challenge/fixture/incorp_bad.md +11 -0
  253. package/skills/self-review/scripts/check_incorporation_bias_challenge/fixture/incorp_ok.md +10 -0
  254. package/skills/self-review/scripts/check_incorporation_bias_challenge/problem.md +14 -0
  255. package/skills/self-review/scripts/check_incorporation_bias_challenge/verify.sh +30 -0
  256. package/skills/self-review/scripts/check_panel_diversity.py +148 -6
  257. package/skills/self-review/scripts/check_perspective_structure.py +277 -0
  258. package/skills/self-review/scripts/check_perspective_structure_challenge/expected/edge_hardened.txt +8 -0
  259. package/skills/self-review/scripts/check_perspective_structure_challenge/expected/not_perspective.txt +8 -0
  260. package/skills/self-review/scripts/check_perspective_structure_challenge/expected/perspective_bad.txt +11 -0
  261. package/skills/self-review/scripts/check_perspective_structure_challenge/expected/perspective_ok.txt +8 -0
  262. package/skills/self-review/scripts/check_perspective_structure_challenge/fixture/edge_hardened.md +32 -0
  263. package/skills/self-review/scripts/check_perspective_structure_challenge/fixture/not_perspective.md +24 -0
  264. package/skills/self-review/scripts/check_perspective_structure_challenge/fixture/perspective_bad.md +20 -0
  265. package/skills/self-review/scripts/check_perspective_structure_challenge/fixture/perspective_ok.md +16 -0
  266. package/skills/self-review/scripts/check_perspective_structure_challenge/problem.md +42 -0
  267. package/skills/self-review/scripts/check_perspective_structure_challenge/verify.sh +57 -0
  268. package/skills/self-review/scripts/check_reference_adequacy.py +3 -0
  269. package/skills/self-review/scripts/check_rhetorical_density.py +241 -0
  270. package/skills/self-review/scripts/check_scope_coherence.py +144 -1
  271. package/skills/self-review/scripts/cohort_arith_binding_challenge/fixture/decimal_person_time.md +3 -0
  272. package/skills/self-review/scripts/cohort_arith_binding_challenge/fixture/genuine_defects.md +10 -0
  273. package/skills/self-review/scripts/cohort_arith_binding_challenge/fixture/real_negatives.md +16 -0
  274. package/skills/self-review/scripts/cohort_arith_binding_challenge/verify.sh +84 -0
  275. package/skills/self-review/scripts/confounding_findings_challenge/fixture/adjusted.txt +2 -0
  276. package/skills/self-review/scripts/confounding_findings_challenge/fixture/defining.txt +2 -0
  277. package/skills/self-review/scripts/confounding_findings_challenge/fixture/table1.csv +7 -0
  278. package/skills/self-review/scripts/confounding_findings_challenge/verify.sh +75 -0
  279. package/skills/self-review/scripts/disclosure_placement_challenge/fixture/about_disclosure.md +9 -0
  280. package/skills/self-review/scripts/disclosure_placement_challenge/fixture/manuscript.md +13 -0
  281. package/skills/self-review/scripts/disclosure_placement_challenge/verify.sh +99 -0
  282. package/skills/self-review/scripts/refinement_regression.py +215 -0
  283. package/skills/self-review/scripts/refinement_regression_challenge/expected/churning.txt +5 -0
  284. package/skills/self-review/scripts/refinement_regression_challenge/expected/converged.txt +5 -0
  285. package/skills/self-review/scripts/refinement_regression_challenge/expected/findings_regression.txt +5 -0
  286. package/skills/self-review/scripts/refinement_regression_challenge/expected/firstrun.txt +5 -0
  287. package/skills/self-review/scripts/refinement_regression_challenge/expected/progressing.txt +5 -0
  288. package/skills/self-review/scripts/refinement_regression_challenge/expected/regression.txt +5 -0
  289. package/skills/self-review/scripts/refinement_regression_challenge/fixture/churning/ledger.jsonl +2 -0
  290. package/skills/self-review/scripts/refinement_regression_challenge/fixture/churning/qc/gate.json +1 -0
  291. package/skills/self-review/scripts/refinement_regression_challenge/fixture/converged/ledger.jsonl +1 -0
  292. package/skills/self-review/scripts/refinement_regression_challenge/fixture/converged/qc/gate.json +1 -0
  293. package/skills/self-review/scripts/refinement_regression_challenge/fixture/findings_regression/ledger.jsonl +1 -0
  294. package/skills/self-review/scripts/refinement_regression_challenge/fixture/findings_regression/qc/table_pct.json +1 -0
  295. package/skills/self-review/scripts/refinement_regression_challenge/fixture/firstrun/ledger.jsonl +0 -0
  296. package/skills/self-review/scripts/refinement_regression_challenge/fixture/firstrun/qc/gate.json +1 -0
  297. package/skills/self-review/scripts/refinement_regression_challenge/fixture/progressing/ledger.jsonl +1 -0
  298. package/skills/self-review/scripts/refinement_regression_challenge/fixture/progressing/qc/gate.json +1 -0
  299. package/skills/self-review/scripts/refinement_regression_challenge/fixture/regression/ledger.jsonl +1 -0
  300. package/skills/self-review/scripts/refinement_regression_challenge/fixture/regression/qc/gate.json +1 -0
  301. package/skills/self-review/scripts/refinement_regression_challenge/problem.md +38 -0
  302. package/skills/self-review/scripts/refinement_regression_challenge/verify.sh +53 -0
  303. package/skills/self-review/scripts/refinement_stop.py +207 -0
  304. package/skills/self-review/scripts/refinement_stop_challenge/expected/continue.txt +6 -0
  305. package/skills/self-review/scripts/refinement_stop_challenge/expected/empty.txt +6 -0
  306. package/skills/self-review/scripts/refinement_stop_challenge/expected/findings_major.txt +6 -0
  307. package/skills/self-review/scripts/refinement_stop_challenge/expected/minor_optional.txt +6 -0
  308. package/skills/self-review/scripts/refinement_stop_challenge/expected/overhardening.txt +6 -0
  309. package/skills/self-review/scripts/refinement_stop_challenge/expected/unparsed_gate.txt +7 -0
  310. package/skills/self-review/scripts/refinement_stop_challenge/expected/zero_edit.txt +6 -0
  311. package/skills/self-review/scripts/refinement_stop_challenge/fixture/continue/cohort_arithmetic.json +1 -0
  312. package/skills/self-review/scripts/refinement_stop_challenge/fixture/continue/editorial_impression.json +1 -0
  313. package/skills/self-review/scripts/refinement_stop_challenge/fixture/empty/.gitkeep +1 -0
  314. package/skills/self-review/scripts/refinement_stop_challenge/fixture/findings_major/editorial_impression.json +1 -0
  315. package/skills/self-review/scripts/refinement_stop_challenge/fixture/findings_major/table_pct.json +1 -0
  316. package/skills/self-review/scripts/refinement_stop_challenge/fixture/minor_optional/cohort_arithmetic.json +1 -0
  317. package/skills/self-review/scripts/refinement_stop_challenge/fixture/minor_optional/editorial_impression.json +1 -0
  318. package/skills/self-review/scripts/refinement_stop_challenge/fixture/overhardening/cohort_arithmetic.json +1 -0
  319. package/skills/self-review/scripts/refinement_stop_challenge/fixture/overhardening/editorial_impression.json +1 -0
  320. package/skills/self-review/scripts/refinement_stop_challenge/fixture/unparsed_gate/cohort.json +1 -0
  321. package/skills/self-review/scripts/refinement_stop_challenge/fixture/unparsed_gate/novel.json +1 -0
  322. package/skills/self-review/scripts/refinement_stop_challenge/fixture/zero_edit/cohort_arithmetic.json +1 -0
  323. package/skills/self-review/scripts/refinement_stop_challenge/fixture/zero_edit/editorial_impression.json +1 -0
  324. package/skills/self-review/scripts/refinement_stop_challenge/problem.md +39 -0
  325. package/skills/self-review/scripts/refinement_stop_challenge/verify.sh +45 -0
  326. package/skills/self-review/skill.yml +16 -0
  327. package/skills/self-review/tests/fixtures/aphorism_clean.md +46 -0
  328. package/skills/self-review/tests/fixtures/aphorism_dense.md +28 -0
  329. package/skills/self-review/tests/fixtures/aphorism_frontmatter.md +19 -0
  330. package/skills/self-review/tests/fixtures/citation_order_frontmatter.md +30 -0
  331. package/skills/self-review/tests/fixtures/citation_order_ref_gap.md +20 -0
  332. package/skills/self-review/tests/fixtures/citation_order_ref_good.md +21 -0
  333. package/skills/self-review/tests/fixtures/citation_order_ref_order_bad.md +25 -0
  334. package/skills/self-review/tests/fixtures/citation_order_ref_range_ok.md +31 -0
  335. package/skills/self-review/tests/fixtures/citation_order_section_bad.md +8 -0
  336. package/skills/self-review/tests/fixtures/citation_order_section_good.md +9 -0
  337. package/skills/self-review/tests/fixtures/citation_order_uncited.md +24 -0
  338. package/skills/self-review/tests/fixtures/claim_registration_bad.md +7 -0
  339. package/skills/self-review/tests/fixtures/claim_registration_clean.md +11 -0
  340. package/skills/self-review/tests/fixtures/cohort_dup_ci.md +9 -0
  341. package/skills/self-review/tests/fixtures/cohort_dup_ci_clean.md +9 -0
  342. package/skills/self-review/tests/fixtures/cohort_followup_criterion.md +2 -0
  343. package/skills/self-review/tests/fixtures/cohort_followup_ok.md +3 -0
  344. package/skills/self-review/tests/fixtures/cohort_nested_models.md +9 -0
  345. package/skills/self-review/tests/fixtures/cohort_nested_models_base.md +9 -0
  346. package/skills/self-review/tests/fixtures/cohort_partition_prose.md +9 -0
  347. package/skills/self-review/tests/fixtures/cohort_partition_prose_clean.md +19 -0
  348. package/skills/self-review/tests/fixtures/figcite_credit_bad.md +9 -0
  349. package/skills/self-review/tests/fixtures/figcite_credit_ok.md +9 -0
  350. package/skills/self-review/tests/fixtures/figcite_embedded.md +13 -0
  351. package/skills/self-review/tests/fixtures/figcite_not_embedded.md +9 -0
  352. package/skills/self-review/tests/fixtures/figure_clean.md +5 -0
  353. package/skills/self-review/tests/fixtures/panel_one_returned.json +13 -0
  354. package/skills/self-review/tests/fixtures/panel_stats_lens.json +31 -0
  355. package/skills/self-review/tests/fixtures/rhetorical_clean.md +31 -0
  356. package/skills/self-review/tests/fixtures/rhetorical_dense.md +22 -0
  357. package/skills/self-review/tests/fixtures/roster_3.json +1 -0
  358. package/skills/self-review/tests/fixtures/roster_4.json +1 -0
  359. package/skills/self-review/tests/fixtures/roster_indep_substrate.json +6 -0
  360. package/skills/self-review/tests/fixtures/roster_mono_substrate.json +6 -0
  361. package/skills/self-review/tests/fixtures/scope_gradient.md +7 -0
  362. package/skills/self-review/tests/fixtures/scope_gradient_tested.md +6 -0
  363. package/skills/self-review/tests/fixtures/scope_universal_negative.md +3 -0
  364. package/skills/self-review/tests/fixtures/scope_universal_negative_ok.md +3 -0
  365. package/skills/self-review/tests/test_aphorism_density.sh +51 -0
  366. package/skills/self-review/tests/test_citation_order.sh +88 -0
  367. package/skills/self-review/tests/test_claim_artifact.sh +12 -0
  368. package/skills/self-review/tests/test_cohort_arithmetic.sh +59 -0
  369. package/skills/self-review/tests/test_confounding_completeness.sh +10 -3
  370. package/skills/self-review/tests/test_figure_citation.sh +28 -1
  371. package/skills/self-review/tests/test_panel_diversity.sh +46 -0
  372. package/skills/self-review/tests/test_panel_mode.sh +7 -1
  373. package/skills/self-review/tests/test_rhetorical_density.sh +56 -0
  374. package/skills/self-review/tests/test_scope_coherence.sh +29 -0
  375. package/skills/sync-submission/SKILL.md +95 -0
  376. package/skills/sync-submission/scripts/_quote_match.py +172 -0
  377. package/skills/sync-submission/scripts/check_credit_integrity.py +402 -0
  378. package/skills/sync-submission/scripts/check_disclosure_availability.py +31 -4
  379. package/skills/sync-submission/scripts/check_portal_field_residue.py +193 -0
  380. package/skills/sync-submission/scripts/check_portal_field_residue_challenge/fixture/negative/abstract.txt +4 -0
  381. package/skills/sync-submission/scripts/check_portal_field_residue_challenge/fixture/negative/keywords.txt +3 -0
  382. package/skills/sync-submission/scripts/check_portal_field_residue_challenge/fixture/positive/abstract.txt +6 -0
  383. package/skills/sync-submission/scripts/check_portal_field_residue_challenge/fixture/positive/take_home.txt +3 -0
  384. package/skills/sync-submission/scripts/check_portal_field_residue_challenge/problem.md +33 -0
  385. package/skills/sync-submission/scripts/check_portal_field_residue_challenge/verify.sh +53 -0
  386. package/skills/sync-submission/scripts/check_portal_mirror.py +436 -0
  387. package/skills/sync-submission/scripts/cover_letter_drift_check.py +80 -3
  388. package/skills/sync-submission/scripts/credit_integrity_challenge/fixture/manuscript_bad.md +16 -0
  389. package/skills/sync-submission/scripts/credit_integrity_challenge/fixture/manuscript_good.md +20 -0
  390. package/skills/sync-submission/scripts/credit_integrity_challenge/verify.sh +156 -0
  391. package/skills/sync-submission/scripts/figure_portal_readiness_challenge/problem.md +27 -0
  392. package/skills/sync-submission/scripts/figure_portal_readiness_challenge/verify.sh +78 -0
  393. package/skills/sync-submission/scripts/figure_portal_readiness_check.py +140 -0
  394. package/skills/sync-submission/scripts/portal_mirror_challenge/fixture/manuscript.md +37 -0
  395. package/skills/sync-submission/scripts/portal_mirror_challenge/fixture/portal_complete/acknowledgements.txt +3 -0
  396. package/skills/sync-submission/scripts/portal_mirror_challenge/fixture/portal_complete/author_contributions.txt +3 -0
  397. package/skills/sync-submission/scripts/portal_mirror_challenge/fixture/portal_complete/competing_interests.txt +1 -0
  398. package/skills/sync-submission/scripts/portal_mirror_challenge/fixture/portal_complete/data_availability.txt +4 -0
  399. package/skills/sync-submission/scripts/portal_mirror_challenge/fixture/portal_dropped/acknowledgements.txt +2 -0
  400. package/skills/sync-submission/scripts/portal_mirror_challenge/fixture/portal_dropped/author_contributions.txt +2 -0
  401. package/skills/sync-submission/scripts/portal_mirror_challenge/fixture/portal_dropped/data_availability.txt +4 -0
  402. package/skills/sync-submission/scripts/portal_mirror_challenge/fixture/portal_reflowed/acknowledgements.txt +1 -0
  403. package/skills/sync-submission/scripts/portal_mirror_challenge/fixture/portal_reflowed/author_contributions.txt +5 -0
  404. package/skills/sync-submission/scripts/portal_mirror_challenge/fixture/portal_reflowed/competing_interests.txt +1 -0
  405. package/skills/sync-submission/scripts/portal_mirror_challenge/fixture/portal_reflowed/data_availability.txt +1 -0
  406. package/skills/sync-submission/scripts/portal_mirror_challenge/verify.sh +127 -0
  407. package/skills/sync-submission/scripts/preflight_gate.py +119 -1
  408. package/skills/sync-submission/skill.yml +3 -0
  409. package/skills/sync-submission/tests/test_cover_letter_title_drift.sh +65 -0
  410. package/skills/sync-submission/tests/test_disclosure_availability.sh +73 -0
  411. package/skills/verify-refs/SKILL.md +37 -0
  412. package/skills/verify-refs/scripts/_quote_match.py +172 -0
  413. package/skills/verify-refs/scripts/check_claim_fidelity.py +644 -0
  414. package/skills/verify-refs/scripts/claim_fidelity_challenge/fixture/fulltext/10.1000_synthetic.oversight.md +61 -0
  415. package/skills/verify-refs/scripts/claim_fidelity_challenge/fixture/fulltext/10.1000_synthetic.stub.md +16 -0
  416. package/skills/verify-refs/scripts/claim_fidelity_challenge/fixture/manuscript_numbered.md +17 -0
  417. package/skills/verify-refs/scripts/claim_fidelity_challenge/fixture/manuscript_shortsource.md +12 -0
  418. package/skills/verify-refs/scripts/claim_fidelity_challenge/fixture/manuscript_supported.md +16 -0
  419. package/skills/verify-refs/scripts/claim_fidelity_challenge/fixture/manuscript_unsupported.md +15 -0
  420. package/skills/verify-refs/scripts/claim_fidelity_challenge/fixture/refs.bib +19 -0
  421. package/skills/verify-refs/scripts/claim_fidelity_challenge/verify.sh +157 -0
  422. package/skills/verify-refs/skill.yml +6 -0
  423. package/skills/write-paper/SKILL.md +116 -363
  424. package/skills/write-paper/references/journal_profiles/Academic_Radiology.md +3 -0
  425. package/skills/write-paper/references/journal_profiles/British_Journal_of_Radiology.md +3 -0
  426. package/skills/write-paper/references/journal_profiles/Diabetes_Metabolism_Journal.md +3 -0
  427. package/skills/write-paper/references/journal_profiles/European_Journal_of_Preventive_Cardiology.md +3 -0
  428. package/skills/write-paper/references/journal_profiles/Hepatology_Communications.md +3 -0
  429. package/skills/write-paper/references/journal_profiles/Investigative_Radiology.md +3 -0
  430. package/skills/write-paper/references/journal_profiles/JACC_Advances.md +3 -0
  431. package/skills/write-paper/references/journal_profiles/JKMS.md +3 -0
  432. package/skills/write-paper/references/journal_profiles/JNIS.md +3 -0
  433. package/skills/write-paper/references/journal_profiles/Journal_of_Clinical_Endocrinology_and_Metabolism.md +3 -0
  434. package/skills/write-paper/references/journal_profiles/Journal_of_Stroke.md +3 -0
  435. package/skills/write-paper/references/journal_profiles/KJR.md +3 -0
  436. package/skills/write-paper/references/journal_profiles/Korean_Circulation_Journal.md +3 -0
  437. package/skills/write-paper/references/journal_profiles/Korean_Journal_of_Internal_Medicine.md +3 -0
  438. package/skills/write-paper/references/journal_profiles/Lancet_Gastroenterology_and_Hepatology.md +3 -0
  439. package/skills/write-paper/references/journal_profiles/Liver_International.md +3 -0
  440. package/skills/write-paper/references/journal_profiles/PLOS_Medicine.md +3 -0
  441. package/skills/write-paper/references/journal_profiles/RYAI.md +3 -0
  442. package/skills/write-paper/references/journal_profiles/The_Lancet.md +3 -0
  443. package/skills/write-paper/references/journal_profiles/The_Lancet_Digital_Health.md +3 -0
  444. package/skills/write-paper/references/journal_profiles/World_Journal_of_Hepatology.md +3 -0
  445. package/skills/write-paper/references/journal_profiles/npj_Digital_Medicine.md +32 -0
  446. package/skills/write-paper/references/phase0_init_detail.md +139 -0
  447. package/skills/write-paper/references/phase7_polish_detail.md +283 -0
  448. package/skills/write-paper/scripts/check_placeholders.py +27 -0
  449. package/skills/write-paper/tests/test_placeholders.sh +17 -0
  450. package/skills/make-figures/references/exemplar_diagrams/other/other_02.meta.yaml +0 -4
  451. package/skills/make-figures/references/exemplar_diagrams/other/other_02.png +0 -0
  452. package/skills/make-figures/references/exemplar_diagrams/pipeline/pipeline_01.meta.yaml +0 -4
  453. package/skills/make-figures/references/exemplar_diagrams/pipeline/pipeline_01.png +0 -0
  454. package/skills/make-figures/references/exemplar_diagrams/pipeline/pipeline_03.meta.yaml +0 -4
  455. package/skills/make-figures/references/exemplar_diagrams/pipeline/pipeline_03.png +0 -0
  456. package/skills/make-figures/references/exemplar_diagrams/pipeline/pipeline_04.meta.yaml +0 -4
  457. package/skills/make-figures/references/exemplar_diagrams/pipeline/pipeline_04.png +0 -0
  458. package/skills/make-figures/references/exemplar_diagrams/pipeline/pipeline_05.meta.yaml +0 -4
  459. package/skills/make-figures/references/exemplar_diagrams/pipeline/pipeline_05.png +0 -0
  460. package/skills/make-figures/references/exemplar_diagrams/pipeline/pipeline_06.meta.yaml +0 -4
  461. package/skills/make-figures/references/exemplar_diagrams/pipeline/pipeline_06.png +0 -0
  462. package/skills/make-figures/references/exemplar_diagrams/pipeline/pipeline_07.meta.yaml +0 -4
  463. package/skills/make-figures/references/exemplar_diagrams/pipeline/pipeline_07.png +0 -0
  464. package/skills/make-figures/references/exemplar_diagrams/pipeline/pipeline_08.meta.yaml +0 -4
  465. package/skills/make-figures/references/exemplar_diagrams/pipeline/pipeline_08.png +0 -0
  466. package/skills/make-figures/references/exemplar_diagrams/pipeline/pipeline_09.meta.yaml +0 -4
  467. package/skills/make-figures/references/exemplar_diagrams/pipeline/pipeline_09.png +0 -0
  468. package/skills/make-figures/references/exemplar_diagrams/pipeline/pipeline_10.meta.yaml +0 -4
  469. package/skills/make-figures/references/exemplar_diagrams/pipeline/pipeline_10.png +0 -0
  470. package/skills/make-figures/references/visual_abstract_templates/european_radiology.pptx +0 -0
package/LICENSE CHANGED
@@ -19,32 +19,3 @@ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
19
  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
20
  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
21
  SOFTWARE.
22
-
23
- ---
24
-
25
- ## Third-Party Content Licenses
26
-
27
- The following reporting guideline checklists are bundled under their original licenses
28
- (NOT under MIT). See each file for attribution:
29
-
30
- - STROBE checklist: CC BY (https://www.strobe-statement.org)
31
- - STARD 2015 checklist: CC BY 4.0 (https://www.equator-network.org/reporting-guidelines/stard/)
32
- - TRIPOD+AI checklist: CC BY 4.0 (https://www.tripod-statement.org)
33
- - PRISMA 2020 checklist: CC BY (https://www.prisma-statement.org)
34
- - ARRIVE 2.0 checklist: CC0 (https://arriveguidelines.org)
35
-
36
- The following checklists are NOT bundled due to license restrictions.
37
- Users should download them directly from official sources:
38
-
39
- - CONSORT 2010: https://www.consort-statement.org (CC BY-NC)
40
- - CARE: https://www.care-statement.org
41
- - SPIRIT: https://www.spirit-statement.org (CC BY-NC-ND)
42
- - CLAIM 2024: https://pubs.rsna.org/doi/10.1148/radiol.2020200267
43
-
44
- ## Optional Dependencies
45
-
46
- The following external packages are NOT bundled but may be installed separately by the user:
47
-
48
- - pymupdf4llm: AGPL-3.0 or Artifex Commercial License (https://pymupdf.readthedocs.io)
49
- Used by: fulltext-retrieval/pdf_to_md.py (optional PDF→Markdown conversion)
50
- Install: pip install pymupdf4llm
package/README.md CHANGED
@@ -2,14 +2,14 @@
2
2
 
3
3
  # MedSci Skills
4
4
 
5
- **55 skills that actually work.** Built by a physician-researcher, tested on real publications.
5
+ **58 skills that actually work.** Built by a physician-researcher, tested on real publications.
6
6
 
7
- *MedSci Skills is an end-to-end research tool for physician and medical-engineering researchers — design → scaffold → validate → publish — for the clinical manuscript and the medical-AI model behind it. Its moat is the compliance layer — 46 reporting guidelines and risk-of-bias tools, reference/citation verification, and deterministic integrity gates before peer review — now extended by a model-engineering lane that scaffolds reproducible, leakage-safe training repos and audits model validation. Clinical AI model research engineering is in scope; a general AI-scientist platform is not. It competes on clinical submission reliability, not skill count.*
7
+ *MedSci Skills is an end-to-end research tool for physician and medical-engineering researchers — design → scaffold → validate → publish — for the clinical manuscript and the medical-AI model behind it. Its moat is the compliance layer — 47 reporting guidelines and risk-of-bias tools, reference/citation verification, and deterministic integrity gates before peer review — now extended by a model-engineering lane that scaffolds reproducible, leakage-safe training repos and audits model validation. Clinical AI model research engineering is in scope; a general AI-scientist platform is not. It competes on clinical submission reliability, not skill count.*
8
8
 
9
9
  [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](LICENSE)
10
10
  [![Release](https://img.shields.io/github/v/release/Aperivue/medsci-skills?style=flat-square&color=blue)](https://github.com/Aperivue/medsci-skills/releases/latest)
11
11
  [![CI](https://img.shields.io/github/actions/workflow/status/Aperivue/medsci-skills/validate.yml?branch=main&style=flat-square&label=CI)](https://github.com/Aperivue/medsci-skills/actions/workflows/validate.yml)
12
- ![Skills](https://img.shields.io/badge/Skills-55-brightgreen?style=flat-square)
12
+ ![Skills](https://img.shields.io/badge/Skills-58-brightgreen?style=flat-square)
13
13
  [![npm](https://img.shields.io/npm/v/medsci-skills?style=flat-square&label=npm&color=cb3837)](https://www.npmjs.com/package/medsci-skills)
14
14
  [![npm downloads](https://img.shields.io/npm/dw/medsci-skills?style=flat-square&label=npm%20downloads&color=cb3837)](https://www.npmjs.com/package/medsci-skills)
15
15
  [![Watch the 2-min intro](https://img.shields.io/badge/▶_Watch-2--min_intro-FF0000?style=flat-square&logo=youtube&logoColor=white)](https://youtu.be/MclQ_RIofpE)
@@ -92,6 +92,19 @@ cp -r medsci-skills/skills/* ~/.claude/skills/
92
92
 
93
93
  Restart Claude Code, then start with **`/orchestrate`** — it classifies your request and routes you to the right skill. Full install options (Codex, Cursor, individual skills) are in [Installation](#installation).
94
94
 
95
+ ### Install with `gh skill`
96
+
97
+ MedSci Skills follows the [Agent Skills standard](https://agentskills.io), so GitHub CLI ≥ 2.90 can search, preview, and install any skill straight from this repo — no clone (a `gh` preview feature):
98
+
99
+ ```bash
100
+ gh skill search medsci # list the whole collection
101
+ gh skill preview Aperivue/medsci-skills check-reporting # read a skill before installing
102
+ gh skill install Aperivue/medsci-skills check-reporting # install just that one
103
+ gh skill install --all Aperivue/medsci-skills # or install every skill
104
+ ```
105
+
106
+ Search by a skill's own name (`check-reporting`, `verify-refs`, `meta-analysis`) or by `medsci` to list them all — both return this repo directly. A broad topic word like `systematic review` is shared by hundreds of skills across GitHub, so add `--owner Aperivue` to see only ours.
107
+
95
108
  ### Install as a Claude Code plugin
96
109
 
97
110
  Prefer plugins? One line adds the marketplace; `/plugin` then lets you browse nine category plugins and enable the ones you want:
@@ -120,7 +133,7 @@ Install a single category and invoke its skills under that namespace:
120
133
  /medsci-analysis:analyze-stats
121
134
  ```
122
135
 
123
- All eight plugins share the same repository source, so this groups and enables skills by category — it is not a partial download. The marketplace tracks `main`, so a plugin's version is its git commit.
136
+ All nine plugins share the same repository source, so this groups and enables skills by category — it is not a partial download. The marketplace tracks `main`, so a plugin's version is its git commit.
124
137
 
125
138
  **Want just one capability?** Two skills are also published as focused standalone repos (generated mirrors; this repo stays the source of truth), each installable on its own with `/plugin marketplace add Aperivue/<repo>`:
126
139
 
@@ -470,14 +483,14 @@ ma-scout -> search-lit -> fulltext-retrieval -> design-study ──> write-proto
470
483
 
471
484
  ### By research stage
472
485
 
473
- All 55 skills, grouped by where they fit in the clinical-manuscript and medical-AI lifecycle. Full descriptions are in the table below; one page per skill lives in the [per-skill reference](docs/skills/).
486
+ All 58 skills, grouped by where they fit in the clinical-manuscript and medical-AI lifecycle. Full descriptions are in the table below; one page per skill lives in the [per-skill reference](docs/skills/).
474
487
 
475
488
  | Stage | Skills |
476
489
  |-------|--------|
477
490
  | 🔭 **Discover & scope** | `ma-scout` · `find-cohort-gap` · `search-lit` · `fulltext-retrieval` · `lit-sync` · `author-strategy` |
478
491
  | 📐 **Design & plan** | `design-study` · `calc-sample-size` · `define-variables` · `write-protocol` · `fill-protocol` · `design-ai-benchmarking` |
479
492
  | 🧹 **Data & analysis** | `deidentify` · `clean-data` · `generate-codebook` · `version-dataset` · `analyze-stats` · `batch-cohort` · `cross-national` · `replicate-study` |
480
- | 🤖 **Medical-AI model engineering** | `preprocess-imaging` · `architecture-zoo` · `model-scaffold` · `model-validation` · `model-evaluation` · `uncertainty-imaging` · `explainability` · `radiomics-ml` · `model-card` · `mllm-eval` |
493
+ | 🤖 **Medical-AI model engineering** | `profile-imaging` · `preprocess-imaging` · `architecture-zoo` · `model-scaffold` · `model-validation` · `model-evaluation` · `uncertainty-imaging` · `explainability` · `radiomics-ml` · `model-card` · `mllm-eval` |
481
494
  | ✍️ **Write & visualize** | `write-paper` · `make-figures` · `review-paper` · `present-paper` · `humanize` · `polish-language` · `academic-aio` |
482
495
  | ✅ **Comply & verify** | `check-reporting` · `self-review` · `verify-refs` · `manage-refs` |
483
496
  | 📤 **Submit & respond** | `find-journal` · `add-journal` · `sync-submission` · `revise` · `peer-review` · `fill-icmje-coi` |
@@ -492,13 +505,14 @@ All 55 skills, grouped by where they fit in the clinical-manuscript and medical-
492
505
  | **search-lit** | PubMed + Semantic Scholar + bioRxiv search with anti-hallucination citation verification. Token-efficient error handling -- CrossRef failures are silently batched, not repeated. BibTeX output tags each entry with `verified`/`verified_by`/`verified_on` fields so downstream skills can trust the citation provenance. |
493
506
  | **verify-refs** | Pre-submission reference audit for `.md`, `.docx`, `.bib`, or `.tsv` inputs. Extracts references, verifies DOI/PMID via CrossRef/PubMed when available, and writes `qc/reference_audit.json` as the sole output — row-level status (OK / MISMATCH / UNVERIFIED / FABRICATED) lives inside the JSON `records[]` block. `/search-lit` produces candidate BibTeX; `/lit-sync` owns `manuscript/_src/refs.bib`. |
494
507
  | **fulltext-retrieval** | Batch open-access PDF downloader. Unpaywall → PMC → OpenAlex → CrossRef pipeline. OA-only -- no paywall bypass. Input: DOI list or TSV. Optional PDF→Markdown conversion via [pymupdf4llm](https://pymupdf.readthedocs.io/en/latest/pymupdf4llm/) for token-efficient LLM analysis of academic papers. |
495
- | **check-reporting** | Manuscript compliance audit against 46 reporting guidelines and risk of bias tools (STROBE, STROBE-MR, RECORD, STARD, STARD-AI, TRIPOD, TRIPOD+AI, TRIPOD-LLM, PGS-RS, CHEERS 2022, CROSS, SRQR, COREQ, PRISMA, PRISMA-DTA, PRISMA-P, PRISMA-ScR, MOOSE, ARRIVE, CONSORT, CONSORT-AI, CARE, SPIRIT, SPIRIT-AI, CLAIM, DECIDE-AI, SQUIRE 2.0, CLEAR, GRRAS, MI-CLEAR-LLM, SWiM, AMSTAR 2, QUADAS-2, QUADAS-C, RoB 2, ROBINS-I, ROBINS-E, ROBIS, ROB-ME, PROBAST, PROBAST+AI, NOS, COSMIN, RoB NMA). Machine-readable JSON summary with `compliance_pct` and `fixable_by_ai` flags for automated pipeline integration. |
508
+ | **check-reporting** | Manuscript compliance audit against 47 reporting guidelines and risk of bias tools (STROBE, STROBE-MR, RECORD, GATHER, STARD, STARD-AI, TRIPOD, TRIPOD+AI, TRIPOD-LLM, PGS-RS, CHEERS 2022, CROSS, SRQR, COREQ, PRISMA, PRISMA-DTA, PRISMA-P, PRISMA-ScR, MOOSE, ARRIVE, CONSORT, CONSORT-AI, CARE, SPIRIT, SPIRIT-AI, CLAIM, DECIDE-AI, SQUIRE 2.0, CLEAR, GRRAS, MI-CLEAR-LLM, SWiM, AMSTAR 2, QUADAS-2, QUADAS-C, RoB 2, ROBINS-I, ROBINS-E, ROBIS, ROB-ME, PROBAST, PROBAST+AI, NOS, COSMIN, RoB NMA). Machine-readable JSON summary with `compliance_pct` and `fixable_by_ai` flags for automated pipeline integration. |
496
509
  | **analyze-stats** | Statistical analysis code generation (Python/R) for diagnostic accuracy, DTA meta-analysis (bivariate/HSROC), inter-rater agreement, survival analysis, demographics tables, regression (logistic/linear), propensity score (matching/IPTW/overlap weighting), and repeated measures (RM ANOVA/GEE/mixed models). Calibration mandatory for prediction models. |
497
510
  | **meta-analysis** | Full systematic review and meta-analysis pipeline (8 phases). DTA (bivariate/HSROC) and intervention meta-analysis. Protocol to submission-ready manuscript with PRISMA-DTA compliance. |
498
511
  | **make-figures** | Publication-ready figures and visual abstracts: ROC curves, forest plots, PRISMA/CONSORT/STARD flow diagrams, Kaplan-Meier curves, Bland-Altman plots, confusion matrices, and journal-specific visual/graphical abstracts (python-pptx template-based). Communication-first design principles (Nat Hum Behav 2026 — key message, audience, cognitive load, figure-vs-table decision) and five flow-diagram production lessons (official-template fidelity, VML fallback PDF export, docx XML escape, sequential placeholder mapping, version freeze); critic rubric Section G adds 5 communication-first checks. `--study-type` auto-generates the full required figure set; structured `_figure_manifest.md` output for downstream pipeline consumption; D2 enforced as default for flow diagrams. |
499
512
  | **design-study** | Study design review: identifies analysis unit, cohort logic, data leakage risks, comparator design, validation strategy, and reporting guideline fit. |
500
513
  | **design-ai-benchmarking** | Design and validity review for benchmarking AI system(s) against a human-expert panel: evaluation-question and arm definition, decoupled multi-dimensional rubrics with anchors, planted calibration probes (positive-control / known-bad / instability / mechanism-contradiction), reviewer-panel construction with per-reviewer randomization, inter-rater reliability targets with separate control-item reliability, LLM-as-judge vs human-as-judge adjudication, construct-independence guards, and a structured JSON rating-export schema. Locks the rubric before data collection. |
501
514
  | **model-validation** | Design or audit the clinical-validation study for an engineer-built medical-imaging model (segmentation / classification / detection): patient-level split disjointness and the data-leakage taxonomy, tuning-on-test, internal vs genuine external validation, comparator design, single-run vs multi-seed variance, task-correct metric selection (Metrics Reloaded), test-set sizing, and CLAIM 2024 / TRIPOD+AI / STARD-AI reporting fit. Ships a deterministic split-leakage gate that proves patient disjointness by set arithmetic on the emitted split table. Integrates with MONAI / nnU-Net — does not replace them. |
515
+ | **profile-imaging** | Profile a medical-imaging dataset before any modelling decision — acquisition grid, voxel spacing and orientation spread, intensity domain, the label values actually present, foreground fraction and target volume — then gate that profile against the declared plan. Catches, while it is still cheap, what otherwise surfaces after a training run: a "test set" carrying no ground truth (`TEST_SET_UNLABELLED`), a label grid that does not match its image (`LABEL_SHAPE_MISMATCH`), a stray label index (`LABEL_VALUE_UNEXPECTED`), accuracy planned against a sliver-sized target (`ACCURACY_UNDER_IMBALANCE`), and acquisition heterogeneity with no declared resampling decision (`SPACING_HETEROGENEOUS`). The gate flags an *undeclared* decision, not variability itself. |
502
516
  | **preprocess-imaging** | Design or audit the data-preparation stage of a medical-imaging model — DICOM/NIfTI intake, resampling, intensity normalization, and the augmentation plan — so the pipeline is leakage-safe before `model-scaffold` builds the training repo. Emits a declarative preprocessing manifest and a deterministic data-stage leakage gate (`check_preprocessing_leakage`) that catches what the split table cannot see: a dataset-level normaliser fit on non-train data (`NORMALIZATION_LEAKAGE`), a data-fitted transform run before the split (`PREPROCESS_BEFORE_SPLIT`), and a patient's slices crossing splits (`PATIENT_CROSS_SPLIT`). Integrates MONAI / TorchIO transforms; never reimplements them or touches real patient data. |
503
517
  | **model-scaffold** | Generate a reproducible, runnable PyTorch training repo for a medical-imaging task — segmentation (U-Net), classification, detection, image-to-image synthesis, self-supervised pretraining, or fine-tuning a pretrained backbone (transfer learning) — the missing middle link between choosing an architecture and validating a trained model. Emits a patient-level seed-locked split as an auditable artifact, a task-appropriate model, train/evaluate scripts that seed every RNG and infer under eval mode, a config, requirements, a reproducibility record, and a Methods stub with VERIFY placeholders (no fabricated numbers). Fine-tuning mode (`--task finetune`) adds a frozen→unfrozen schedule, discriminative learning rates, and a pretrained-weight provenance record (`PRETRAINED.md`), with a MedSAM-adaptation + train-only diffusion-augmentation guide. Reproducibility holds by construction; ships a `check_training_hygiene` AST gate (RNG seeding, eval-mode inference, train-split-only loaders, pretrained-provenance) + a network-free build→validate challenge. Integrates with MONAI / nnU-Net / TorchIO / timm / torchvision for production-grade models. |
504
518
  | **architecture-zoo** | "Which architecture for which research question" decision tool: maps task (classification / segmentation / detection / transfer), modality, data scale, and class imbalance to a paper-grounded architecture shortlist. Curates the foundational curriculum (ResNet / DenseNet / EfficientNet / ViT / Swin; U-Net / 3-D U-Net / Attention & Residual U-Net / nnU-Net / Mask R-CNN; SAM/MedSAM / TotalSegmentator / BiomedCLIP / DINO / MAE / SimCLR) — each with core idea, when-to-use, medical-imaging use, reference implementation, validation setup, and the matching model-scaffold template. Advisory; teaches archetypes, not a live SOTA leaderboard. |
@@ -603,6 +617,19 @@ npx medsci-skills doctor # quick Node/Python/skill-folder check
603
617
 
604
618
  Requires Node 18+ and (for `install`/`doctor`) `python3` on your PATH.
605
619
 
620
+ ### Option 5: GitHub CLI (`gh skill`)
621
+
622
+ If you use [GitHub CLI](https://cli.github.com/) ≥ 2.90, `gh skill` installs skills from any Agent-Skills repo — this one included — without cloning. It is a `gh` **preview** feature, so the exact flags may change.
623
+
624
+ ```bash
625
+ gh skill search medsci # list every MedSci skill
626
+ gh skill preview Aperivue/medsci-skills check-reporting # inspect one first
627
+ gh skill install Aperivue/medsci-skills check-reporting # install a single skill
628
+ gh skill install --all Aperivue/medsci-skills # or install all of them
629
+ ```
630
+
631
+ `gh skill install` places skills in the host-specific folder for the agent you pick with `--agent` (`claude-code` → `~/.claude/skills/`, `codex` → `~/.agents/skills/`, and many others), at user or project `--scope` — the same folders the npx and git paths above populate. Discovery works best by a skill's exact name or by `medsci`; for a broad topic word, scope with `--owner Aperivue`.
632
+
606
633
  ### Platform notes
607
634
 
608
635
  - Claude Code: skills are copied to `~/.claude/skills/` (also read by GitHub Copilot and Cursor).
@@ -665,8 +692,8 @@ Projects declare their source-of-truth layout in `SSOT.yaml`, and a `qc/migratio
665
692
  ### Meta-Analysis Failure Modes
666
693
  `/meta-analysis` ships empirical failure-mode references (data integrity, review orchestration, submission package drift, post-submission release ops) with four automation hooks: `scripts/prisma_5way_consistency.py` (DI-6 PRISMA number consistency), `scripts/extraction_consensus_log_init.py` (DI-1 dual-extraction scaffold), `scripts/tag_cleanup_gate.sh` (DI-8 placeholder tag gate), and `scripts/verify_package_integrity.py` (SPD SHA-256 manifest for submission bundles).
667
694
 
668
- ### 46 Reporting Guidelines & RoB Tools Built-in
669
- `check-reporting` includes bundled checklists for 46 guidelines and risk-of-bias tools: STROBE, STROBE-MR, RECORD, STARD, STARD-AI, TRIPOD, TRIPOD+AI, TRIPOD-LLM, PGS-RS, CHEERS 2022, CROSS, SRQR, COREQ, PRISMA 2020, PRISMA-DTA, PRISMA-P, PRISMA-ScR, MOOSE, ARRIVE, CONSORT, CONSORT-AI, CARE, SPIRIT, SPIRIT-AI, CLAIM, DECIDE-AI, SQUIRE 2.0, CLEAR, GRRAS, MI-CLEAR-LLM, SWiM, AMSTAR 2, QUADAS-2, QUADAS-C, RoB 2, ROBINS-I, ROBINS-E, ROBIS, ROB-ME, PROBAST, PROBAST+AI, NOS, COSMIN, RoB NMA. Includes Results/Discussion section boundary checks and machine-readable JSON summary for pipeline integration.
695
+ ### 47 Reporting Guidelines & RoB Tools Built-in
696
+ `check-reporting` includes bundled checklists for 47 guidelines and risk-of-bias tools: STROBE, STROBE-MR, RECORD, GATHER, STARD, STARD-AI, TRIPOD, TRIPOD+AI, TRIPOD-LLM, PGS-RS, CHEERS 2022, CROSS, SRQR, COREQ, PRISMA 2020, PRISMA-DTA, PRISMA-P, PRISMA-ScR, MOOSE, ARRIVE, CONSORT, CONSORT-AI, CARE, SPIRIT, SPIRIT-AI, CLAIM, DECIDE-AI, SQUIRE 2.0, CLEAR, GRRAS, MI-CLEAR-LLM, SWiM, AMSTAR 2, QUADAS-2, QUADAS-C, RoB 2, ROBINS-I, ROBINS-E, ROBIS, ROB-ME, PROBAST, PROBAST+AI, NOS, COSMIN, RoB NMA. Includes Results/Discussion section boundary checks and machine-readable JSON summary for pipeline integration.
670
697
 
671
698
  ### Publication-Ready Output
672
699
  `analyze-stats` generates reproducible Python/R code for 13 analysis types -- including regression, propensity score, and repeated measures -- with mandatory calibration for prediction models. `make-figures` produces journal-specification figures (300 DPI, colorblind-safe palettes, proper dimensions), visual/graphical abstracts, and a tool selection guide (D2 for flow diagrams, matplotlib for data plots). `--study-type` auto-generates the complete figure set for each study design.
@@ -716,9 +743,33 @@ Prints a checklist showing which components are present, which are missing, and
716
743
 
717
744
  ## Requirements
718
745
 
746
+ **Python 3.9+ and an agent host. That is the whole hard requirement.** Every integrity detector is
747
+ stdlib-only, and so is drafting, reviewing, and auditing a manuscript. If you have no Python, the
748
+ double-click installer will offer to install it for you (`winget` on Windows, or the official
749
+ download page) rather than leaving you at a dead end.
750
+
719
751
  - An [Agent Skills](https://agentskills.io)-compatible host — [Claude Code](https://claude.ai/code) (primary), or Codex / Cursor / GitHub Copilot (see [`docs/host_compatibility.md`](docs/host_compatibility.md); some live-data workflows rely on Claude MCP servers)
720
- - Python 3.9+ (for statistical analysis and figure generation)
721
- - R 4.0+ with `meta` (>=7.0), `metafor` (>=4.0), `mada` (>=0.5.11) packages (for meta-analysis)
752
+ - Python 3.9+ — the floor is CI-enforced (`scripts/check_python_floor.py`). Newer is better; if you are installing Python today, take the latest.
753
+
754
+ Everything else is needed by *some* skills and not others. Rather than a shopping list of packages
755
+ you have never heard of, ask the toolkit what **this** computer can do:
756
+
757
+ ```bash
758
+ python3 installers/doctor.py # what works, what does not, and the exact fix for each
759
+ python3 installers/doctor.py --fix # offers to install what is missing — asking before each one
760
+ ```
761
+ (Or double-click `installers/check-setup-macos.command` / `installers/check-setup-windows.cmd`.)
762
+
763
+ It reports in terms of what you were trying to *do* — "turn your manuscript into a journal-formatted
764
+ Word file" needs **pandoc**; "read and QC submission PDFs" needs **poppler**; "open a .docx at all"
765
+ needs **python-docx** — and installs the small things on request. Large things (a TeX distribution,
766
+ R, PyTorch) are never installed for you: it prints the size and the command and leaves the choice
767
+ alone.
768
+
769
+ **R is not required.** `/analyze-stats` writes Python by default and only emits R if you ask it to;
770
+ the toolkit itself never executes R. Install R (with `meta`, `metafor`, `mada` for meta-analysis)
771
+ only if you want to run the R code it writes for you. The same is true of PyTorch and
772
+ `/model-scaffold`: writing the training code needs nothing; running it needs torch.
722
773
 
723
774
  ## Use Cases
724
775
 
@@ -788,8 +839,32 @@ Or equivalently: `/write-paper --autonomous` if analysis and figures already exi
788
839
 
789
840
  ## Contributing
790
841
 
791
- Contributions are welcome — and most are **one small, self-contained file** that a
792
- template walks you through. You do not need to understand the whole pipeline to add value.
842
+ **If you have already changed something on your own machine, `/contribute` will send it for you.**
843
+ Most people who use this are clinicians, not git users: they add the journal they publish in, fix a
844
+ checklist item that was wrong for their specialty, adapt a skill to their department — and the
845
+ change dies on one laptop.
846
+
847
+ ```
848
+ /contribute
849
+ ```
850
+
851
+ It compares your installed skills against what was shipped, tells you exactly what you changed,
852
+ **scans it for patient data, hospital names, IRB numbers and manuscript IDs** (that scan blocks, and
853
+ it is the reason this is a skill and not a button), shows you every line that would leave your
854
+ machine, and only then opens the pull request — you never type a git command. No GitHub CLI? It
855
+ reaches the project as an issue instead.
856
+
857
+ The same skill files a **false positive** ("this flagged my paper and it was wrong") or a failed
858
+ step. That is not a lesser contribution: it is the only evidence anyone has of how a detector
859
+ behaves on a real manuscript rather than a synthetic fixture.
860
+
861
+ **You will not be nagged.** Reminders are off by default; the installer mentions the option once
862
+ and then never again. `/contribute` only ever runs when you run it.
863
+
864
+ ---
865
+
866
+ Contributions are also welcome the ordinary way — and most are **one small, self-contained file**
867
+ that a template walks you through. You do not need to understand the whole pipeline to add value.
793
868
  Pick a [**good first issue**](https://github.com/Aperivue/medsci-skills/contribute), or start
794
869
  from one of these:
795
870
 
@@ -825,6 +900,24 @@ Community members who have reported, verified, or shaped the project are credite
825
900
 
826
901
  ## In the Wild
827
902
 
903
+ ### Cited in the literature
904
+
905
+ **Chen, Wang & Qu (2026), *Recursive Self-Improvement in AI*** — [arXiv:2607.07663](https://arxiv.org/abs/2607.07663), a
906
+ survey of **1,250 papers** — cites this project's methods paper
907
+ ([arXiv:2606.09500](https://arxiv.org/abs/2606.09500)) twice, as the reference for what fails when an AI
908
+ audits its own scientific output, and names the approach taken here as the response:
909
+
910
+ > "In regulated domains, **deterministic integrity gates are interposed** because 'self-critique
911
+ > inherits the blind spots that produce confident fabrication'."
912
+ > — §6.3 (quoting the methods paper; also cited in §5.3, on the self-confirming loop)
913
+
914
+ That is the argument this repository is built on: a model asked to check its own work inherits the
915
+ blind spots that produced the error, and a script that **recomputes** the number does not.
916
+
917
+ Every citation we know of is logged in [`docs/citations.md`](docs/citations.md).
918
+
919
+ ### Adoption
920
+
828
921
  Adoption is tracked openly in [`IMPACT.md`](IMPACT.md) (stars, forks, traffic,
829
922
  release downloads — snapshotted weekly into [`metrics/traffic_log.csv`](metrics/traffic_log.csv))
830
923
  and academic use is logged in [`docs/citations.md`](docs/citations.md).
@@ -888,6 +981,8 @@ These skills are research productivity tools. They do **not** provide clinical d
888
981
 
889
982
  MIT License. See [LICENSE](LICENSE) for details.
890
983
 
984
+ Some bundled material is **not** ours and is not MIT: the official guideline templates, the CSL citation styles, and a few checklist summaries carry their own terms — including CC BY-NC, which restricts commercial use. Those are indexed in [THIRD-PARTY-NOTICES.md](THIRD-PARTY-NOTICES.md), which ships with every copy and is checked against the tree on every build.
985
+
891
986
  Bundled reporting guideline checklists retain their original Creative Commons licenses. See each checklist file for attribution.
892
987
 
893
988
  Optional dependency: `pdf_to_md.py` uses [pymupdf4llm](https://pymupdf.readthedocs.io) (AGPL-3.0). Not bundled -- installed separately by the user via `pip install pymupdf4llm`.
package/README_FIRST.md CHANGED
@@ -25,3 +25,13 @@ an install log in this folder.
25
25
  4. Paste the same first test prompt above.
26
26
 
27
27
  If macOS blocks the file, right-click it, choose **Open**, and confirm once.
28
+
29
+ ## Licence
30
+
31
+ MedSci Skills is MIT — see `LICENSE`.
32
+
33
+ Some material bundled here is **not** ours and is not MIT. A few reporting-checklist
34
+ summaries carry **CC BY-NC** terms, which permit use and redistribution **with attribution
35
+ for non-commercial purposes only**; commercial use needs permission from the rights holders.
36
+ The full index is in `THIRD-PARTY-NOTICES.md`, next to this file. Read it before using these
37
+ skills in paid or commercial work.
@@ -0,0 +1,65 @@
1
+ # Third-Party Content Licenses
2
+
3
+ Parts of this package are not ours, and are bundled under their own licenses (NOT under MIT).
4
+ This file is the index of them. It is checked against the tree on every build by
5
+ `scripts/check_third_party_index.py` — a notices file that describes a package other than the one
6
+ you downloaded is worse than no notices file at all.
7
+
8
+ ### Reporting guideline checklists — our summaries (`skills/*/references/checklists/*.md`)
9
+
10
+ These are educational summaries written in our own words, each citing its source. They do not
11
+ relicense the underlying guideline.
12
+
13
+ - STROBE: CC BY (https://www.strobe-statement.org)
14
+ - STARD 2015 / STARD-AI: CC BY 4.0 (https://www.equator-network.org/reporting-guidelines/stard/)
15
+ - TRIPOD / TRIPOD+AI: CC BY 4.0 (https://www.tripod-statement.org)
16
+ - PRISMA 2020 / PRISMA-DTA: CC BY (https://www.prisma-statement.org)
17
+ - ARRIVE 2.0: CC0 (https://arriveguidelines.org)
18
+ - CONSORT 2025, SPIRIT 2025: CC BY 4.0 (https://www.consort-spirit.org)
19
+
20
+ **Non-commercial restrictions.** The following summaries derive from instruments whose materials are
21
+ CC BY-NC, and are therefore free to use and redistribute **for non-commercial purposes with
22
+ attribution**; commercial use requires permission from the rights holders:
23
+
24
+ - CARE, MI-CLEAR-LLM, DECIDE-AI: CC BY-NC 4.0
25
+ - CLAIM 2024: educational summary of an RSNA open-access checklist (© RSNA)
26
+
27
+ See `skills/check-reporting/references/LICENSES.md` for the per-file detail.
28
+
29
+ ### Official guideline templates, verbatim (`skills/make-figures/templates/official/`)
30
+
31
+ These are the guideline authors' own documents, redistributed unmodified:
32
+
33
+ - CONSORT 2025 checklist + flow diagram (`.docx`): CC BY 4.0.
34
+ © 2025 Hopewell S et al. *BMJ* 2025;388:e081123. doi:10.1136/bmj-2024-081123
35
+ - SPIRIT 2025 checklist + participant timeline (`.docx`): CC BY 4.0.
36
+ © 2025 Chan A-W et al. *BMJ* 2025;389:e081477. doi:10.1136/bmj-2024-081477
37
+ - STARD 2015 checklist (`.docx`) and flow diagram (`.pdf`): CC BY 4.0.
38
+ Bossuyt PM et al. *BMJ* 2015;351:h5527
39
+ - PRISMA 2020 flow diagrams (`.pptx`): built by us with
40
+ `skills/make-figures/scripts/build_prisma2020_template.py`, reproducing the published layout
41
+ (Page MJ et al. *BMJ* 2021;372:n71, Fig 1, CC BY 4.0)
42
+
43
+ The CONSORT and SPIRIT **2025** updates are CC BY 4.0 — "unrestricted use, distribution, and
44
+ reproduction in any medium, provided the original work is properly cited". Their 2010 / 2013
45
+ predecessors were CC BY-NC / CC BY-NC-ND and could not have been bundled; this file said so for a
46
+ long time after the 2025 versions had replaced them.
47
+
48
+ ### Citation styles (`skills/manage-refs/citation_styles/*.csl`)
49
+
50
+ 15 CSL files from the Citation Style Language project: **CC BY-SA 3.0**, unmodified, each retaining
51
+ its own `<rights>` element. See `skills/manage-refs/NOTICE.md`.
52
+
53
+ ### Not bundled — download these yourself
54
+
55
+ - **European Radiology graphical-abstract template** (`EURA-GA-Jan2025.pptx`):
56
+ https://www.springer.com/journal/330 — the journal's own file, with no license permitting
57
+ redistribution. `/make-figures` accepts it via `--template /absolute/path.pptx`.
58
+
59
+ ## Optional Dependencies
60
+
61
+ The following external packages are NOT bundled but may be installed separately by the user:
62
+
63
+ - pymupdf4llm: AGPL-3.0 or Artifex Commercial License (https://pymupdf.readthedocs.io)
64
+ Used by: fulltext-retrieval/pdf_to_md.py (optional PDF→Markdown conversion)
65
+ Install: pip install pymupdf4llm
@@ -1,4 +1,16 @@
1
1
  #!/usr/bin/env bash
2
+ # MedSci Skills — double-click installer for macOS.
3
+ #
4
+ # The person running this is a clinician who double-clicked a file. Every failure must end in a
5
+ # sentence they can act on — never a Python traceback, and never a silent "done" that installed
6
+ # nothing. Two things had to change for that to be true:
7
+ #
8
+ # * `python` is not necessarily Python 3. Handing the installer to whatever `command -v python`
9
+ # finds could hand it to a Python 2 that dies on the first f-string.
10
+ # * Python 3.8 is worse than Python 2, not better: install.py *parses* there, so instead of a
11
+ # clean "wrong version" it dies halfway through with a wall of traceback.
12
+ #
13
+ # So the interpreter is checked for a real version BEFORE anything runs.
2
14
  set -u
3
15
 
4
16
  cd "$(dirname "$0")/.."
@@ -6,23 +18,82 @@ cd "$(dirname "$0")/.."
6
18
  echo "MedSci Skills Installer for macOS"
7
19
  echo
8
20
 
21
+ MIN_MAJOR=3
22
+ MIN_MINOR=9
23
+
24
+ usable() { # true only if $1 is really Python >= 3.9
25
+ command -v "$1" >/dev/null 2>&1 || return 1
26
+ "$1" -c "import sys; raise SystemExit(0 if sys.version_info >= ($MIN_MAJOR, $MIN_MINOR) else 1)" \
27
+ >/dev/null 2>&1
28
+ }
29
+
9
30
  PY=""
10
- if command -v python3 >/dev/null 2>&1; then
11
- PY=python3
12
- elif command -v python >/dev/null 2>&1; then
13
- PY=python
31
+ for candidate in python3 python; do
32
+ if usable "$candidate"; then
33
+ PY="$candidate"
34
+ break
35
+ fi
36
+ done
37
+
38
+ if [ -z "$PY" ]; then
39
+ # "No Python" and "too old a Python" need different actions, and a clinician cannot be expected
40
+ # to work out which one they have from a version string.
41
+ if command -v python3 >/dev/null 2>&1 || command -v python >/dev/null 2>&1; then
42
+ # No pipe to `head` — an installer must not depend on tools that may not be on PATH in a
43
+ # stripped-down environment. `python --version` prints one line anyway.
44
+ FOUND="$( python3 --version 2>/dev/null || python --version 2>/dev/null )"
45
+ echo "The Python on this Mac is too old for MedSci Skills."
46
+ echo " Found: ${FOUND:-an older version}"
47
+ echo " Needed: Python ${MIN_MAJOR}.${MIN_MINOR} or newer"
48
+ else
49
+ echo "Python was not found on this Mac."
50
+ fi
51
+ echo
52
+ echo "MedSci Skills is written in Python, so Python has to be on the computer first."
53
+ echo "It is free, official, and takes about two minutes."
54
+ echo
55
+ echo " 1. Download the latest Python for macOS (the page opens by itself in a moment)"
56
+ echo " 2. Open the file you downloaded and click through the installer"
57
+ echo " 3. Double-click THIS installer again"
58
+ echo
59
+ echo "Nothing has been changed on your computer."
60
+ echo
61
+
62
+ # Open the page for them. Telling a clinician to "go to python.org" is a step they have to
63
+ # perform; opening it is a step they do not. `open` is standard on macOS, but never let a
64
+ # convenience break the message they still need to read.
65
+ if command -v open >/dev/null 2>&1; then
66
+ read -r -p "Press Enter to open the Python download page..."
67
+ open "https://www.python.org/downloads/" >/dev/null 2>&1 || \
68
+ echo "Could not open the page. It is at: https://www.python.org/downloads/"
69
+ else
70
+ echo "The download page is at: https://www.python.org/downloads/"
71
+ fi
72
+
73
+ echo
74
+ read -r -p "Press Enter to close..."
75
+ exit 1
14
76
  fi
15
77
 
16
- if [ -n "$PY" ]; then
17
- "$PY" installers/install.py --target all --desktop-launcher
18
- # Turn on the in-app "update available" reminder for this turnkey install so you are told when a
19
- # new version is out (no terminal needed afterward). Best-effort; turn off later with
20
- # `install.py --disable-update-notify` or MEDSCI_NO_UPDATE_CHECK=1.
21
- "$PY" installers/install.py --enable-update-notify || true
22
- else
23
- echo "Python was not found."
24
- echo "Install Python 3 from https://www.python.org/downloads/ and run this installer again."
78
+ "$PY" installers/install.py --target all --desktop-launcher
79
+ STATUS=$?
80
+
81
+ if [ "$STATUS" -ne 0 ]; then
82
+ echo
83
+ echo "The installation did not finish (it stopped with error $STATUS)."
84
+ echo "Nothing was left half-installed — the installer undoes its own work if it cannot complete."
85
+ echo
86
+ echo "If you tell us what the message above said, we can fix it:"
87
+ echo " https://github.com/Aperivue/medsci-skills/issues/new"
88
+ echo
89
+ read -r -p "Press Enter to close..."
90
+ exit "$STATUS"
25
91
  fi
26
92
 
93
+ # Turn on the in-app "update available" reminder for this turnkey install, so you are told when a
94
+ # new version ships instead of staying on this one forever. Best-effort: a failure here is not a
95
+ # failed install. Turn it off later with `install.py --disable-update-notify`.
96
+ "$PY" installers/install.py --enable-update-notify >/dev/null 2>&1 || true
97
+
27
98
  echo
28
99
  read -r -p "Press Enter to close..."
@@ -1,30 +1,112 @@
1
1
  @echo off
2
- setlocal
2
+ rem MedSci Skills - double-click installer for Windows.
3
+ rem
4
+ rem Windows is where most of these downloads go, and it has a trap the old script fell into.
5
+ rem
6
+ rem THE MICROSOFT STORE STUB. On a Windows machine with no Python, `python` still EXISTS: it is an
7
+ rem App Execution Alias that opens the Microsoft Store. So `where python` succeeds, errorlevel is
8
+ rem 0, the script cheerfully runs it -- and a Store page opens, nothing is installed, and the
9
+ rem installer reports it is done. The clinician is told everything worked and has nothing.
10
+ rem
11
+ rem A TOO-OLD PYTHON. install.py PARSES on 3.8, so it does not fail cleanly: it dies partway
12
+ rem through with a traceback instead of saying "wrong version".
13
+ rem
14
+ rem So an interpreter is only accepted after it proves, BY RUNNING, that it is Python 3.9 or newer.
15
+ rem Asking `where` only proves a name exists.
16
+ setlocal EnableDelayedExpansion
3
17
  cd /d "%~dp0\.."
4
18
 
5
19
  echo MedSci Skills Installer for Windows
6
20
  echo.
7
21
 
8
- where py >nul 2>nul
9
- if %errorlevel%==0 (
10
- py -3 installers\install.py --target all --desktop-launcher
11
- rem Turn on the in-app "update available" reminder for this turnkey install (disable later with --disable-update-notify).
12
- py -3 installers\install.py --enable-update-notify
13
- goto done
22
+ set "PY="
23
+
24
+ rem The py launcher is the reliable path when it exists.
25
+ py -3 -c "import sys; raise SystemExit(0 if sys.version_info >= (3, 9) else 1)" >nul 2>nul
26
+ if !errorlevel!==0 set "PY=py -3"
27
+
28
+ rem Fall back to `python` -- but only if it actually runs. The Store stub fails this test, which is
29
+ rem the entire reason for testing instead of asking `where`.
30
+ if not defined PY (
31
+ python -c "import sys; raise SystemExit(0 if sys.version_info >= (3, 9) else 1)" >nul 2>nul
32
+ if !errorlevel!==0 set "PY=python"
14
33
  )
15
34
 
16
- where python >nul 2>nul
17
- if %errorlevel%==0 (
18
- python installers\install.py --target all --desktop-launcher
19
- rem Turn on the in-app "update available" reminder for this turnkey install (disable later with --disable-update-notify).
20
- python installers\install.py --enable-update-notify
21
- goto done
35
+ if not defined PY (
36
+ echo Python 3.9 or newer was not found on this computer.
37
+ echo.
38
+ echo MedSci Skills is written in Python, so Python has to be installed first.
39
+ echo It is free, official, and takes a couple of minutes.
40
+ echo.
41
+
42
+ rem winget ships with Windows 10 ^(1809+^) and Windows 11, so on most hospital machines Python can
43
+ rem simply be installed for the user -- no admin rights, no download page, no PATH checkbox to
44
+ rem miss. We ASK first: installing software on someone's computer without asking is not ours to do.
45
+ where winget >nul 2>nul
46
+ if !errorlevel!==0 (
47
+ echo This installer can install Python for you now, from the official Python
48
+ echo repository, into your own user account ^(no administrator password needed^).
49
+ echo.
50
+ set /p "DOIT=Install Python now? [Y/N] "
51
+ if /i "!DOIT!"=="Y" (
52
+ echo.
53
+ echo Installing Python. This takes a couple of minutes...
54
+ echo.
55
+ winget install --exact --id Python.Python.3.13 --scope user ^
56
+ --accept-source-agreements --accept-package-agreements
57
+ echo.
58
+ if !errorlevel!==0 (
59
+ echo Python is installed.
60
+ echo.
61
+ echo Windows only notices a new program in NEW windows, so this one cannot use it yet:
62
+ echo.
63
+ echo ^>^> Close this window and double-click the installer again. ^<^<
64
+ echo.
65
+ echo Nothing else has been changed on your computer.
66
+ echo.
67
+ pause
68
+ exit /b 1
69
+ )
70
+ echo Python could not be installed automatically ^(error !errorlevel!^).
71
+ echo Use the download page instead - it is opening now.
72
+ echo.
73
+ )
74
+ )
75
+
76
+ echo 1. Download the latest Python for Windows ^(the page opens by itself in a moment^)
77
+ echo 2. Run the file you downloaded.
78
+ echo IMPORTANT: on the FIRST screen, tick the box "Add python.exe to PATH"
79
+ echo before pressing Install. It is easy to miss, and nothing works without it.
80
+ echo 3. Double-click THIS installer again.
81
+ echo.
82
+ echo If a Microsoft Store page opened when you tried Python before, that page is a
83
+ echo placeholder, not Python. Use python.org instead.
84
+ echo.
85
+ echo Nothing has been changed on your computer.
86
+ echo.
87
+ start "" "https://www.python.org/downloads/"
88
+ pause
89
+ exit /b 1
22
90
  )
23
91
 
24
- echo Python was not found.
25
- echo Please install Python 3 from https://www.python.org/downloads/ and run this installer again.
26
- echo.
92
+ %PY% installers\install.py --target all --desktop-launcher
93
+ if not !errorlevel!==0 (
94
+ set "RC=!errorlevel!"
95
+ echo.
96
+ echo The installation did not finish ^(it stopped with error !RC!^).
97
+ echo Nothing was left half-installed - the installer undoes its own work if it cannot complete.
98
+ echo.
99
+ echo If you tell us what the message above said, we can fix it:
100
+ echo https://github.com/Aperivue/medsci-skills/issues/new
101
+ echo.
102
+ pause
103
+ exit /b !RC!
104
+ )
105
+
106
+ rem Turn on the in-app "update available" reminder for this turnkey install, so you are told when a
107
+ rem new version ships instead of staying on this one forever. Best-effort: a failure here is not a
108
+ rem failed install.
109
+ %PY% installers\install.py --enable-update-notify >nul 2>nul
27
110
 
28
- :done
29
111
  echo.
30
112
  pause