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.
Files changed (702) hide show
  1. package/LICENSE +50 -0
  2. package/README.md +602 -0
  3. package/README_FIRST.md +27 -0
  4. package/bin/medsci-skills.js +159 -0
  5. package/installers/install-macos.command +19 -0
  6. package/installers/install-windows.cmd +26 -0
  7. package/installers/install-windows.ps1 +17 -0
  8. package/installers/install.py +218 -0
  9. package/metadata/skills_catalog.json +452 -0
  10. package/package.json +48 -0
  11. package/skills/academic-aio/SKILL.md +408 -0
  12. package/skills/academic-aio/references/case_studies/kjr_mllm_2025.md +82 -0
  13. package/skills/academic-aio/references/checklists/AIO_GENERAL.md +354 -0
  14. package/skills/academic-aio/references/journal_summarybox_templates.yaml +126 -0
  15. package/skills/academic-aio/references/oac_funding_checklist.yaml +129 -0
  16. package/skills/academic-aio/references/reporting_guideline_mapping.md +39 -0
  17. package/skills/academic-aio/references/schema_markup_templates/CodeRepository.jsonld +32 -0
  18. package/skills/academic-aio/references/schema_markup_templates/Dataset.jsonld +36 -0
  19. package/skills/academic-aio/references/schema_markup_templates/Person.jsonld +30 -0
  20. package/skills/academic-aio/references/schema_markup_templates/README.md +43 -0
  21. package/skills/academic-aio/references/schema_markup_templates/ScholarlyArticle.jsonld +55 -0
  22. package/skills/academic-aio/scripts/batch_metadata_audit.py +169 -0
  23. package/skills/academic-aio/scripts/validate_schema.py +118 -0
  24. package/skills/academic-aio/skill.yml +36 -0
  25. package/skills/academic-aio/templates/aio_audit_checklist.md.j2 +108 -0
  26. package/skills/add-journal/SKILL.md +482 -0
  27. package/skills/add-journal/skill.yml +33 -0
  28. package/skills/analyze-stats/SKILL.md +598 -0
  29. package/skills/analyze-stats/references/analysis_guides/missing_data.md +109 -0
  30. package/skills/analyze-stats/references/analysis_guides/nhis_icd10_mapping.md +247 -0
  31. package/skills/analyze-stats/references/analysis_guides/propensity_score.md +132 -0
  32. package/skills/analyze-stats/references/analysis_guides/regression.md +115 -0
  33. package/skills/analyze-stats/references/analysis_guides/repeated_measures.md +160 -0
  34. package/skills/analyze-stats/references/analysis_guides/survey_weighted.md +366 -0
  35. package/skills/analyze-stats/references/analysis_guides/test_selection.md +86 -0
  36. package/skills/analyze-stats/references/style/figure_style.mplstyle +69 -0
  37. package/skills/analyze-stats/references/style/theme_publication.R +147 -0
  38. package/skills/analyze-stats/references/table-standards/journal-profiles/ajr.yaml +51 -0
  39. package/skills/analyze-stats/references/table-standards/journal-profiles/european_radiology.yaml +55 -0
  40. package/skills/analyze-stats/references/table-standards/journal-profiles/jama.yaml +66 -0
  41. package/skills/analyze-stats/references/table-standards/journal-profiles/lancet.yaml +57 -0
  42. package/skills/analyze-stats/references/table-standards/journal-profiles/nejm.yaml +51 -0
  43. package/skills/analyze-stats/references/table-standards/journal-profiles/radiology.yaml +66 -0
  44. package/skills/analyze-stats/references/table-standards/table-standards.md +287 -0
  45. package/skills/analyze-stats/references/table-standards/table-types/diagnostic_accuracy.md +36 -0
  46. package/skills/analyze-stats/references/table-standards/table-types/meta_analysis.md +58 -0
  47. package/skills/analyze-stats/references/table-standards/table-types/model_comparison.md +36 -0
  48. package/skills/analyze-stats/references/table-standards/table-types/regression_results.md +50 -0
  49. package/skills/analyze-stats/references/table-standards/table-types/table1_demographics.md +51 -0
  50. package/skills/analyze-stats/references/table-standards/tool-comparison.md +79 -0
  51. package/skills/analyze-stats/references/templates/agreement_analysis.py +436 -0
  52. package/skills/analyze-stats/references/templates/dca_plot.R +237 -0
  53. package/skills/analyze-stats/references/templates/diagnostic_accuracy.py +401 -0
  54. package/skills/analyze-stats/references/templates/dta_meta_analysis.R +384 -0
  55. package/skills/analyze-stats/references/templates/forest_plot.py +412 -0
  56. package/skills/analyze-stats/references/templates/likert_summary.py +356 -0
  57. package/skills/analyze-stats/references/templates/meta_analysis.R +365 -0
  58. package/skills/analyze-stats/references/templates/propensity_score.py +478 -0
  59. package/skills/analyze-stats/references/templates/regression.py +425 -0
  60. package/skills/analyze-stats/references/templates/repeated_measures.py +434 -0
  61. package/skills/analyze-stats/references/templates/sample_size.R +382 -0
  62. package/skills/analyze-stats/references/templates/survey_weighted_analysis.py +411 -0
  63. package/skills/analyze-stats/references/templates/survival_analysis.py +325 -0
  64. package/skills/analyze-stats/references/templates/table1_demographics.py +287 -0
  65. package/skills/analyze-stats/scripts/check_generated_code.py +335 -0
  66. package/skills/analyze-stats/skill.yml +38 -0
  67. package/skills/analyze-stats/tests/fixtures/gen_bad.R +16 -0
  68. package/skills/analyze-stats/tests/fixtures/gen_bad.py +24 -0
  69. package/skills/analyze-stats/tests/fixtures/gen_clean.py +21 -0
  70. package/skills/analyze-stats/tests/test_generated_code.sh +59 -0
  71. package/skills/analyze-stats/tests/test_survival_template.sh +53 -0
  72. package/skills/author-strategy/SKILL.md +117 -0
  73. package/skills/author-strategy/analyze_patterns.py +303 -0
  74. package/skills/author-strategy/fetch_pubmed.py +374 -0
  75. package/skills/author-strategy/skill.yml +34 -0
  76. package/skills/batch-cohort/SKILL.md +223 -0
  77. package/skills/batch-cohort/references/base_template_knhanes.R +210 -0
  78. package/skills/batch-cohort/references/batch_template_generator.R +222 -0
  79. package/skills/batch-cohort/references/variable_coding_registry.md +136 -0
  80. package/skills/batch-cohort/skill.yml +35 -0
  81. package/skills/calc-sample-size/SKILL.md +491 -0
  82. package/skills/calc-sample-size/references/formulas.md +655 -0
  83. package/skills/calc-sample-size/references/observational_cohort.md +49 -0
  84. package/skills/calc-sample-size/skill.yml +51 -0
  85. package/skills/check-reporting/SKILL.md +534 -0
  86. package/skills/check-reporting/references/LICENSES.md +41 -0
  87. package/skills/check-reporting/references/checklists/AMSTAR2.md +54 -0
  88. package/skills/check-reporting/references/checklists/ARRIVE_2.md +234 -0
  89. package/skills/check-reporting/references/checklists/CARE.md +102 -0
  90. package/skills/check-reporting/references/checklists/CLAIM_2024.md +128 -0
  91. package/skills/check-reporting/references/checklists/CLEAR.md +113 -0
  92. package/skills/check-reporting/references/checklists/CONSORT.md +86 -0
  93. package/skills/check-reporting/references/checklists/COSMIN_RoB.md +136 -0
  94. package/skills/check-reporting/references/checklists/GRRAS.md +61 -0
  95. package/skills/check-reporting/references/checklists/MI_CLEAR_LLM.md +167 -0
  96. package/skills/check-reporting/references/checklists/MOOSE.md +85 -0
  97. package/skills/check-reporting/references/checklists/NOS.md +88 -0
  98. package/skills/check-reporting/references/checklists/PRISMA_2020.md +135 -0
  99. package/skills/check-reporting/references/checklists/PRISMA_DTA.md +36 -0
  100. package/skills/check-reporting/references/checklists/PRISMA_P.md +56 -0
  101. package/skills/check-reporting/references/checklists/PROBAST.md +75 -0
  102. package/skills/check-reporting/references/checklists/PROBAST_AI.md +130 -0
  103. package/skills/check-reporting/references/checklists/QUADAS2.md +77 -0
  104. package/skills/check-reporting/references/checklists/QUADAS_C.md +131 -0
  105. package/skills/check-reporting/references/checklists/ROBINS_E.md +179 -0
  106. package/skills/check-reporting/references/checklists/ROBINS_I.md +87 -0
  107. package/skills/check-reporting/references/checklists/ROBIS.md +114 -0
  108. package/skills/check-reporting/references/checklists/ROB_ME.md +126 -0
  109. package/skills/check-reporting/references/checklists/RoB2.md +79 -0
  110. package/skills/check-reporting/references/checklists/RoB_NMA.md +96 -0
  111. package/skills/check-reporting/references/checklists/SPIRIT.md +112 -0
  112. package/skills/check-reporting/references/checklists/SQUIRE_2.md +68 -0
  113. package/skills/check-reporting/references/checklists/STARD.md +129 -0
  114. package/skills/check-reporting/references/checklists/STARD_AI.md +211 -0
  115. package/skills/check-reporting/references/checklists/STROBE.md +80 -0
  116. package/skills/check-reporting/references/checklists/SWiM.md +33 -0
  117. package/skills/check-reporting/references/checklists/TRIPOD.md +157 -0
  118. package/skills/check-reporting/references/checklists/TRIPOD_AI.md +140 -0
  119. package/skills/check-reporting/references/step4c_registration_timing.md +93 -0
  120. package/skills/check-reporting/references/step4d_prisma_figure_audit.md +137 -0
  121. package/skills/check-reporting/scripts/check_checklist_exists.py +183 -0
  122. package/skills/check-reporting/scripts/check_checklist_version.py +168 -0
  123. package/skills/check-reporting/scripts/check_framework_naming.py +206 -0
  124. package/skills/check-reporting/scripts/check_prisma_figure.py +209 -0
  125. package/skills/check-reporting/scripts/prisma_cascade_check.py +274 -0
  126. package/skills/check-reporting/skill.yml +41 -0
  127. package/skills/check-reporting/tests/fixtures/framework_bad.md +8 -0
  128. package/skills/check-reporting/tests/fixtures/framework_clean.md +7 -0
  129. package/skills/check-reporting/tests/test_checklist_fail_fast.sh +77 -0
  130. package/skills/check-reporting/tests/test_checklist_version.sh +72 -0
  131. package/skills/check-reporting/tests/test_framework_naming.sh +45 -0
  132. package/skills/check-reporting/tests/test_prisma_cascade.sh +104 -0
  133. package/skills/clean-data/SKILL.md +180 -0
  134. package/skills/clean-data/references/cleaning_patterns.md +299 -0
  135. package/skills/clean-data/references/profiling_template.py +304 -0
  136. package/skills/clean-data/scripts/check_structural_zero.py +174 -0
  137. package/skills/clean-data/skill.yml +35 -0
  138. package/skills/clean-data/tests/fixtures/smoking.csv +8 -0
  139. package/skills/clean-data/tests/test_structural_zero.sh +49 -0
  140. package/skills/cross-national/SKILL.md +264 -0
  141. package/skills/cross-national/skill.yml +37 -0
  142. package/skills/define-variables/SKILL.md +146 -0
  143. package/skills/define-variables/references/common_definitions.md +190 -0
  144. package/skills/define-variables/skill.yml +34 -0
  145. package/skills/define-variables/templates/variable_operationalization.md +64 -0
  146. package/skills/deidentify/SKILL.md +203 -0
  147. package/skills/deidentify/deidentify.py +1224 -0
  148. package/skills/deidentify/locales/_template.json +45 -0
  149. package/skills/deidentify/locales/au.json +43 -0
  150. package/skills/deidentify/locales/ca.json +44 -0
  151. package/skills/deidentify/locales/cn.json +47 -0
  152. package/skills/deidentify/locales/de.json +48 -0
  153. package/skills/deidentify/locales/fr.json +48 -0
  154. package/skills/deidentify/locales/in.json +48 -0
  155. package/skills/deidentify/locales/jp.json +48 -0
  156. package/skills/deidentify/locales/kr.json +48 -0
  157. package/skills/deidentify/locales/uk.json +45 -0
  158. package/skills/deidentify/locales/us.json +43 -0
  159. package/skills/deidentify/references/date_shift_guide.md +82 -0
  160. package/skills/deidentify/references/hipaa_18_identifiers.md +48 -0
  161. package/skills/deidentify/references/korean_phi_patterns.md +135 -0
  162. package/skills/deidentify/skill.yml +43 -0
  163. package/skills/deidentify/tests/README.md +26 -0
  164. package/skills/deidentify/tests/test_clean.csv +16 -0
  165. package/skills/deidentify/tests/test_edge_cases.csv +11 -0
  166. package/skills/deidentify/tests/test_phi_korean.csv +11 -0
  167. package/skills/design-ai-benchmarking/SKILL.md +214 -0
  168. package/skills/design-ai-benchmarking/references/benchmark_export_schema.json +69 -0
  169. package/skills/design-ai-benchmarking/references/elicitation_rubric_template.md +37 -0
  170. package/skills/design-ai-benchmarking/skill.yml +38 -0
  171. package/skills/design-study/SKILL.md +298 -0
  172. package/skills/design-study/skill.yml +33 -0
  173. package/skills/fill-icmje-coi/SKILL.md +216 -0
  174. package/skills/fill-icmje-coi/scripts/fill_icmje_coi.py +140 -0
  175. package/skills/fill-icmje-coi/skill.yml +35 -0
  176. package/skills/fill-icmje-coi/templates/icmje_coi_seed_synthetic.docx +0 -0
  177. package/skills/fill-protocol/SKILL.md +248 -0
  178. package/skills/fill-protocol/examples/example_irb_template.yaml +53 -0
  179. package/skills/fill-protocol/references/best_practices.md +121 -0
  180. package/skills/fill-protocol/scripts/doc_to_docx.py +111 -0
  181. package/skills/fill-protocol/scripts/fill_form.py +611 -0
  182. package/skills/fill-protocol/scripts/inspect_template.py +61 -0
  183. package/skills/fill-protocol/setup.sh +162 -0
  184. package/skills/fill-protocol/skill.yml +37 -0
  185. package/skills/find-cohort-gap/SKILL.md +309 -0
  186. package/skills/find-cohort-gap/references/cohort_profile_template.md +93 -0
  187. package/skills/find-cohort-gap/references/onepager_template.md +84 -0
  188. package/skills/find-cohort-gap/references/pattern_scoring_rubric.md +169 -0
  189. package/skills/find-cohort-gap/references/saturation_query_templates.md +143 -0
  190. package/skills/find-cohort-gap/skill.yml +35 -0
  191. package/skills/find-journal/POLICY.md +87 -0
  192. package/skills/find-journal/SKILL.md +340 -0
  193. package/skills/find-journal/references/journal_profiles/AJNR.md +29 -0
  194. package/skills/find-journal/references/journal_profiles/AJR.md +30 -0
  195. package/skills/find-journal/references/journal_profiles/Abdominal_Radiology.md +30 -0
  196. package/skills/find-journal/references/journal_profiles/Academic_Radiology.md +30 -0
  197. package/skills/find-journal/references/journal_profiles/Annals_of_Internal_Medicine.md +33 -0
  198. package/skills/find-journal/references/journal_profiles/Artificial_Intelligence_in_Medicine.md +28 -0
  199. package/skills/find-journal/references/journal_profiles/BMC_Medicine.md +31 -0
  200. package/skills/find-journal/references/journal_profiles/British_Journal_of_Radiology.md +39 -0
  201. package/skills/find-journal/references/journal_profiles/CVIR.md +30 -0
  202. package/skills/find-journal/references/journal_profiles/Chest.md +39 -0
  203. package/skills/find-journal/references/journal_profiles/Clinical_Radiology.md +30 -0
  204. package/skills/find-journal/references/journal_profiles/Clinical_and_Molecular_Hepatology.md +32 -0
  205. package/skills/find-journal/references/journal_profiles/Diabetes_Metabolism_Journal.md +36 -0
  206. package/skills/find-journal/references/journal_profiles/Diagnostic_and_Interventional_Radiology.md +32 -0
  207. package/skills/find-journal/references/journal_profiles/Endocrinology_and_Metabolism.md +37 -0
  208. package/skills/find-journal/references/journal_profiles/European_Journal_of_Preventive_Cardiology.md +39 -0
  209. package/skills/find-journal/references/journal_profiles/European_Radiology.md +29 -0
  210. package/skills/find-journal/references/journal_profiles/Hepatology_Communications.md +40 -0
  211. package/skills/find-journal/references/journal_profiles/Hepatology_International.md +37 -0
  212. package/skills/find-journal/references/journal_profiles/IEEE_JBHI.md +28 -0
  213. package/skills/find-journal/references/journal_profiles/IEEE_TMI.md +28 -0
  214. package/skills/find-journal/references/journal_profiles/INSI.md +29 -0
  215. package/skills/find-journal/references/journal_profiles/Investigative_Radiology.md +25 -0
  216. package/skills/find-journal/references/journal_profiles/JACC_Advances.md +41 -0
  217. package/skills/find-journal/references/journal_profiles/JACC_Asia.md +30 -0
  218. package/skills/find-journal/references/journal_profiles/JACR.md +28 -0
  219. package/skills/find-journal/references/journal_profiles/JAMA.md +40 -0
  220. package/skills/find-journal/references/journal_profiles/JAMA_Network_Open.md +30 -0
  221. package/skills/find-journal/references/journal_profiles/JCSM.md +39 -0
  222. package/skills/find-journal/references/journal_profiles/JKMS.md +32 -0
  223. package/skills/find-journal/references/journal_profiles/JMIR.md +29 -0
  224. package/skills/find-journal/references/journal_profiles/JMIR_Medical_Education.md +29 -0
  225. package/skills/find-journal/references/journal_profiles/JNIS.md +35 -0
  226. package/skills/find-journal/references/journal_profiles/JVIR.md +31 -0
  227. package/skills/find-journal/references/journal_profiles/Journal_of_Biomedical_Informatics.md +29 -0
  228. package/skills/find-journal/references/journal_profiles/Journal_of_Clinical_Endocrinology_and_Metabolism.md +40 -0
  229. package/skills/find-journal/references/journal_profiles/Journal_of_Magnetic_Resonance_Imaging.md +30 -0
  230. package/skills/find-journal/references/journal_profiles/Journal_of_Nuclear_Medicine.md +31 -0
  231. package/skills/find-journal/references/journal_profiles/Journal_of_Stroke.md +32 -0
  232. package/skills/find-journal/references/journal_profiles/KJR.md +38 -0
  233. package/skills/find-journal/references/journal_profiles/Korean_Circulation_Journal.md +38 -0
  234. package/skills/find-journal/references/journal_profiles/Korean_Journal_of_Internal_Medicine.md +36 -0
  235. package/skills/find-journal/references/journal_profiles/Lancet_Diabetes_and_Endocrinology.md +40 -0
  236. package/skills/find-journal/references/journal_profiles/Lancet_Gastroenterology_and_Hepatology.md +49 -0
  237. package/skills/find-journal/references/journal_profiles/Lancet_Infectious_Diseases.md +38 -0
  238. package/skills/find-journal/references/journal_profiles/Lancet_Neurology.md +39 -0
  239. package/skills/find-journal/references/journal_profiles/Lancet_Oncology.md +40 -0
  240. package/skills/find-journal/references/journal_profiles/Lancet_Psychiatry.md +38 -0
  241. package/skills/find-journal/references/journal_profiles/Lancet_Public_Health.md +30 -0
  242. package/skills/find-journal/references/journal_profiles/Lancet_Respiratory_Medicine.md +39 -0
  243. package/skills/find-journal/references/journal_profiles/Liver_International.md +33 -0
  244. package/skills/find-journal/references/journal_profiles/Medical_Image_Analysis.md +28 -0
  245. package/skills/find-journal/references/journal_profiles/NEJM.md +33 -0
  246. package/skills/find-journal/references/journal_profiles/Nature_Machine_Intelligence.md +31 -0
  247. package/skills/find-journal/references/journal_profiles/Nature_Medicine.md +39 -0
  248. package/skills/find-journal/references/journal_profiles/Neuroradiology.md +31 -0
  249. package/skills/find-journal/references/journal_profiles/Nutrition_Metabolism_and_Cardiovascular_Diseases.md +39 -0
  250. package/skills/find-journal/references/journal_profiles/PLOS_Medicine.md +32 -0
  251. package/skills/find-journal/references/journal_profiles/RYAI.md +28 -0
  252. package/skills/find-journal/references/journal_profiles/Radiology.md +29 -0
  253. package/skills/find-journal/references/journal_profiles/Skeletal_Radiology.md +31 -0
  254. package/skills/find-journal/references/journal_profiles/Stroke.md +37 -0
  255. package/skills/find-journal/references/journal_profiles/The_BMJ.md +31 -0
  256. package/skills/find-journal/references/journal_profiles/The_Lancet.md +31 -0
  257. package/skills/find-journal/references/journal_profiles/The_Lancet_Digital_Health.md +29 -0
  258. package/skills/find-journal/references/journal_profiles/World_Journal_of_Hepatology.md +53 -0
  259. package/skills/find-journal/references/journal_profiles/npj_Digital_Medicine.md +29 -0
  260. package/skills/find-journal/skill.yml +34 -0
  261. package/skills/fulltext-retrieval/SKILL.md +174 -0
  262. package/skills/fulltext-retrieval/fetch_oa.py +433 -0
  263. package/skills/fulltext-retrieval/pdf_to_md.py +160 -0
  264. package/skills/fulltext-retrieval/skill.yml +41 -0
  265. package/skills/generate-codebook/SKILL.md +155 -0
  266. package/skills/generate-codebook/references/codebook_schema.md +76 -0
  267. package/skills/generate-codebook/scripts/generate_codebook.py +278 -0
  268. package/skills/generate-codebook/skill.yml +35 -0
  269. package/skills/generate-codebook/tests/test_generate_codebook.sh +76 -0
  270. package/skills/grant-builder/SKILL.md +251 -0
  271. package/skills/grant-builder/skill.yml +34 -0
  272. package/skills/humanize/SKILL.md +251 -0
  273. package/skills/humanize/references/ai_patterns.md +571 -0
  274. package/skills/humanize/skill.yml +33 -0
  275. package/skills/intake-project/SKILL.md +264 -0
  276. package/skills/intake-project/skill.yml +34 -0
  277. package/skills/lit-sync/SKILL.md +448 -0
  278. package/skills/lit-sync/references/locale/ko/note_templates.md +110 -0
  279. package/skills/lit-sync/skill.yml +52 -0
  280. package/skills/lit-sync/tests/test_poll_logic.sh +92 -0
  281. package/skills/ma-scout/SKILL.md +640 -0
  282. package/skills/ma-scout/references/project_readme_template.md +95 -0
  283. package/skills/ma-scout/references/project_readme_template_ko.md +82 -0
  284. package/skills/ma-scout/skill.yml +33 -0
  285. package/skills/make-figures/SKILL.md +957 -0
  286. package/skills/make-figures/references/critic_rubrics/data_plot.md +166 -0
  287. package/skills/make-figures/references/critic_rubrics/flow_diagram.md +169 -0
  288. package/skills/make-figures/references/design_principles.md +181 -0
  289. package/skills/make-figures/references/exemplar_diagrams/README.md +65 -0
  290. package/skills/make-figures/references/exemplar_diagrams/consort/README.md +15 -0
  291. package/skills/make-figures/references/exemplar_diagrams/consort/template_input.yaml +37 -0
  292. package/skills/make-figures/references/exemplar_diagrams/consort/template_output.pdf +0 -0
  293. package/skills/make-figures/references/exemplar_diagrams/consort/template_output.png +0 -0
  294. package/skills/make-figures/references/exemplar_diagrams/consort/template_output_600.png +0 -0
  295. package/skills/make-figures/references/exemplar_diagrams/other/other_02.meta.yaml +4 -0
  296. package/skills/make-figures/references/exemplar_diagrams/other/other_02.png +0 -0
  297. package/skills/make-figures/references/exemplar_diagrams/other/other_02_why.md +13 -0
  298. package/skills/make-figures/references/exemplar_diagrams/pipeline/README.md +15 -0
  299. package/skills/make-figures/references/exemplar_diagrams/pipeline/pipeline_01.meta.yaml +4 -0
  300. package/skills/make-figures/references/exemplar_diagrams/pipeline/pipeline_01.png +0 -0
  301. package/skills/make-figures/references/exemplar_diagrams/pipeline/pipeline_01_why.md +13 -0
  302. package/skills/make-figures/references/exemplar_diagrams/pipeline/pipeline_03.meta.yaml +4 -0
  303. package/skills/make-figures/references/exemplar_diagrams/pipeline/pipeline_03.png +0 -0
  304. package/skills/make-figures/references/exemplar_diagrams/pipeline/pipeline_03_why.md +13 -0
  305. package/skills/make-figures/references/exemplar_diagrams/pipeline/pipeline_04.meta.yaml +4 -0
  306. package/skills/make-figures/references/exemplar_diagrams/pipeline/pipeline_04.png +0 -0
  307. package/skills/make-figures/references/exemplar_diagrams/pipeline/pipeline_04_why.md +13 -0
  308. package/skills/make-figures/references/exemplar_diagrams/pipeline/pipeline_05.meta.yaml +4 -0
  309. package/skills/make-figures/references/exemplar_diagrams/pipeline/pipeline_05.png +0 -0
  310. package/skills/make-figures/references/exemplar_diagrams/pipeline/pipeline_05_why.md +13 -0
  311. package/skills/make-figures/references/exemplar_diagrams/pipeline/pipeline_06.meta.yaml +4 -0
  312. package/skills/make-figures/references/exemplar_diagrams/pipeline/pipeline_06.png +0 -0
  313. package/skills/make-figures/references/exemplar_diagrams/pipeline/pipeline_06_why.md +13 -0
  314. package/skills/make-figures/references/exemplar_diagrams/pipeline/pipeline_07.meta.yaml +4 -0
  315. package/skills/make-figures/references/exemplar_diagrams/pipeline/pipeline_07.png +0 -0
  316. package/skills/make-figures/references/exemplar_diagrams/pipeline/pipeline_07_why.md +13 -0
  317. package/skills/make-figures/references/exemplar_diagrams/pipeline/pipeline_08.meta.yaml +4 -0
  318. package/skills/make-figures/references/exemplar_diagrams/pipeline/pipeline_08.png +0 -0
  319. package/skills/make-figures/references/exemplar_diagrams/pipeline/pipeline_08_why.md +13 -0
  320. package/skills/make-figures/references/exemplar_diagrams/pipeline/pipeline_09.meta.yaml +4 -0
  321. package/skills/make-figures/references/exemplar_diagrams/pipeline/pipeline_09.png +0 -0
  322. package/skills/make-figures/references/exemplar_diagrams/pipeline/pipeline_09_why.md +13 -0
  323. package/skills/make-figures/references/exemplar_diagrams/pipeline/pipeline_10.meta.yaml +4 -0
  324. package/skills/make-figures/references/exemplar_diagrams/pipeline/pipeline_10.png +0 -0
  325. package/skills/make-figures/references/exemplar_diagrams/pipeline/pipeline_10_why.md +13 -0
  326. package/skills/make-figures/references/exemplar_diagrams/prisma/README.md +15 -0
  327. package/skills/make-figures/references/exemplar_diagrams/prisma/template_input.yaml +47 -0
  328. package/skills/make-figures/references/exemplar_diagrams/prisma/template_output.pdf +0 -0
  329. package/skills/make-figures/references/exemplar_diagrams/prisma/template_output.png +0 -0
  330. package/skills/make-figures/references/exemplar_diagrams/prisma/template_output_600.png +0 -0
  331. package/skills/make-figures/references/exemplar_diagrams/stard/README.md +15 -0
  332. package/skills/make-figures/references/exemplar_diagrams/stard/template_input.yaml +40 -0
  333. package/skills/make-figures/references/exemplar_diagrams/stard/template_output.pdf +0 -0
  334. package/skills/make-figures/references/exemplar_diagrams/stard/template_output.png +0 -0
  335. package/skills/make-figures/references/exemplar_diagrams/stard/template_output_600.png +0 -0
  336. package/skills/make-figures/references/exemplar_diagrams/strobe/template_input.yaml +43 -0
  337. package/skills/make-figures/references/exemplar_diagrams/strobe/template_input_pptx.yaml +43 -0
  338. package/skills/make-figures/references/exemplar_diagrams/strobe/template_output.pdf +0 -0
  339. package/skills/make-figures/references/exemplar_diagrams/strobe/template_output.png +0 -0
  340. package/skills/make-figures/references/exemplar_diagrams/strobe/template_output.pptx +0 -0
  341. package/skills/make-figures/references/exemplar_diagrams/strobe/template_output_600.png +0 -0
  342. package/skills/make-figures/references/figure_specs.md +291 -0
  343. package/skills/make-figures/references/flow_diagram_lessons.md +164 -0
  344. package/skills/make-figures/references/jacc_central_illustration_principles.md +91 -0
  345. package/skills/make-figures/references/medical_illustration_sources.md +98 -0
  346. package/skills/make-figures/references/pipeline_concepts_medical_ai.md +240 -0
  347. package/skills/make-figures/references/reporting_guideline_figure_map.md +104 -0
  348. package/skills/make-figures/references/visual_abstract_templates/european_radiology.pptx +0 -0
  349. package/skills/make-figures/references/visual_abstract_templates/jacc_central_illustration.pptx +0 -0
  350. package/skills/make-figures/references/visual_abstract_templates/medsci_default.pptx +0 -0
  351. package/skills/make-figures/references/visual_abstract_templates/template_guide.md +114 -0
  352. package/skills/make-figures/scripts/build_jacc_template.py +77 -0
  353. package/skills/make-figures/scripts/build_prisma2020_template.py +371 -0
  354. package/skills/make-figures/scripts/build_strobe_template.py +351 -0
  355. package/skills/make-figures/scripts/critic_figure.py +264 -0
  356. package/skills/make-figures/scripts/derive_figure_legend_counts.py +138 -0
  357. package/skills/make-figures/scripts/extract_exemplar_from_pdf.py +186 -0
  358. package/skills/make-figures/scripts/fetch_official_templates.sh +88 -0
  359. package/skills/make-figures/scripts/fill_prisma_template.py +142 -0
  360. package/skills/make-figures/scripts/generate_flow_diagram.R +133 -0
  361. package/skills/make-figures/scripts/generate_image.py +99 -0
  362. package/skills/make-figures/scripts/generate_visual_abstract.py +438 -0
  363. package/skills/make-figures/scripts/validate_pptx_mac_compat.py +233 -0
  364. package/skills/make-figures/skill.yml +52 -0
  365. package/skills/make-figures/templates/official/NOTES.md +62 -0
  366. package/skills/make-figures/templates/official/consort2010/CONSORT_2025_editable_checklist.docx +0 -0
  367. package/skills/make-figures/templates/official/consort2010/CONSORT_2025_flow_diagram.docx +0 -0
  368. package/skills/make-figures/templates/official/prisma2020/PRISMA_2020_flow_new_v1.pptx +0 -0
  369. package/skills/make-figures/templates/official/prisma2020/PRISMA_2020_flow_new_v2.pptx +0 -0
  370. package/skills/make-figures/templates/official/prisma2020/PRISMA_2020_flow_updated_v2.pptx +0 -0
  371. package/skills/make-figures/templates/official/spirit2013/SPIRIT_2025_editable_checklist.docx +0 -0
  372. package/skills/make-figures/templates/official/spirit2013/SPIRIT_2025_participant_timeline.docx +0 -0
  373. package/skills/make-figures/templates/official/stard2015/STARD_2015_checklist.docx +0 -0
  374. package/skills/make-figures/templates/official/stard2015/STARD_2015_flow_diagram.pdf +0 -0
  375. package/skills/make-figures/tests/fixtures/figure1_flow.yaml +8 -0
  376. package/skills/make-figures/tests/fixtures/manuscript_ok.md +9 -0
  377. package/skills/make-figures/tests/fixtures/manuscript_stale.md +4 -0
  378. package/skills/make-figures/tests/test_legend_reconcile.sh +36 -0
  379. package/skills/manage-project/SKILL.md +358 -0
  380. package/skills/manage-project/references/pre_submission_checklist.md +53 -0
  381. package/skills/manage-project/references/project_state_template.json +37 -0
  382. package/skills/manage-project/references/scaffold_templates.md +118 -0
  383. package/skills/manage-project/references/status_output_format.md +44 -0
  384. package/skills/manage-project/references/timeline_example.md +20 -0
  385. package/skills/manage-project/skill.yml +36 -0
  386. package/skills/manage-project/templates/SSOT.yaml.template +41 -0
  387. package/skills/manage-refs/LICENSE.zotero-mcp +21 -0
  388. package/skills/manage-refs/NOTICE.md +29 -0
  389. package/skills/manage-refs/SKILL.md +289 -0
  390. package/skills/manage-refs/citation_styles/README.md +40 -0
  391. package/skills/manage-refs/citation_styles/american-journal-of-roentgenology.csl +211 -0
  392. package/skills/manage-refs/citation_styles/cardiovascular-and-interventional-radiology.csl +19 -0
  393. package/skills/manage-refs/citation_styles/european-radiology.csl +19 -0
  394. package/skills/manage-refs/citation_styles/journal-of-cachexia-sarcopenia-and-muscle.csl +150 -0
  395. package/skills/manage-refs/citation_styles/journal-of-korean-medical-science-strict.csl +533 -0
  396. package/skills/manage-refs/citation_styles/journal-of-korean-medical-science.csl +16 -0
  397. package/skills/manage-refs/citation_styles/korean-journal-of-radiology.csl +155 -0
  398. package/skills/manage-refs/citation_styles/nature.csl +189 -0
  399. package/skills/manage-refs/citation_styles/nlm-citation-sequence.csl +535 -0
  400. package/skills/manage-refs/citation_styles/radiology.csl +228 -0
  401. package/skills/manage-refs/citation_styles/springer-basic-brackets.csl +187 -0
  402. package/skills/manage-refs/citation_styles/springer-vancouver-brackets.csl +276 -0
  403. package/skills/manage-refs/citation_styles/vancouver-superscript.csl +536 -0
  404. package/skills/manage-refs/citation_styles/vancouver.csl +535 -0
  405. package/skills/manage-refs/references/REFERENCE_STYLE_SPECS.md +59 -0
  406. package/skills/manage-refs/references/check_xref_symptoms.md +35 -0
  407. package/skills/manage-refs/scripts/_vendor_citation_writer.py +600 -0
  408. package/skills/manage-refs/scripts/check_citation_keys.py +112 -0
  409. package/skills/manage-refs/scripts/check_csl_render.py +102 -0
  410. package/skills/manage-refs/scripts/check_xref.py +633 -0
  411. package/skills/manage-refs/scripts/fill_journal_abbrev.py +104 -0
  412. package/skills/manage-refs/scripts/inject_zotero_cwyw.py +133 -0
  413. package/skills/manage-refs/scripts/md_marker_convert.py +193 -0
  414. package/skills/manage-refs/scripts/pre_submission_gate.sh +238 -0
  415. package/skills/manage-refs/scripts/render_pandoc.sh +88 -0
  416. package/skills/manage-refs/skill.yml +70 -0
  417. package/skills/manage-refs/tests/fixtures/pre_submission_gate/README.md +32 -0
  418. package/skills/manage-refs/tests/fixtures/pre_submission_gate/manuscript.md +10 -0
  419. package/skills/manage-refs/tests/fixtures/pre_submission_gate/refs.bib +34 -0
  420. package/skills/manage-refs/tests/fixtures/pre_submission_gate/run.sh +117 -0
  421. package/skills/manage-refs/tests/test_vN_docx_check.sh +145 -0
  422. package/skills/meta-analysis/SKILL.md +739 -0
  423. package/skills/meta-analysis/references/LICENSES.md +21 -0
  424. package/skills/meta-analysis/references/PROSPERO_template.md +221 -0
  425. package/skills/meta-analysis/references/ai_pre_screening_template.py +245 -0
  426. package/skills/meta-analysis/references/checklists/JBI_Case_Series.md +45 -0
  427. package/skills/meta-analysis/references/checklists/NOS.md +88 -0
  428. package/skills/meta-analysis/references/checklists/PRISMA_DTA.md +36 -0
  429. package/skills/meta-analysis/references/checklists/PROBAST.md +75 -0
  430. package/skills/meta-analysis/references/checklists/QUADAS2.md +77 -0
  431. package/skills/meta-analysis/references/checklists/ROBINS_I.md +87 -0
  432. package/skills/meta-analysis/references/checklists/RoB2.md +79 -0
  433. package/skills/meta-analysis/references/data_integrity_checklist.md +57 -0
  434. package/skills/meta-analysis/references/icmje_coi_guide.md +181 -0
  435. package/skills/meta-analysis/references/phase10_recovery.md +136 -0
  436. package/skills/meta-analysis/references/phase4_km_composite.md +58 -0
  437. package/skills/meta-analysis/references/phase6_statistical_synthesis.md +148 -0
  438. package/skills/meta-analysis/references/phase9_circulation.md +84 -0
  439. package/skills/meta-analysis/references/post_submission_release_ops.md +41 -0
  440. package/skills/meta-analysis/references/r_templates.md +132 -0
  441. package/skills/meta-analysis/references/review_orchestration.md +40 -0
  442. package/skills/meta-analysis/references/submission_package_drift.md +71 -0
  443. package/skills/meta-analysis/scripts/check_pool_consistency.py +201 -0
  444. package/skills/meta-analysis/scripts/cohort_overlap_check.py +242 -0
  445. package/skills/meta-analysis/scripts/dta_extraction_qc.py +137 -0
  446. package/skills/meta-analysis/scripts/screening_reconcile.py +160 -0
  447. package/skills/meta-analysis/skill.yml +47 -0
  448. package/skills/meta-analysis/templates/FINAL_POOL_LOCK.yaml.template +70 -0
  449. package/skills/meta-analysis/templates/extraction_form_v2.md +129 -0
  450. package/skills/meta-analysis/templates/supplementary_8file_checklist.md +94 -0
  451. package/skills/meta-analysis/tests/test_pool_consistency.sh +123 -0
  452. package/skills/orchestrate/SKILL.md +501 -0
  453. package/skills/orchestrate/references/dialogue_nodes.md +196 -0
  454. package/skills/orchestrate/references/report_template.md +109 -0
  455. package/skills/orchestrate/references/report_template_ko.md +88 -0
  456. package/skills/orchestrate/skill.yml +44 -0
  457. package/skills/peer-review/SKILL.md +381 -0
  458. package/skills/peer-review/references/aczel_2021_reviewer2_patterns.md +88 -0
  459. package/skills/peer-review/references/domain-probes/ai_overclaiming.md +47 -0
  460. package/skills/peer-review/references/domain-probes/narrative_review.md +44 -0
  461. package/skills/peer-review/references/domain-probes/observational_confounding.md +48 -0
  462. package/skills/peer-review/references/domain-probes/radiomics.md +38 -0
  463. package/skills/peer-review/references/domain-probes/sr_ma.md +87 -0
  464. package/skills/peer-review/references/domain-probes/survival_prognostic.md +68 -0
  465. package/skills/peer-review/references/exemplar_reviews/README.md +43 -0
  466. package/skills/peer-review/references/exemplar_reviews/ai_overclaiming.md +47 -0
  467. package/skills/peer-review/references/exemplar_reviews/calibration_missing.md +44 -0
  468. package/skills/peer-review/references/exemplar_reviews/data_leakage.md +48 -0
  469. package/skills/peer-review/references/exemplar_reviews/reference_standard_validity.md +45 -0
  470. package/skills/peer-review/references/narrative_review_audit.md +67 -0
  471. package/skills/peer-review/references/reviewer_calibration/README.md +34 -0
  472. package/skills/peer-review/references/reviewer_calibration/compliance_floor.md +52 -0
  473. package/skills/peer-review/references/reviewer_profiles/AJR.md +82 -0
  474. package/skills/peer-review/references/reviewer_profiles/EURE.md +64 -0
  475. package/skills/peer-review/references/reviewer_profiles/INSI.md +57 -0
  476. package/skills/peer-review/references/reviewer_profiles/KJR.md +100 -0
  477. package/skills/peer-review/references/reviewer_profiles/README.md +32 -0
  478. package/skills/peer-review/references/reviewer_profiles/RYAI.md +86 -0
  479. package/skills/peer-review/skill.yml +39 -0
  480. package/skills/present-paper/SKILL.md +675 -0
  481. package/skills/present-paper/references/critic_rubrics/slide.md +155 -0
  482. package/skills/present-paper/references/generate_pptx_templates.py +604 -0
  483. package/skills/present-paper/references/medical_presentation_templates.md +277 -0
  484. package/skills/present-paper/references/slide_design_principles.md +202 -0
  485. package/skills/present-paper/references/slide_visual_styles/nature_lancet.md +168 -0
  486. package/skills/present-paper/references/workflow-checklist.md +109 -0
  487. package/skills/present-paper/scripts/extract_pdf_figures.py +243 -0
  488. package/skills/present-paper/scripts/inject_pronunciation_notes.py +178 -0
  489. package/skills/present-paper/scripts/inject_speaker_notes.py +133 -0
  490. package/skills/present-paper/scripts/strip_notes_for_sharing.py +140 -0
  491. package/skills/present-paper/scripts/trim_caption.py +271 -0
  492. package/skills/present-paper/skill.yml +41 -0
  493. package/skills/present-paper/templates/build_pptx_nature_lancet.py +688 -0
  494. package/skills/publish-skill/SKILL.md +370 -0
  495. package/skills/publish-skill/references/license-compatibility-matrix.md +132 -0
  496. package/skills/publish-skill/references/pii-patterns.md +130 -0
  497. package/skills/publish-skill/scripts/audit_skill.sh +278 -0
  498. package/skills/publish-skill/skill.yml +35 -0
  499. package/skills/render-pdf-doc/SKILL.md +146 -0
  500. package/skills/render-pdf-doc/references/known_pitfalls.md +53 -0
  501. package/skills/render-pdf-doc/references/pandoc_korean_cheatsheet.md +77 -0
  502. package/skills/render-pdf-doc/scripts/check_deps.sh +42 -0
  503. package/skills/render-pdf-doc/scripts/infer_colwidths.py +164 -0
  504. package/skills/render-pdf-doc/scripts/render_pdf.sh +98 -0
  505. package/skills/render-pdf-doc/skill.yml +57 -0
  506. package/skills/render-pdf-doc/templates/anchor-doc.md +27 -0
  507. package/skills/render-pdf-doc/templates/anchor-doc_ko.md +25 -0
  508. package/skills/render-pdf-doc/templates/briefing-handout.md +33 -0
  509. package/skills/render-pdf-doc/templates/briefing-handout_ko.md +31 -0
  510. package/skills/render-pdf-doc/templates/proposal-cover.md +33 -0
  511. package/skills/render-pdf-doc/templates/proposal-cover_ko.md +31 -0
  512. package/skills/render-pdf-doc/templates/reference-table.md +22 -0
  513. package/skills/render-pdf-doc/templates/reference-table_ko.md +20 -0
  514. package/skills/replicate-study/SKILL.md +150 -0
  515. package/skills/replicate-study/references/harmonization_3country.csv +47 -0
  516. package/skills/replicate-study/references/harmonization_knhanes_nhanes.csv +68 -0
  517. package/skills/replicate-study/references/methodology_extraction_template.md +134 -0
  518. package/skills/replicate-study/skill.yml +37 -0
  519. package/skills/review-paper/SKILL.md +104 -0
  520. package/skills/review-paper/references/macro_skeleton.md +6 -0
  521. package/skills/review-paper/skill.yml +25 -0
  522. package/skills/revise/SKILL.md +515 -0
  523. package/skills/revise/references/r2r_voice.md +346 -0
  524. package/skills/revise/skill.yml +43 -0
  525. package/skills/search-lit/SKILL.md +443 -0
  526. package/skills/search-lit/references/parse_pubmed.py +326 -0
  527. package/skills/search-lit/references/pubmed_eutils.sh +111 -0
  528. package/skills/search-lit/skill.yml +46 -0
  529. package/skills/self-review/SKILL.md +1045 -0
  530. package/skills/self-review/references/domain-probes/ai_overclaiming.md +47 -0
  531. package/skills/self-review/references/domain-probes/narrative_review.md +44 -0
  532. package/skills/self-review/references/domain-probes/observational_confounding.md +48 -0
  533. package/skills/self-review/references/domain-probes/radiomics.md +38 -0
  534. package/skills/self-review/references/domain-probes/sr_ma.md +87 -0
  535. package/skills/self-review/references/domain-probes/survival_prognostic.md +68 -0
  536. package/skills/self-review/references/exemplar_findings/README.md +43 -0
  537. package/skills/self-review/references/exemplar_findings/cohort_arithmetic_mismatch.md +35 -0
  538. package/skills/self-review/references/exemplar_findings/estimand_drift_posthoc_primary.md +39 -0
  539. package/skills/self-review/references/exemplar_findings/scope_overreach_cross_sectional.md +35 -0
  540. package/skills/self-review/references/exemplar_findings/unadjusted_confounder.md +36 -0
  541. package/skills/self-review/references/panel_review_template.md +177 -0
  542. package/skills/self-review/scripts/check_artifact_coverage.py +301 -0
  543. package/skills/self-review/scripts/check_claim_artifact.py +248 -0
  544. package/skills/self-review/scripts/check_classical_style.py +185 -0
  545. package/skills/self-review/scripts/check_cohort_arithmetic.py +481 -0
  546. package/skills/self-review/scripts/check_confounding_completeness.py +287 -0
  547. package/skills/self-review/scripts/check_panel_diversity.py +336 -0
  548. package/skills/self-review/scripts/check_reference_adequacy.py +392 -0
  549. package/skills/self-review/scripts/check_reviewer_team_consistency.py +412 -0
  550. package/skills/self-review/scripts/check_scope_coherence.py +177 -0
  551. package/skills/self-review/skill.yml +47 -0
  552. package/skills/self-review/tests/fixtures/claim_manuscript.md +17 -0
  553. package/skills/self-review/tests/fixtures/claim_prereg.md +6 -0
  554. package/skills/self-review/tests/fixtures/cohort_bad.md +21 -0
  555. package/skills/self-review/tests/fixtures/cohort_clean.md +21 -0
  556. package/skills/self-review/tests/fixtures/cohort_partition.csv +5 -0
  557. package/skills/self-review/tests/fixtures/coverage_analysis/31_delong_nested_added_value.csv +3 -0
  558. package/skills/self-review/tests/fixtures/coverage_analysis/table1_demographics.csv +3 -0
  559. package/skills/self-review/tests/fixtures/coverage_clean.md +13 -0
  560. package/skills/self-review/tests/fixtures/coverage_manuscript.md +11 -0
  561. package/skills/self-review/tests/fixtures/panel_collapse.json +27 -0
  562. package/skills/self-review/tests/fixtures/panel_good.json +32 -0
  563. package/skills/self-review/tests/fixtures/panel_monoculture.json +32 -0
  564. package/skills/self-review/tests/fixtures/refadeq_letter.md +13 -0
  565. package/skills/self-review/tests/fixtures/refadeq_original_fixed.md +42 -0
  566. package/skills/self-review/tests/fixtures/refadeq_original_uncited.md +40 -0
  567. package/skills/self-review/tests/fixtures/scope_bad.md +9 -0
  568. package/skills/self-review/tests/fixtures/scope_clean.md +8 -0
  569. package/skills/self-review/tests/fixtures/scope_surrogate.md +8 -0
  570. package/skills/self-review/tests/fixtures/style_bad.md +13 -0
  571. package/skills/self-review/tests/fixtures/style_clean.md +11 -0
  572. package/skills/self-review/tests/fixtures/table1_by_exposure.csv +11 -0
  573. package/skills/self-review/tests/test_artifact_coverage.sh +44 -0
  574. package/skills/self-review/tests/test_claim_artifact.sh +50 -0
  575. package/skills/self-review/tests/test_classical_style.sh +44 -0
  576. package/skills/self-review/tests/test_cohort_arithmetic.sh +49 -0
  577. package/skills/self-review/tests/test_confounding_completeness.sh +66 -0
  578. package/skills/self-review/tests/test_panel_diversity.sh +55 -0
  579. package/skills/self-review/tests/test_panel_mode.sh +69 -0
  580. package/skills/self-review/tests/test_reference_adequacy.sh +68 -0
  581. package/skills/self-review/tests/test_reviewer_team_consistency.sh +138 -0
  582. package/skills/self-review/tests/test_scope_coherence.sh +46 -0
  583. package/skills/setup-medsci/SKILL.md +110 -0
  584. package/skills/setup-medsci/references/setup-checklist.md +51 -0
  585. package/skills/setup-medsci/skill.yml +30 -0
  586. package/skills/sync-submission/SKILL.md +382 -0
  587. package/skills/sync-submission/scripts/author_registry_example.yaml +36 -0
  588. package/skills/sync-submission/scripts/blind_sweep.py +203 -0
  589. package/skills/sync-submission/scripts/check_asset_anonymization.py +300 -0
  590. package/skills/sync-submission/scripts/check_cross_artifact_stale.py +211 -0
  591. package/skills/sync-submission/scripts/cover_letter_drift_check.py +451 -0
  592. package/skills/sync-submission/scripts/cross_document_n_check.py +486 -0
  593. package/skills/sync-submission/scripts/detect_copy_divergence.py +136 -0
  594. package/skills/sync-submission/scripts/preflight_gate.py +458 -0
  595. package/skills/sync-submission/scripts/scope_drift_check.py +362 -0
  596. package/skills/sync-submission/scripts/sync_submission.py +169 -0
  597. package/skills/sync-submission/skill.yml +43 -0
  598. package/skills/sync-submission/tests/fixtures/copy_ok.md +5 -0
  599. package/skills/sync-submission/tests/fixtures/copy_stale.md +5 -0
  600. package/skills/sync-submission/tests/fixtures/ssot.md +5 -0
  601. package/skills/sync-submission/tests/test_asset_anonymization.sh +99 -0
  602. package/skills/sync-submission/tests/test_copy_divergence.sh +44 -0
  603. package/skills/sync-submission/tests/test_cross_artifact_stale.sh +80 -0
  604. package/skills/sync-submission/tests/test_cross_document_n.sh +132 -0
  605. package/skills/sync-submission/tests/test_preflight_gate.sh +112 -0
  606. package/skills/sync-submission/tests/test_scope_drift.sh +122 -0
  607. package/skills/sync-submission/tests/test_vN_docx_assertion.sh +51 -0
  608. package/skills/verify-refs/SKILL.md +177 -0
  609. package/skills/verify-refs/references/manual_checkpoint_guide.md +100 -0
  610. package/skills/verify-refs/scripts/verify_cli.sh +62 -0
  611. package/skills/verify-refs/scripts/verify_refs.py +782 -0
  612. package/skills/verify-refs/skill.yml +44 -0
  613. package/skills/verify-refs/tests/fixtures/pagination_placeholder.bib +17 -0
  614. package/skills/verify-refs/tests/test_pagination_placeholder.sh +42 -0
  615. package/skills/version-dataset/SKILL.md +143 -0
  616. package/skills/version-dataset/references/manifest_schema.md +72 -0
  617. package/skills/version-dataset/scripts/version_dataset.py +242 -0
  618. package/skills/version-dataset/skill.yml +35 -0
  619. package/skills/version-dataset/tests/test_version_dataset.sh +52 -0
  620. package/skills/write-paper/SKILL.md +1148 -0
  621. package/skills/write-paper/references/exemplar_methods/README.md +38 -0
  622. package/skills/write-paper/references/exemplar_methods/ai_validation_tripod_claim.md +47 -0
  623. package/skills/write-paper/references/exemplar_methods/diagnostic_accuracy_stard.md +50 -0
  624. package/skills/write-paper/references/exemplar_methods/observational_cohort_strobe.md +43 -0
  625. package/skills/write-paper/references/journal_profiles/AJNR.md +185 -0
  626. package/skills/write-paper/references/journal_profiles/AJR.md +149 -0
  627. package/skills/write-paper/references/journal_profiles/Abdominal_Radiology.md +139 -0
  628. package/skills/write-paper/references/journal_profiles/Academic_Radiology.md +90 -0
  629. package/skills/write-paper/references/journal_profiles/Annals_of_Internal_Medicine.md +150 -0
  630. package/skills/write-paper/references/journal_profiles/Artificial_Intelligence_in_Medicine.md +82 -0
  631. package/skills/write-paper/references/journal_profiles/British_Journal_of_Radiology.md +161 -0
  632. package/skills/write-paper/references/journal_profiles/CVIR.md +157 -0
  633. package/skills/write-paper/references/journal_profiles/Chest.md +270 -0
  634. package/skills/write-paper/references/journal_profiles/Clinical_Radiology.md +160 -0
  635. package/skills/write-paper/references/journal_profiles/Clinical_and_Molecular_Hepatology.md +147 -0
  636. package/skills/write-paper/references/journal_profiles/Diabetes_Metabolism_Journal.md +163 -0
  637. package/skills/write-paper/references/journal_profiles/Diagnostic_and_Interventional_Radiology.md +216 -0
  638. package/skills/write-paper/references/journal_profiles/Endocrinology_and_Metabolism.md +167 -0
  639. package/skills/write-paper/references/journal_profiles/European_Journal_of_Preventive_Cardiology.md +192 -0
  640. package/skills/write-paper/references/journal_profiles/European_Radiology.md +159 -0
  641. package/skills/write-paper/references/journal_profiles/Hepatology_Communications.md +110 -0
  642. package/skills/write-paper/references/journal_profiles/Hepatology_International.md +106 -0
  643. package/skills/write-paper/references/journal_profiles/IEEE_TMI.md +180 -0
  644. package/skills/write-paper/references/journal_profiles/INSI.md +163 -0
  645. package/skills/write-paper/references/journal_profiles/Investigative_Radiology.md +86 -0
  646. package/skills/write-paper/references/journal_profiles/JACC_Advances.md +197 -0
  647. package/skills/write-paper/references/journal_profiles/JACC_Asia.md +168 -0
  648. package/skills/write-paper/references/journal_profiles/JACR.md +87 -0
  649. package/skills/write-paper/references/journal_profiles/JAMA.md +188 -0
  650. package/skills/write-paper/references/journal_profiles/JAMA_Network_Open.md +170 -0
  651. package/skills/write-paper/references/journal_profiles/JCSM.md +266 -0
  652. package/skills/write-paper/references/journal_profiles/JKMS.md +201 -0
  653. package/skills/write-paper/references/journal_profiles/JMIR.md +88 -0
  654. package/skills/write-paper/references/journal_profiles/JMIR_Medical_Education.md +86 -0
  655. package/skills/write-paper/references/journal_profiles/JNIS.md +227 -0
  656. package/skills/write-paper/references/journal_profiles/JVIR.md +158 -0
  657. package/skills/write-paper/references/journal_profiles/Journal_of_Clinical_Endocrinology_and_Metabolism.md +191 -0
  658. package/skills/write-paper/references/journal_profiles/Journal_of_Stroke.md +176 -0
  659. package/skills/write-paper/references/journal_profiles/KJR.md +185 -0
  660. package/skills/write-paper/references/journal_profiles/Korean_Circulation_Journal.md +184 -0
  661. package/skills/write-paper/references/journal_profiles/Korean_Journal_of_Internal_Medicine.md +178 -0
  662. package/skills/write-paper/references/journal_profiles/Lancet_Gastroenterology_and_Hepatology.md +127 -0
  663. package/skills/write-paper/references/journal_profiles/Liver_International.md +165 -0
  664. package/skills/write-paper/references/journal_profiles/Medical_Image_Analysis.md +147 -0
  665. package/skills/write-paper/references/journal_profiles/NEJM.md +147 -0
  666. package/skills/write-paper/references/journal_profiles/Nature_Medicine.md +181 -0
  667. package/skills/write-paper/references/journal_profiles/Neuroradiology.md +151 -0
  668. package/skills/write-paper/references/journal_profiles/Nutrition_Metabolism_and_Cardiovascular_Diseases.md +184 -0
  669. package/skills/write-paper/references/journal_profiles/PLOS_Medicine.md +166 -0
  670. package/skills/write-paper/references/journal_profiles/RYAI.md +124 -0
  671. package/skills/write-paper/references/journal_profiles/Radiology.md +173 -0
  672. package/skills/write-paper/references/journal_profiles/Skeletal_Radiology.md +135 -0
  673. package/skills/write-paper/references/journal_profiles/Stroke.md +210 -0
  674. package/skills/write-paper/references/journal_profiles/The_BMJ.md +121 -0
  675. package/skills/write-paper/references/journal_profiles/The_Lancet.md +112 -0
  676. package/skills/write-paper/references/journal_profiles/The_Lancet_Digital_Health.md +104 -0
  677. package/skills/write-paper/references/journal_profiles/World_Journal_of_Hepatology.md +106 -0
  678. package/skills/write-paper/references/journal_profiles/npj_Digital_Medicine.md +93 -0
  679. package/skills/write-paper/references/paper_types/ai_validation.md +270 -0
  680. package/skills/write-paper/references/paper_types/animal_study.md +194 -0
  681. package/skills/write-paper/references/paper_types/case_report.md +237 -0
  682. package/skills/write-paper/references/paper_types/cross_national.md +328 -0
  683. package/skills/write-paper/references/paper_types/letter.md +127 -0
  684. package/skills/write-paper/references/paper_types/meta_analysis.md +181 -0
  685. package/skills/write-paper/references/paper_types/nhis_cohort.md +297 -0
  686. package/skills/write-paper/references/paper_types/original_article.md +221 -0
  687. package/skills/write-paper/references/paper_types/technical_note.md +131 -0
  688. package/skills/write-paper/references/section_guides/discussion.md +155 -0
  689. package/skills/write-paper/references/section_guides/introduction.md +108 -0
  690. package/skills/write-paper/references/section_guides/methods.md +144 -0
  691. package/skills/write-paper/references/section_guides/results.md +113 -0
  692. package/skills/write-paper/references/section_guides/step7_1_classical_qc.md +67 -0
  693. package/skills/write-paper/references/section_guides/step7_4a_audit_recovery.md +74 -0
  694. package/skills/write-paper/references/section_guides/title_abstract.md +123 -0
  695. package/skills/write-paper/references/section_templates/methods_statistical.md +147 -0
  696. package/skills/write-paper/scripts/check_placeholders.py +182 -0
  697. package/skills/write-paper/skill.yml +48 -0
  698. package/skills/write-paper/tests/test_placeholders.sh +107 -0
  699. package/skills/write-protocol/SKILL.md +243 -0
  700. package/skills/write-protocol/references/ethics_checklist.md +150 -0
  701. package/skills/write-protocol/references/protocol_template.md +304 -0
  702. package/skills/write-protocol/skill.yml +34 -0
@@ -0,0 +1,675 @@
1
+ ---
2
+ name: present-paper
3
+ description: >
4
+ Academic presentation preparation — paper-driven (journal club, grand rounds, seminar) and
5
+ lecture/teaching decks (course material, workshop slides, conference talks). Analyzes source
6
+ material, finds supporting references, drafts audience-adapted speaker scripts, generates or
7
+ augments PPTX with speaker notes, and prepares Q&A.
8
+ triggers: present paper, paper presentation, journal club, seminar presentation, grand rounds, academic presentation, presentation prep, lecture, lecture material, teaching slides, course slides, 강의자료, 발표자료, 슬라이드, pptx
9
+ tools: Read, Write, Edit, Bash, Grep, Glob
10
+ model: inherit
11
+ ---
12
+
13
+ # Present-Paper Skill
14
+
15
+ ## Purpose
16
+
17
+ Prepare a polished academic presentation from a research paper. The skill walks through a 5-phase
18
+ pipeline: paper analysis, supporting research, script writing, slide note injection, and Q&A
19
+ preparation.
20
+
21
+ Use it when:
22
+
23
+ - preparing a journal club or seminar presentation
24
+ - presenting a paper for a graduate course
25
+ - preparing grand rounds or conference talks based on a published paper
26
+ - building speaker notes for an existing slide deck
27
+
28
+ ---
29
+
30
+ ## Communication Rules
31
+
32
+ - Communicate with the user in their preferred language.
33
+ - Use English for medical, statistical, and methodological terminology.
34
+ - Add pronunciation guides for drug names and technical abbreviations in the user's language.
35
+ - Be direct about paper limitations, but frame them constructively.
36
+
37
+ ---
38
+
39
+ ## Phase 0: Init & Outline
40
+
41
+ ### Step 0a — Load design references (read before drafting outline)
42
+
43
+ Before collecting inputs, the skill loads three reference files:
44
+
45
+ 1. **`references/slide_design_principles.md`** — Reynolds (Presentation Zen) +
46
+ Duarte (Slide:ology Glance Test™) + Knaflic (Storytelling with Data preattentive
47
+ attributes) + Tufte (Cognitive Style of PowerPoint). Defines the 5 design
48
+ principles, reading-time budgets per audience, cognitive-load ceilings, and the
49
+ anti-patterns this skill is built to avoid. **Read this first** — it shifts the
50
+ outline from "what content fits" to "what should the audience remember 10 seconds
51
+ after each slide."
52
+ 2. **`references/medical_presentation_templates.md`** — Section structure, slide counts,
53
+ and design seeds for the 5 contexts: journal club, grand rounds, conference talk,
54
+ lecture, and academic lecture multi-paper survey. Pick the matching template after
55
+ Phase 0 inputs are collected, then customize.
56
+ 3. **`references/slide_visual_styles/`** — visual style specs (color palette, typography,
57
+ layout grid, slide-type templates) callable from any of the 5 context templates.
58
+ Currently available: `nature_lancet.md` (Nature/Lancet aesthetic — white background,
59
+ navy primary, coral accent, Inter/Pretendard). Default for academic lectures per
60
+ `~/.claude/rules/academic-lecture-style.md`. Paired with the generic builder
61
+ `templates/build_pptx_nature_lancet.py` and the PDF figure extractor
62
+ `scripts/extract_pdf_figures.py`.
63
+
64
+ These two files mirror the entry-point pattern used in
65
+ `make-figures/references/design_principles.md` (Step 1 "Specify"). Both skills share
66
+ the same Reynolds / Knaflic / Tufte foundations — slide-level (this skill) and
67
+ figure-level (make-figures) are companions, not duplicates.
68
+
69
+ ### Required Inputs
70
+
71
+ Before starting, collect these from the user:
72
+
73
+ | Input | Why |
74
+ |-------|-----|
75
+ | **Paper** | PDF path, DOI, or PMID |
76
+ | **Presentation time** | Determines depth and slide count |
77
+ | **Target audience** | Specialty mix, knowledge level — controls terminology depth |
78
+ | **Context** | Course name, conference, journal club format, prior session topics |
79
+ | **Extension section** | Optional topic to include (e.g., AI directions, clinical implications). Default: none |
80
+
81
+ ### Paper Analysis
82
+
83
+ Read the paper and produce a structured analysis:
84
+
85
+ ```text
86
+ ## Paper Analysis
87
+
88
+ ### Citation
89
+ [Full citation with DOI]
90
+
91
+ ### Background
92
+ - What gap does this paper address?
93
+ - What was known vs. unknown before this study?
94
+
95
+ ### Study Design
96
+ - Type: [RCT / cohort / case series / meta-analysis / etc.]
97
+ - Subjects: [n, inclusion/exclusion]
98
+ - Methods: [key methodological choices]
99
+ - Primary outcome: [what was measured]
100
+
101
+ ### Key Results
102
+ 1. [Finding 1 with effect size and CI/p-value]
103
+ 2. [Finding 2]
104
+ 3. [Finding 3]
105
+
106
+ ### Patient/Case Summary Table
107
+ [If applicable — structured table of individual cases or subgroups]
108
+
109
+ ### Limitations
110
+ 1. [Limitation 1]
111
+ 2. [Limitation 2]
112
+
113
+ ### Significance
114
+ - Why does this matter?
115
+ - What changes because of this paper?
116
+ ```
117
+
118
+ ### Slide Outline
119
+
120
+ Create a slide-by-slide outline with time allocation:
121
+
122
+ ```text
123
+ ## Slide Outline ([N] slides, [M] minutes)
124
+
125
+ | # | Title | Time | Key Content |
126
+ |---|-------|------|-------------|
127
+ | 1 | Title slide | 0:30 | Paper citation, presenter |
128
+ | 2 | Context / Prior sessions | 1:00 | How this connects to prior knowledge |
129
+ | 3 | Background | 1:30 | The gap this paper fills |
130
+ | ... | ... | ... | ... |
131
+ | N | Take-home messages | 0:30 | 3-5 key points |
132
+ ```
133
+
134
+ **Gate: User approves outline before proceeding.**
135
+
136
+ ---
137
+
138
+ ## Phase 1: Supporting Research
139
+
140
+ ### Search Strategy
141
+
142
+ Find references that strengthen the presentation:
143
+
144
+ 1. **Follow-up studies** — Has the main finding been replicated or extended?
145
+ 2. **Clinical trial data** — Large-scale data that contextualizes the findings
146
+ 3. **Review articles** — Authoritative summaries that frame the topic
147
+ 4. **Contradicting evidence** — Important for balanced Q&A preparation
148
+
149
+ **Efficiency rule:** Limit supporting references to 5-8 total. Only search categories
150
+ that the approved outline (Phase 0) actually requires. Skip categories not needed for
151
+ the presentation type (e.g., skip clinical trials for a methods-focused paper).
152
+
153
+ ### Selection Criteria
154
+
155
+ Do NOT summarize every paper found. Extract only:
156
+
157
+ - Specific data points needed for slides (incidence rates, OR/HR, AUC values)
158
+ - Findings that directly support or challenge the main paper
159
+ - Context that helps the audience understand significance
160
+
161
+ ### Output
162
+
163
+ ```text
164
+ ## Verified References
165
+
166
+ ### Main Paper
167
+ 1. [Citation] — PMID: XXXXX, DOI: XX.XXXX/XXXXX
168
+
169
+ ### Supporting References
170
+ 2. [Citation] — PMID: XXXXX
171
+ → Used for: [specific data point or context]
172
+ 3. [Citation] — PMID: XXXXX
173
+ → Used for: [specific data point or context]
174
+
175
+ ### Key Data for Slides
176
+ - [Statistic 1]: [value] — Source: [Ref #]
177
+ - [Statistic 2]: [value] — Source: [Ref #]
178
+ ```
179
+
180
+ **Every reference must have a verified DOI or PMID. Mark unverified references with [UNVERIFIED].**
181
+
182
+ ---
183
+
184
+ ## Phase 2: Script & Content
185
+
186
+ ### Speaker Script
187
+
188
+ Draft a complete speaker script with these requirements:
189
+
190
+ 1. **Language**: User's preferred language for narration; English for technical terms
191
+ 2. **Audience adaptation**: Adjust explanation depth based on Phase 0 audience profile
192
+ - For mixed audiences: add one-line plain-language explanations for specialty-specific terms
193
+ - Example: "FLAIR sequence — an MRI technique that suppresses fluid signal to highlight edema"
194
+ 3. **Pronunciation guide**: Include native-language pronunciation for drug names, abbreviations
195
+ - Example: "lecanemab (leh-KAN-eh-mab)" or local equivalent
196
+ 4. **Timing markers**: Note approximate time per slide
197
+ 5. **Transition phrases**: Connect each slide to the narrative arc
198
+
199
+ ### Structure
200
+
201
+ ```text
202
+ ## Speaker Script
203
+
204
+ ### Slide 1: Title (0:30)
205
+ "[Opening — introduce yourself and the paper]"
206
+
207
+ ### Slide 2: Context (1:00)
208
+ "[Connect to prior knowledge or clinical relevance]"
209
+
210
+ ...
211
+
212
+ ### Slide N: Take-home Messages (0:30)
213
+ "[Summarize 3-5 key points. Thank audience. Invite questions.]"
214
+ ```
215
+
216
+ ### Extension Section (Optional)
217
+
218
+ Only include if user requested in Phase 0. Examples:
219
+
220
+ - AI/computational research directions stemming from the paper
221
+ - Clinical practice implications
222
+ - Policy or guideline implications
223
+ - Connections to the user's own research
224
+
225
+ **Gate: User reviews script before proceeding.**
226
+
227
+ ---
228
+
229
+ ## Phase 3: Slides & Notes
230
+
231
+ ### Two Modes
232
+
233
+ **Mode A: Generate new slide deck**
234
+
235
+ Generate a fully-editable PPTX from structured inline data using `python-pptx`. Two
236
+ canonical template libraries:
237
+
238
+ - `${CLAUDE_SKILL_DIR}/references/generate_pptx_templates.py` — generic T_lead /
239
+ T_text / T_table / T_image_right / etc. templates with smoke-tested `main()`. Use
240
+ for journal club, grand rounds, conference talk, and short paper talks.
241
+ - `${CLAUDE_SKILL_DIR}/templates/build_pptx_nature_lancet.py` — Nature/Lancet visual
242
+ style (white + navy + coral, Inter/Pretendard, 47-slide academic lecture proven).
243
+ Use for **academic lecture multi-paper survey** (template #5). Functions:
244
+ `new_presentation`, `add_title_slide`, `add_toc_slide`, `add_section_divider`,
245
+ `add_transition_slide`, `add_content_slide`, `add_glossary_slide`,
246
+ `add_closing_slide`, plus `fix_app_xml()` helper. Style spec:
247
+ `references/slide_visual_styles/nature_lancet.md`.
248
+
249
+ For lecture decks pulling figures from PDFs (rather than from `/make-figures`
250
+ output), use `${CLAUDE_SKILL_DIR}/scripts/extract_pdf_figures.py` — pdftoppm + PIL
251
+ crop with normalized (0–1) box coordinates. Supports both single-crop CLI and YAML
252
+ batch config.
253
+
254
+ After raw extraction, run `${CLAUDE_SKILL_DIR}/scripts/trim_caption.py` to
255
+ **auto-remove journal headers / figure captions / surrounding whitespace** so
256
+ that only the figure body remains — the Adobe-Acrobat-crop equivalent in
257
+ automation. The script uses horizontal-projection segmentation plus
258
+ text-band detection (height + density + gap + line-pattern signature) and
259
+ preserves multi-panel figures intact:
260
+
261
+ ```bash
262
+ python3 "${CLAUDE_SKILL_DIR}/scripts/trim_caption.py" \
263
+ --in-dir figures/extracted \
264
+ --out-dir figures/cropped
265
+ ```
266
+
267
+ Handles four common journal layouts: top running-head bar, bottom multi-line
268
+ caption (sparse text), bottom caption *fused* with figure body (no clear gap,
269
+ detected via narrow dark/light alternation), and multi-row tables with
270
+ footnotes (footnote cut, table rows preserved). No tesseract / OCR
271
+ dependency — Pillow + numpy only. Verified on 12-figure academic deck
272
+ (80–95% height retention; captions, journal banners, and CellPress-style
273
+ headers all removed). When the deck slot expects only the figure body
274
+ (default for `build_pptx_nature_lancet.py`), point `FIG_DIR` at the cropped
275
+ output dir.
276
+
277
+ ### Word-boundary aware markdown parser (mandatory for HLA-rich decks)
278
+
279
+ When the build script parses inline `**bold**` / `*italic*` markers in slide
280
+ body or speaker notes, the italic rule must use **word-boundary lookahead /
281
+ lookbehind** so asterisk-bearing scientific tokens (HLA alleles like
282
+ `DRB1*07:01`, `HLA-A*02:01`, SNP IDs, footnote markers) are not eaten as
283
+ italic delimiters:
284
+
285
+ ```python
286
+ import re
287
+ pattern = re.compile(
288
+ r"(\*\*(?:(?!\*\*).)+?\*\*" # bold; inner single * allowed
289
+ r"|(?<![A-Za-z0-9])\*[^*\n]+?\*(?![A-Za-z0-9]))" # italic (word-boundary)
290
+ )
291
+ ```
292
+
293
+ Two regex tricks together:
294
+ 1. **Italic with boundary**: `(?<![A-Za-z0-9])` and `(?![A-Za-z0-9])` reject
295
+ `*` adjacent to alphanumerics, so `DRB1*07:01` is left intact.
296
+ 2. **Bold tolerates inner single `*`**: `(?:(?!\*\*).)+?` allows
297
+ `**DRB1*04:02**` (HLA allele inside bold) to match as a single bold span.
298
+
299
+ Without these, a naive `\*[^*]+\*` italic pattern silently corrupts every
300
+ HLA allele in the deck. Add the regex to `add_styled()` (or equivalent) in
301
+ every Nature/Lancet-style build script.
302
+
303
+ ### Pronunciation auto-augment for non-native presenters
304
+
305
+ For decks where the presenter is uncomfortable with English pronunciation of
306
+ acronyms, author names, drug names, or gene symbols, append a per-slide
307
+ `[ Pronunciation ]` section to the speaker notes (audience sees nothing —
308
+ only Presenter View). Use
309
+ `${CLAUDE_SKILL_DIR}/scripts/inject_pronunciation_notes.py`:
310
+
311
+ ```bash
312
+ python3 "${CLAUDE_SKILL_DIR}/scripts/inject_pronunciation_notes.py" \
313
+ input.pptx output.pptx \
314
+ --dict pron_dict.yaml \
315
+ --header "[ 발음 ]" # or any header you like
316
+ ```
317
+
318
+ The script:
319
+ - Loads a YAML/JSON `PRON_DICT` (term → [reading, full_name]) supplied by
320
+ the caller. The dict is domain-specific — assemble it for your audience
321
+ (Korean readings, French readings, Spanish readings, etc.).
322
+ - Uses **word-boundary regex** `(?<![A-Za-z0-9_]) … (?![A-Za-z0-9_])` so
323
+ short acronyms (e.g. `AE`, `OR`) only match when standalone, never inside
324
+ other words.
325
+ - Recognizes allele-style tokens via a separate regex
326
+ (`\b(?:HLA-)?[A-Z]{1,5}[0-9]?\*[0-9]{2}:[0-9]{2}\b` by default) and
327
+ synthesizes their reading from the base allele entry in the dict.
328
+ - Skips slides that already contain the header (idempotent — safe to re-run).
329
+
330
+ Realistic yield on a 47-slide academic deck: ~38 slides receive a section,
331
+ ~300 total term entries, 5–10 per annotated slide. Transition and divider
332
+ slides have empty notes and are auto-skipped.
333
+
334
+ ### Speaker notes statistics density
335
+
336
+ When the slide body already shows exact OR / 95% CI / p-value, the notes
337
+ should NOT repeat the same numbers — the presenter ends up reading
338
+ statistics aloud and the audience cannot keep up. Notes should be a
339
+ **narrative** (key anchors + one-line "see the slide body for the exact
340
+ numbers" reminder), not a numeric listing.
341
+
342
+ Quick measurement to spot dense slides during QC:
343
+
344
+ ```python
345
+ import re
346
+ text = slide.notes_slide.notes_text_frame.text.split(pron_header)[0]
347
+ n_char = len(text)
348
+ n_stat = len(re.findall(r"\b(?:OR|p|CI)\s*[=<>]?\s*\d|\d+\.\d+|\d+%|×10", text))
349
+ needs_compression = n_char > 1000 and n_stat >= 5
350
+ ```
351
+
352
+ Rule of thumb: 700–1,000 chars + 0–2 stat tokens is fine (30–60-second
353
+ narrative). >1,000 chars + ≥5 stat tokens → compress to narrative tone and
354
+ point at the slide body. Exact numbers belong in the slide body and
355
+ footnotes (SSOT), not the notes.
356
+
357
+ ### Sharing-ready notes-stripped variant
358
+
359
+ After the presentation, when the deck is shared with the audience (e.g. a
360
+ professor asking for the slides), the speaker notes typically contain
361
+ presenter-only material — second-language narrative, pronunciation hints,
362
+ self-referential reminders ("Prof. ○○ will likely ask about …"). Stripping
363
+ notes is mandatory before circulation. Use
364
+ `${CLAUDE_SKILL_DIR}/scripts/strip_notes_for_sharing.py`:
365
+
366
+ ```bash
367
+ python3 "${CLAUDE_SKILL_DIR}/scripts/strip_notes_for_sharing.py" \
368
+ presenter_v9.pptx share/<topic>_<initials>.pptx
369
+ ```
370
+
371
+ The script:
372
+ - Clears every slide's `notes_text_frame` (idempotent, slide body and
373
+ figures untouched).
374
+ - Re-writes `docProps/app.xml` with the correct `Slides=` and `Notes=`
375
+ counts so PowerPoint Mac does not show its repair dialog (see also the
376
+ app.xml canonical fix in `pptx-mac-compatibility.md` §5).
377
+ - Verifies that zero notes characters remain.
378
+
379
+ Recommended 3-file sharing package (filename pattern `<topic>_<initials>`):
380
+ - `<topic>_<initials>.pptx` — notes-stripped variant for slide reuse
381
+ - `<topic>_<initials>.pdf` — same deck, PDF for environment-agnostic
382
+ preview (LibreOffice `--convert-to pdf` automatically drops the cleared
383
+ notes pages)
384
+ - `<topic>_<initials>_references.zip` — optional bundle of the reference
385
+ PDFs; if it exceeds the email attachment limit, send a Google Drive link.
386
+
387
+ In the cover email, mention the PPTX is included specifically so the
388
+ recipient can reuse individual slides if useful.
389
+
390
+ ### Architecture
391
+
392
+ ```
393
+ inline structured data (lists/dicts in build_*_slides())
394
+ ↓ template functions (T_lead / T_text / T_table / ...)
395
+ editable PPTX with native text frames (selectable, restyleable in PowerPoint)
396
+ ```
397
+
398
+ Three rules that keep slides stable:
399
+
400
+ 1. **No markdown parsing.** Every slide is a function call with explicit inline data.
401
+ 2. **No `cur_top` cumulative position tracking.** Use the fixed coordinate zones below — `cur_top` accumulates rounding errors and breaks layout after ~10 slides.
402
+ 3. **No Marp.** Marp renders to images; the deck becomes uneditable and reviewers cannot copy text or restyle.
403
+
404
+ ### Slide-type templates
405
+
406
+ | Template | Use for | Required fields |
407
+ |----------|---------|-----------------|
408
+ | `T_lead` | Title slide, section divider | `title`, `subtitle?`, `extra?` |
409
+ | `T_text` | Bullet body (most common) | `title`, `body_lines[]`, `subtitle?` |
410
+ | `T_table` | Cohort tables, comparisons | `title`, `headers[]`, `rows[][]`, `body_before?` |
411
+ | `T_image_right` | Body + figure on right | `title`, `body_lines[]`, `img_path`, `img_pct?` (PNG ≥300dpi or vector PDF — see Figure source formats below) |
412
+ | `T_quote_slide` | Verbatim citations, witness quotes | `title`, `quotes[]`, `body_after?`, `img_path?` |
413
+ | `T_two_col` | Compare/contrast | `title`, `left_lines[]`, `right_lines[]` |
414
+ | `T_two_col_with_box` | Compare + emphasis | as above + `metaphor_col`, `metaphor_lines[]` |
415
+ | `T_highlight_slide` | Single key result | `title`, `highlight_lines[]`, `body_before?` |
416
+ | `T_metaphor_body` | Body + analogy footer | `title`, `body_lines[]`, `metaphor_lines[]` |
417
+ | `T_table_two_col` | Take-aways + numeric table | `title`, `left_lines[]`, `headers[]`, `rows[][]` |
418
+
419
+ ### Figure source formats (when consuming `/make-figures` output)
420
+
421
+ When the deck pulls figures from `analysis/figures/` produced by `/make-figures`:
422
+
423
+ - **Preferred for slides**: PNG at ≥300 dpi. python-pptx `add_picture()` handles this directly. Set `img_pct` (template `T_image_right`) so the figure occupies ≥40 % of slide width on a 13.33 × 7.5-in widescreen layout.
424
+ - **Vector source available**: prefer PDF only if the slide will be projected at >1080p or printed as a handout — convert PDF → PNG at the target DPI (`pdftoppm -r 300 input.pdf out_prefix`) before insertion, because python-pptx PDF embedding is unreliable across PowerPoint versions.
425
+ - **Forbidden**: TIFF (Mac PowerPoint silently drops it — see Mac compatibility checklist below); JPEG for line art (compression artifacts on diagonal lines); raw SVG (PowerPoint Mac handles it inconsistently).
426
+ - **Caption / legend**: re-draft for spoken-narration context, not the journal legend verbatim. The journal legend assumes a reader; the slide caption assumes a listener with 5–10 seconds of attention.
427
+
428
+ ### Helpers (used by templates — usually you do not call directly)
429
+
430
+ | Helper | Role |
431
+ |--------|------|
432
+ | `_text` | Single text box with `**bold**` inline markup |
433
+ | `_multiline` | Multi-line block with bullet (`- `, `✓ `) and `### subhead` support |
434
+ | `_title_block` | Title + teal underline + optional subtitle |
435
+ | `_table` | Styled table (teal header row, alternating rows) |
436
+ | `_quote` | Blockquote — teal left bar + light-blue background |
437
+ | `_highlight` | Yellow rounded box + orange 2pt border |
438
+ | `_metaphor` | Same shape as quote, lighter font |
439
+ | `_image` | PIL aspect-preserving image insert (handles iPhone EXIF if you transpose first) |
440
+ | `_slidenum` | Bottom-right page number |
441
+
442
+ ### Design tokens (defaults — change to fit institution/journal)
443
+
444
+ ```python
445
+ NAVY = #1B2A4A # title text, section divider background
446
+ TEAL = #0072B2 # subtitle, underline, table header bg, quote bar
447
+ ORANGE = #D55E00 # highlight box border
448
+ GRAY = #333333 # body text
449
+ FONT = 'Apple SD Gothic Neo' # use a Latin-only font on non-Korean decks
450
+ ```
451
+
452
+ ### Fixed coordinate zones (16:9 = 13.333" × 7.5")
453
+
454
+ ```
455
+ ML / MR = 0.8" MT = 0.5" CW = SW − ML − MR = 11.733"
456
+
457
+ TITLE_Y = 0.5" TITLE_H = 0.8"
458
+ SUB_Y = 1.3" SUB_H = 0.5"
459
+ BODY_Y ≈ 1.9" BODY_H ≈ 5.1"
460
+ ```
461
+
462
+ ### Build script responsibilities
463
+
464
+ A from-scratch generation script must:
465
+
466
+ - Convert TIFF images to PNG before `add_picture` (Mac PowerPoint silently drops TIFF).
467
+ - Apply EXIF transpose to iPhone photos before insertion.
468
+ - After inserting/removing slides, sync `docProps/app.xml` (`<Slides>`, `<Notes>`, `HeadingPairs`, `TitlesOfParts`) to the actual count, or PowerPoint Mac will raise a recovery dialog on open.
469
+ - If you copy `<a:srcRect>` from another deck, copy the values verbatim — they are 1/1000-percent (cap 100000), never EMU. A unit conversion bug here crops 99% of the image off-slide.
470
+ - Print slide count, notes count, file size, and editability check at the end.
471
+
472
+ ### Forbidden in Mode A
473
+
474
+ - ❌ Marp CLI for PPTX (always image-rendered, uneditable).
475
+ - ❌ Markdown auto-parsing into slides (layout drifts on every regeneration).
476
+ - ❌ `cur_top` cumulative top tracking (accumulates rounding error).
477
+ - ❌ Direct iPhone photo insert without EXIF transpose (rotated 90° in PowerPoint).
478
+ - ❌ Using `python-pptx` from-scratch rebuild to *edit* an existing deck — see Patch over Rebuild below.
479
+
480
+ ### Mac PowerPoint compatibility checklist
481
+
482
+ PowerPoint Mac is stricter than Windows / Keynote / LibreOffice on OOXML defects.
483
+ Verify before delivering any deck destined for a Mac viewer:
484
+
485
+ | Defect | Detect | Fix |
486
+ |---|---|---|
487
+ | **TIFF images** | `find ppt/media -iname '*.tif*'` | `sips -s format png in.tif --out out.png` + replace `.tif`→`.png` in `_rels/*.rels` |
488
+ | **`<a:sp3d>` in rPr** | `grep -l '<a:sp3d>' ppt/slides/*.xml` | Regex-strip the `<a:sp3d>...</a:sp3d>` block (renders as red outline only on Mac) |
489
+ | **`app.xml` count mismatch** | `<Slides>` value + `HeadingPairs` count + `TitlesOfParts` size vs actual slide files | Sync all four fields to real count |
490
+ | **`srcRect` corruption** | Any value > 100000 (1/1000-percent cap) | Compare with original deck; restore verbatim |
491
+
492
+ Validation must run on **PDF export AND Mac PowerPoint** — neither alone catches all four. PDF misses `sp3d` outlines and `srcRect` corruption.
493
+
494
+ ### Patch over Rebuild — editing an existing PPTX
495
+
496
+ When the user supplies an existing deck and asks for surgical edits (textbox width, image
497
+ crop, font swap, sp3d removal), prefer **regex/sed patching of the unzipped XML** over
498
+ regenerating with `python-pptx`. From-scratch rebuild loses:
499
+
500
+ - `<a:srcRect>` image crops
501
+ - `<a:sp3d>` / `<a:scene3d>` (when intentional)
502
+ - Slide master / layout / theme details
503
+ - `app.xml` and `core.xml` metadata
504
+
505
+ ```bash
506
+ unzip -q original.pptx -d /tmp/work
507
+ python3 -c "
508
+ import re; from pathlib import Path
509
+ p = Path('/tmp/work/ppt/slides/slide23.xml')
510
+ s = p.read_text()
511
+ s = s.replace('cx=\"9504720\"', 'cx=\"11200000\"')
512
+ p.write_text(s)
513
+ "
514
+ cd /tmp/work && zip -rq ../patched.pptx . -x '*.DS_Store'
515
+ ```
516
+
517
+ `python-pptx` is reserved for (a) brand-new decks built via the templates above, or
518
+ (b) appending speaker notes via `slide.notes_slide.notes_text_frame.text`. The skill's
519
+ `scripts/inject_speaker_notes.py` is the canonical example of (b).
520
+
521
+ ### Standard structure (10–15 min paper talk)
522
+
523
+ 1. Title slide (`T_lead`) — paper citation + presenter
524
+ 2. Background (`T_text` × 1–2)
525
+ 3. Study design / Methods (`T_text` or `T_two_col`)
526
+ 4. Key results with figures (`T_image_right` / `T_table` × 2–3)
527
+ 5. Discussion (`T_text`)
528
+ 6. Limitations (`T_two_col_with_box` works well)
529
+ 7. Take-home (`T_text` or `T_highlight_slide`)
530
+
531
+ ### Output
532
+
533
+ Save to `output/presentation.pptx`. Speaker notes go into the notes pane only — never
534
+ modify slide design when adding notes.
535
+
536
+ ### Step 3.5 — Slide critic (run before delivering deck)
537
+
538
+ After exporting the PPTX, run the slide critic rubric at
539
+ `references/critic_rubrics/slide.md`. Score each slide and the deck-level Mac
540
+ compatibility checks (Section F) as PASS / PARTIAL / FAIL. Produce concrete edits for
541
+ every FAIL or PARTIAL item before treating the deck as ready.
542
+
543
+ Mandatory deck-level checks (cross-link with `~/.claude/rules/pptx-mac-compatibility.md`):
544
+
545
+ ```bash
546
+ # F.22 No TIFF
547
+ find ppt/media -iname '*.tif*' || true # must be empty
548
+
549
+ # F.23 No 3-D bevel
550
+ grep -l '<a:sp3d>' ppt/slides/*.xml # must be empty
551
+
552
+ # F.24 app.xml count sync
553
+ grep -c '<Slides>\|<Notes>' docProps/app.xml
554
+ ls ppt/slides/slide*.xml | wc -l # must match
555
+
556
+ # F.25 srcRect bounds (any value > 100000 = bug)
557
+ grep -oE '"[0-9]{6,}"' ppt/slides/*.xml | head
558
+ ```
559
+
560
+ Record `critic_pass: yes | partial | no` and `refine_rounds: N` in `_quick_review.md`.
561
+
562
+ **Mode B: Add notes to existing slides** (more common)
563
+ - Read existing PPTX to understand slide structure and count
564
+ - Map speaker script sections to corresponding slides
565
+ - Generate `inject_notes.py` script tailored to the specific presentation
566
+
567
+ ### Note Injection Script
568
+
569
+ Generate a tailored `inject_notes.py` following the pattern in
570
+ `${CLAUDE_SKILL_DIR}/scripts/inject_speaker_notes.py`. The generated script should
571
+ contain only the `notes` dictionary customized for this presentation and the main
572
+ injection loop from the template.
573
+
574
+ ### Critical Rule
575
+
576
+ **Speaker notes are injected without modifying slide design, layout, text, or images.**
577
+ The script only touches the notes pane. Verify by comparing slide content before and after.
578
+
579
+ ---
580
+
581
+ ## Phase 4: Q&A Preparation
582
+
583
+ ### Question Generation
584
+
585
+ Generate questions from multiple perspectives:
586
+
587
+ 1. **Methodology critics**: "Why this design? Why not...?"
588
+ 2. **Domain experts**: Deep technical questions about the specific field
589
+ 3. **Generalists**: "What does this mean for clinical practice?"
590
+ 4. **Students/trainees**: Clarification questions about unfamiliar concepts
591
+
592
+ ### Answer Structure
593
+
594
+ Every answer should follow the pattern:
595
+
596
+ ```
597
+ Acknowledge → Evidence → Conclude
598
+
599
+ "That's an important limitation. [Acknowledge the concern honestly.]
600
+ However, [cite specific supporting evidence — author, year, finding].
601
+ So while [restate limitation], [conclude with the paper's contribution despite it]."
602
+ ```
603
+
604
+ ### Quick Review Sheet
605
+
606
+ A single-page reference for last-minute review:
607
+
608
+ ```text
609
+ ## Quick Review
610
+
611
+ ### Must-Know Numbers
612
+ | Metric | Value | Source |
613
+ |--------|-------|--------|
614
+ | [Key stat 1] | [value] | [Ref] |
615
+ | [Key stat 2] | [value] | [Ref] |
616
+
617
+ ### Common Pitfalls
618
+ - Don't confuse [X] with [Y]
619
+ - [Classification A] and [Classification B] are independent frameworks
620
+ - Slide says [rounded value], precise value is [exact value]
621
+
622
+ ### Key Takeaways (memorize these)
623
+ 1. [Point 1]
624
+ 2. [Point 2]
625
+ 3. [Point 3]
626
+ ```
627
+
628
+ ---
629
+
630
+ ## Output File Structure
631
+
632
+ All outputs go in the user's presentation directory:
633
+
634
+ ```
635
+ {presentation_dir}/
636
+ ├── _analysis.md # Phase 0: Paper analysis + outline
637
+ ├── _references.md # Phase 1: Verified references + key data
638
+ ├── _script.md # Phase 2: Speaker script
639
+ ├── _qa_prep.md # Phase 4: Expected Q&A
640
+ ├── _quick_review.md # Phase 4: Pre-presentation review sheet + critic_pass record
641
+ ├── _slide_critic.md # Phase 3.5: Slide rubric scores per slide
642
+ ├── inject_notes.py # Phase 3: Tailored note injection script
643
+ ├── figures/ # Extracted paper figures (if needed)
644
+ └── reference/ # Supporting paper PDFs (if downloaded)
645
+ ```
646
+
647
+ ## Cross-skill / Cross-rule integration
648
+
649
+ This skill composes with adjacent skills and global rules:
650
+
651
+ | When | Use | Why |
652
+ |---|---|---|
653
+ | Need a figure on a slide (ROC, forest, KM, flow) | `/make-figures` first, then embed | Both skills share Reynolds/Knaflic/Tufte foundations; figure-level + slide-level companions |
654
+ | Manuscript reporting checklist parallel | `/check-reporting` for the same paper | Paper presentations often shadow manuscript revision; reporting-guideline gaps surface in Q&A |
655
+ | Visual abstract / Central Illustration | `/make-figures` visual-abstract templates | Then verify against `~/.claude/rules/journal-ai-image-policies.md` (JACC prohibits, Radiology allows with disclosure) |
656
+ | PPTX edits to existing institutional template | `~/.claude/rules/pptx-mac-compatibility.md` | Patch over rebuild; preserve master/layout/srcRect |
657
+ | Manuscript companion deck | `~/.claude/rules/manuscript-style-classical.md` | Heading style, AI-Disclosure policy, em-dash discipline carry over to slides for senior MA reviewer audiences |
658
+ | References on slides | `/verify-refs` (audit-only) before delivery | Same anti-hallucination gate as manuscript references |
659
+
660
+ ---
661
+
662
+ ## Constraints
663
+
664
+ - **Never fabricate references.** Every citation must be verified against PubMed, DOI, or the PDF itself.
665
+ - **Never modify slide design** when injecting notes. Notes and slides are separate concerns.
666
+ - **Always ask audience first.** Do not start drafting until the target audience is defined.
667
+ - **Extension sections are opt-in.** Do not add AI/clinical/policy sections unless explicitly requested.
668
+ - **Respect presentation time.** Script length must match allocated time (roughly 130-150 words per minute for academic presentations).
669
+
670
+ ## Anti-Hallucination
671
+
672
+ - **Never fabricate references.** All citations must be verified via `/search-lit` with confirmed DOI or PMID. Mark unverified references as `[UNVERIFIED - NEEDS MANUAL CHECK]`.
673
+ - **Never invent clinical definitions, diagnostic criteria, or guideline recommendations.** If uncertain, flag with `[VERIFY]` and ask the user.
674
+ - **Never fabricate numerical results** — compliance percentages, scores, effect sizes, or sample sizes must come from actual data or analysis output.
675
+ - If a reporting guideline item, journal policy, or clinical standard is uncertain, state the uncertainty rather than guessing.