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,278 @@
1
+ #!/usr/bin/env bash
2
+ # audit_skill.sh -- PII / hardcoded-path / metadata scanner for a single
3
+ # Claude Code skill. Standalone wrapper that mirrors the per-skill checks
4
+ # in `medsci-skills/scripts/validate_skills.sh` so a personal skill can be
5
+ # audited the same way before being moved into a public repo.
6
+ #
7
+ # Usage:
8
+ # audit_skill.sh <skill_directory> [extra_patterns]
9
+ #
10
+ # Arguments:
11
+ # skill_directory Path to a single skill (must contain SKILL.md).
12
+ # extra_patterns Optional `grep -E` alternation pattern of names /
13
+ # institutions / collaborator handles to add. Example:
14
+ # "jane doe|MIT Medical|@gmail\.com"
15
+ #
16
+ # Exit codes:
17
+ # 0 Clean -- no findings
18
+ # 1 Findings detected -- review required before publication
19
+ # 2 Usage error
20
+ #
21
+ # Coverage parity with medsci-skills/scripts/validate_skills.sh:
22
+ # rule 6 Personal precedent (text) yes
23
+ # rule 7 Absolute path leak yes
24
+ # rule 7b Real personal email yes
25
+ # rule 7c Author{Year}_ filename pattern yes
26
+ # rule 8 Blockquote dated precedent yes
27
+ # rule 10 Binary EXIF metadata (DOCX/PDF/PNG) yes (skipped silently if
28
+ # exiftool not installed)
29
+ #
30
+ # False-positive guard: text scans use `grep --binary-files=without-match`
31
+ # so compiled `.pyc`, raster `.png` byte-stream collisions, and `git` pack
32
+ # files do not count as matches. `__pycache__/` is also explicitly skipped.
33
+
34
+ set -u
35
+
36
+ if [ $# -lt 1 ] || [ $# -gt 2 ]; then
37
+ cat >&2 <<USAGE
38
+ Usage: audit_skill.sh <skill_directory> [extra_patterns]
39
+
40
+ Examples:
41
+ audit_skill.sh ~/.claude/skills/my-skill
42
+ audit_skill.sh ./skills/my-skill "jane doe|Stanford|@gmail\.com"
43
+ USAGE
44
+ exit 2
45
+ fi
46
+
47
+ SKILL_DIR="$1"
48
+ EXTRA_PATTERNS="${2:-}"
49
+
50
+ if [ ! -d "$SKILL_DIR" ]; then
51
+ echo "Error: directory not found: $SKILL_DIR" >&2
52
+ exit 2
53
+ fi
54
+
55
+ # Resolve to absolute path so the report shows useful locations.
56
+ SKILL_DIR="$(cd "$SKILL_DIR" && pwd)"
57
+
58
+ FOUND=0
59
+ TOTAL=0
60
+
61
+ # Color output only when stdout is a TTY.
62
+ if [ -t 1 ]; then
63
+ RED=$'\033[0;31m'
64
+ GRN=$'\033[0;32m'
65
+ YEL=$'\033[1;33m'
66
+ NC=$'\033[0m'
67
+ else
68
+ RED=""; GRN=""; YEL=""; NC=""
69
+ fi
70
+
71
+ # Files to exclude from text scans. Binary scan handles its own subset.
72
+ TEXT_EXCLUDES=(
73
+ --exclude-dir=.git
74
+ --exclude-dir=__pycache__
75
+ --exclude-dir=.pytest_cache
76
+ --exclude-dir=.mypy_cache
77
+ --exclude-dir=node_modules
78
+ --exclude=audit_skill.sh
79
+ --exclude=pii-patterns.md
80
+ --exclude="*.pyc"
81
+ )
82
+
83
+ # ---------------------------------------------------------------------
84
+ # Helper: scan a category of grep -E pattern over text files only.
85
+ # `--binary-files=without-match` keeps random byte sequences inside .png
86
+ # / .pdf / .docx / .pyc from triggering false positives.
87
+ # ---------------------------------------------------------------------
88
+ scan_text() {
89
+ local category="$1"
90
+ local pattern="$2"
91
+ local whitelist="${3:-}" # optional grep -E pattern; matches removed before counting
92
+ local results
93
+ results=$(grep -rinE --binary-files=without-match \
94
+ "${TEXT_EXCLUDES[@]}" \
95
+ "$pattern" "$SKILL_DIR" 2>/dev/null || true)
96
+ if [ -n "$whitelist" ] && [ -n "$results" ]; then
97
+ results=$(printf '%s\n' "$results" | grep -vE "$whitelist" || true)
98
+ fi
99
+
100
+ if [ -n "$results" ]; then
101
+ local count
102
+ count=$(printf '%s\n' "$results" | wc -l | tr -d ' ')
103
+ TOTAL=$((TOTAL + count))
104
+ FOUND=1
105
+ echo
106
+ echo "${RED}## $category${NC} ($count match(es))"
107
+ printf '%s\n' "$results" | sed 's/^/ /'
108
+ fi
109
+ }
110
+
111
+ # ---------------------------------------------------------------------
112
+ # Helper: filename pattern check. Catches the case where file CONTENT is
113
+ # fine but the filename itself reveals authorship (e.g. Nam2025_KJR_Fig01.png).
114
+ # Mirrors validate_skills.sh rule 7c.
115
+ # ---------------------------------------------------------------------
116
+ scan_filenames() {
117
+ local category="Author-style filenames (Surname{Year}_)"
118
+ local pattern='^[A-Z][a-zA-Z]{2,}[0-9]{4}_'
119
+ local allow='^(Issue|Year|Vol|Table|Figure|Sample|Example|Demo|Test|Type|Class|Group|Cohort|Study|Trial|Phase|Run|Batch|Round|Stage|Step|Item|Mode)[0-9]{4}_'
120
+ local hits=""
121
+ while IFS= read -r -d '' f; do
122
+ local base
123
+ base=$(basename "$f")
124
+ if [[ "$base" =~ $pattern ]] && ! [[ "$base" =~ $allow ]]; then
125
+ hits="${hits}${f}"$'\n'
126
+ fi
127
+ done < <(find "$SKILL_DIR" -type f \
128
+ -not -path '*/.git/*' \
129
+ -not -path '*/__pycache__/*' \
130
+ -print0 2>/dev/null)
131
+
132
+ if [ -n "$hits" ]; then
133
+ local count
134
+ count=$(printf '%s' "$hits" | grep -c '^' || true)
135
+ TOTAL=$((TOTAL + count))
136
+ FOUND=1
137
+ echo
138
+ echo "${RED}## $category${NC} ($count match(es))"
139
+ printf '%s' "$hits" | sed 's/^/ /'
140
+ fi
141
+ }
142
+
143
+ # ---------------------------------------------------------------------
144
+ # Helper: optional EXIF scan via exiftool. Skipped silently if exiftool is
145
+ # not installed (publish-skill users are not expected to have it). When
146
+ # present, mirrors validate_skills.sh rule 10.
147
+ # ---------------------------------------------------------------------
148
+ scan_exif() {
149
+ if ! command -v exiftool >/dev/null 2>&1; then
150
+ echo "${YEL}## Binary EXIF metadata${NC} skipped (exiftool not installed)"
151
+ echo " Install: brew install exiftool # macOS"
152
+ echo " sudo apt-get install -y libimage-exiftool-perl # Ubuntu"
153
+ return 0
154
+ fi
155
+
156
+ local binary_files=()
157
+ while IFS= read -r -d '' f; do
158
+ binary_files+=("$f")
159
+ done < <(find "$SKILL_DIR" -type f \
160
+ \( -iname "*.png" -o -iname "*.jpg" -o -iname "*.jpeg" \
161
+ -o -iname "*.tif" -o -iname "*.tiff" \
162
+ -o -iname "*.pdf" -o -iname "*.docx" -o -iname "*.pptx" -o -iname "*.xlsx" \) \
163
+ -print0 2>/dev/null)
164
+
165
+ if [ ${#binary_files[@]} -eq 0 ]; then
166
+ return 0
167
+ fi
168
+
169
+ local pii_pattern='/Users/[a-zA-Z]|/home/[a-zA-Z]'
170
+ if [ -n "$EXTRA_PATTERNS" ]; then
171
+ pii_pattern="${pii_pattern}|${EXTRA_PATTERNS}"
172
+ fi
173
+
174
+ local exif_dump
175
+ exif_dump=$(exiftool -S \
176
+ -Author -Creator -LastModifiedBy -LastSavedBy -Copyright -Artist \
177
+ -Owner -OwnerName -CompanyName -Manager -HostComputer -UserComment \
178
+ -Subject -Title -Description -Keywords -Comment \
179
+ -Producer -CreatorTool -Software \
180
+ "${binary_files[@]}" 2>/dev/null || true)
181
+
182
+ # exiftool only prints `======== <file>` headers when given multiple files.
183
+ # Pre-prime current_file so single-file mode still attributes hits correctly.
184
+ local current_file="${binary_files[0]}"
185
+ local hits=""
186
+ while IFS= read -r line; do
187
+ if [[ "$line" == ========\ * ]]; then
188
+ current_file="${line#======== }"
189
+ continue
190
+ fi
191
+ [ -z "$line" ] && continue
192
+ [ -z "$current_file" ] && continue
193
+ if echo "$line" | grep -qE "$pii_pattern"; then
194
+ hits="${hits}${current_file}: ${line}"$'\n'
195
+ fi
196
+ done <<< "$exif_dump"
197
+
198
+ if [ -n "$hits" ]; then
199
+ local count
200
+ count=$(printf '%s' "$hits" | grep -c '^' || true)
201
+ TOTAL=$((TOTAL + count))
202
+ FOUND=1
203
+ echo
204
+ echo "${RED}## Binary EXIF metadata${NC} ($count match(es))"
205
+ printf '%s' "$hits" | sed 's/^/ /'
206
+ fi
207
+ }
208
+
209
+ echo "=========================================="
210
+ echo "PII Audit: $SKILL_DIR"
211
+ echo "=========================================="
212
+
213
+ # --- Universal text categories -----------------------------------------
214
+
215
+ # rule 7: hardcoded user-home / project paths.
216
+ scan_text "Hardcoded Paths" \
217
+ '/Users/[a-zA-Z]|/home/[a-zA-Z]|~/Documents|~/Desktop|~/Downloads|~/Projects'
218
+
219
+ # rule 7b: real personal email addresses. The whitelist matches common
220
+ # placeholder / example / RFC-reserved domains so the script does not
221
+ # flag legitimate documentation samples.
222
+ EMAIL_WHITELIST='example\.com|example\.org|example\.net|your@email|user@host|noreply@|placeholder|<your-email>|<email>'
223
+ scan_text "Email Addresses" \
224
+ '[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}' \
225
+ "$EMAIL_WHITELIST"
226
+
227
+ # Internal infrastructure leakage.
228
+ scan_text "IP Addresses / Internal URLs" \
229
+ '\b[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\b|https?://[a-z0-9-]+\.(internal|local|corp)'
230
+
231
+ # rule 6: institutional references. `\b` word boundaries replace the
232
+ # `(?<!...)` lookbehind that the original grep -E silently failed on.
233
+ scan_text "Institutional References" \
234
+ '\b(SNUH|AMC|SMC|KAIST|SNU|ASAN|MGH|UCSF)\b|Mayo Clinic|Johns Hopkins|Samsung Medical|Severance|Asan Medical'
235
+
236
+ # rule 6 cont.: titled academic roles with adjacent surname.
237
+ scan_text "Academic Roles with Names" \
238
+ 'professor [A-Z][a-z]+|Prof\. [A-Z]|Dr\. [A-Z][a-z]+|PGY[0-9]|[가-힣]{2,4}[[:space:]]*(교수님|선생님|박사님)'
239
+
240
+ # Language-default hardcoding.
241
+ scan_text "Language Hardcoding" \
242
+ 'in Korean|한국어로|Korean language|communicate in Korean|in Japanese|in Chinese'
243
+
244
+ # Frequent-collision city names.
245
+ scan_text "Location Specifics" \
246
+ '\b(Seoul|Busan|Daegu|Tokyo|Beijing|Shanghai|Boston|Stanford)\b|서울|부산|울산|창원|대구|대전'
247
+
248
+ # rule 8: dated precedent inside blockquote (`> 2026-04-26 ...`).
249
+ # Allow-list: meta headers like "Last updated:", "Created:", "Updated:",
250
+ # "Date:" — these are routine version stamps, not internal review timeline.
251
+ scan_text "Blockquote Dated Precedent" \
252
+ '^>.*20[2-9][0-9]-[0-1][0-9]-[0-3][0-9]' \
253
+ '> *(Last updated|Created|Updated|Date|Version|Released):'
254
+
255
+ # rule 7c filename pattern.
256
+ scan_filenames
257
+
258
+ # rule 10 EXIF scan (optional).
259
+ scan_exif
260
+
261
+ # --- User-supplied identifiers ----------------------------------------
262
+ if [ -n "$EXTRA_PATTERNS" ]; then
263
+ scan_text "User-Specified Patterns" "$EXTRA_PATTERNS"
264
+ fi
265
+
266
+ # --- Summary -----------------------------------------------------------
267
+ echo
268
+ echo "=========================================="
269
+ if [ "$FOUND" -eq 0 ]; then
270
+ echo "${GRN}RESULT: CLEAN (0 findings)${NC}"
271
+ echo "=========================================="
272
+ exit 0
273
+ else
274
+ echo "${RED}RESULT: $TOTAL FINDING(S) DETECTED${NC}"
275
+ echo "Review and fix all findings before publishing."
276
+ echo "=========================================="
277
+ exit 1
278
+ fi
@@ -0,0 +1,35 @@
1
+ schema_version: 2
2
+ name: publish-skill
3
+ layer: B
4
+ owner_domain: skill_publishing
5
+
6
+ when_to_use: "Convert a personal agent skill into a distributable, OSS-ready skill: PII audit, generalization, license check, cross-platform review, packaging."
7
+ when_NOT_to_use: "Authoring a brand-new skill from scratch (out of scope; this hardens an existing one)."
8
+
9
+ inputs:
10
+ - "a personal skill directory"
11
+ outputs:
12
+ - "PII audit report"
13
+ - "generalized OSS-ready skill"
14
+ deterministic_scripts:
15
+ - scripts/audit_skill.sh
16
+ side_effects:
17
+ - writes_skill_artifacts
18
+ downstream_consumers:
19
+ - none
20
+ forbidden_actions:
21
+ - publish_skill_with_unresolved_pii
22
+ - weaken_the_pii_blocklist_to_pass
23
+
24
+ # v2.1 quality card
25
+ purpose: "Harden a personal skill for open-source release through a PII audit, generalization, and license/portability checks."
26
+ safety_boundaries:
27
+ - "Publication is gated on a passing PII audit; the blocklist is conservative and not weakened to pass."
28
+ - "Personal paths, names, and document metadata are scrubbed before release."
29
+ known_limitations:
30
+ - "The audit catches known PII patterns; novel identifiers still need human review."
31
+ - "Generalization preserves behavior but a maintainer should re-read the result."
32
+ validation_commands:
33
+ - "bash scripts/audit_skill.sh <skill-dir>"
34
+ - "bash scripts/validate_skills.sh"
35
+ evidence_surface: bundled_script
@@ -0,0 +1,146 @@
1
+ ---
2
+ name: render-pdf-doc
3
+ description: >
4
+ Render academic Markdown documents (English or Korean) to publication-quality PDF via pandoc + xelatex.
5
+ Targets non-bibliography artifacts: research proposals, IRB cover letters, briefing
6
+ handouts, anchor docs (Q&A grids), and reference tables. Auto-infers pipe-table column
7
+ widths from content (label column shrinks to fit, data columns share remaining width).
8
+ CJK-aware font fallback for Korean text (Apple SD Gothic Neo on macOS, Noto Sans CJK KR on Linux).
9
+ NOT for: manuscripts with bibliography (use /manage-refs render_pandoc.sh), Word form
10
+ filling (/fill-protocol), figures (/make-figures).
11
+ triggers: render PDF, PDF 렌더, korean PDF, 한글 PDF, anchor doc PDF, briefing PDF, proposal PDF, 연구계획서 PDF, 표 정렬 PDF, 표 폭 자동, tbl-colwidths, 학술 PDF
12
+ tools: Read, Write, Edit, Bash, Grep, Glob
13
+ model: inherit
14
+ ---
15
+
16
+ # Render-PDF-Doc Skill
17
+
18
+ Markdown + frontmatter → publication-quality academic PDF (English or Korean).
19
+
20
+ ## Why This Skill Exists
21
+
22
+ In real circulation cycles for academic PDFs, two recurring failure patterns appear:
23
+ 1. v1 drafts: change-history, version numbers, and PI attribution leak into the attached PDF, confusing the first recipient.
24
+ 2. v2 drafts: pandoc pipe-table dash ratios are misjudged, narrowing the first column and forcing label wrapping that hurts readability.
25
+
26
+ Manual fixes work but the same pattern recurs across proposals, briefings, IRB covers, exemption applications. This skill focuses on **layout** (CJK fonts + table column widths). Bibliography and CSL are handled by `/manage-refs`.
27
+
28
+ ## Boundary (separation from other skills)
29
+
30
+ | Task | Skill |
31
+ |---|---|
32
+ | Manuscript + bibliography → DOCX/PDF | `/manage-refs scripts/render_pandoc.sh` (CSL + .bib) |
33
+ | Filling an institutional .docx form | `/fill-protocol` |
34
+ | ICMJE COI form | `/fill-icmje-coi` |
35
+ | Figure / PPTX | `/make-figures`, `/present-paper` |
36
+ | **This skill**: non-bib academic markdown → PDF (proposal, briefing, anchor doc, IRB cover) | `/render-pdf-doc` |
37
+
38
+ ## Core Principles
39
+
40
+ 1. **Pipe table column widths must be inferred from content.** No equal splitting. Size the first column (label) to the longest label, and distribute the remaining width content-proportionally across the data columns.
41
+ 2. **Set the CJK font explicitly** — `mainfont` + `CJKmainfont`. The default fallback is OS-detected.
42
+ 3. **For circulation PDFs, remove change history / version numbers / PI attribution** (or split them into a supplementary). Use the frontmatter `redact_internal: true` option.
43
+ 4. **No Quarto dependency** — raw pandoc + xelatex. Quarto's `tbl-colwidths` has reported PDF regressions (issues 6089/9200).
44
+
45
+ ## Dependencies
46
+
47
+ ```bash
48
+ # Required
49
+ brew install pandoc # macOS
50
+ brew install --cask mactex-no-gui # xelatex + xeCJK (~5 GB)
51
+
52
+ # Linux
53
+ sudo apt-get install pandoc texlive-xetex texlive-lang-cjk fonts-noto-cjk
54
+ ```
55
+
56
+ Detection:
57
+ ```bash
58
+ bash scripts/check_deps.sh
59
+ ```
60
+
61
+ ## Workflow
62
+
63
+ ### Step 1 — Author markdown with frontmatter
64
+
65
+ ```yaml
66
+ ---
67
+ title: "Paper 2 Calibration Anchor — Q&A Grid"
68
+ author: "<Author Group>"
69
+ date: "2026-05-01"
70
+ mainfont: "Apple SD Gothic Neo" # macOS default
71
+ CJKmainfont: "Apple SD Gothic Neo"
72
+ geometry: "margin=0.85in"
73
+ fontsize: 11pt
74
+ linestretch: 1.25
75
+ colorlinks: true
76
+ ---
77
+ ```
78
+
79
+ For Linux/CI, use `Noto Sans CJK KR` instead. The render script auto-detects.
80
+
81
+ ### Step 2 — Infer column widths
82
+
83
+ ```bash
84
+ python scripts/infer_colwidths.py input.md > input.colwidths.md
85
+ ```
86
+
87
+ The script:
88
+ 1. Finds every pipe table block.
89
+ 2. For each column, computes display width = `max(len(header), max(len(cell)))` (CJK = 2 cells, ASCII = 1).
90
+ 3. Generates dash-row separator with proportional dash counts.
91
+ 4. Writes a new file with separator rows replaced.
92
+
93
+ Override per-table via attribute: `{tbl-colwidths="[20,40,40]"}` after caption — passes through unchanged.
94
+
95
+ ### Step 3 — Render
96
+
97
+ ```bash
98
+ bash scripts/render_pdf.sh -i input.colwidths.md -o output.pdf
99
+ ```
100
+
101
+ Or one-shot:
102
+ ```bash
103
+ bash scripts/render_pdf.sh -i input.md -o output.pdf --infer-colwidths
104
+ ```
105
+
106
+ ### Step 4 — Visual verify
107
+
108
+ Open the PDF. Check:
109
+ - The first-column labels do not wrap and stay on a single line
110
+ - Data columns have sufficient width
111
+ - No broken Korean glyphs (a Times New Roman fallback means CJKmainfont was not applied)
112
+ - No change history / internal version numbers exposed
113
+
114
+ ## Templates
115
+
116
+ Starter markdown in `templates/` (English default; a Korean variant `*_ko.md` ships alongside each):
117
+ - `anchor-doc.md` — Q&A grid
118
+ - `proposal-cover.md` — research-proposal cover page
119
+ - `briefing-handout.md` — meeting brief (1-page)
120
+ - `reference-table.md` — comparison-table format
121
+
122
+ Each template marks slots with a `<!-- TODO: -->` marker.
123
+
124
+ ## Anti-Patterns
125
+
126
+ | Anti-pattern | Consequence |
127
+ |---|---|
128
+ | Equal dash split (`\|---\|---\|---\|`) | A column with only a short label gets the same width → cramped data columns |
129
+ | `CJKmainfont` not set | Hangul falls back to Times New Roman (broken Latin glyphs or blanks) |
130
+ | Change history / version (e.g. v3.2.2) / PI attribution exposed in a circulation PDF | Confuses the first recipient; leaks internal information |
131
+ | Quarto `tbl-colwidths` for PDF | PDF regression in Quarto 1.4+ — trust HTML only |
132
+
133
+ ## Files
134
+
135
+ - `scripts/render_pdf.sh` — pandoc + xelatex wrapper, OS font detection
136
+ - `scripts/infer_colwidths.py` — auto-generates pipe-table separator dash ratios
137
+ - `scripts/check_deps.sh` — checks for pandoc / xelatex / CJK font
138
+ - `templates/` — 4 starters (English) + their `*_ko.md` Korean variants
139
+ - `references/pandoc_korean_cheatsheet.md` — collection of frontmatter patterns (Korean-PDF reference)
140
+ - `references/known_pitfalls.md` — em-dash line breaks, smart quotes, etc. (Korean-PDF reference)
141
+
142
+ ## Anti-Hallucination
143
+
144
+ - Numerical content in tables: apply `~/.claude/rules/numerical-safety.md`. Read from CSV.
145
+ - References: use `/manage-refs` separately — this skill does not handle bib.
146
+ - When producing a circulation PDF, apply `~/.claude/rules/senior-mentor-circulation.md` (preserve the primary source) + `~/.claude/rules/ai-drafted-document-policy.md`.
@@ -0,0 +1,53 @@
1
+ # Known Pitfalls — Korean Academic PDF via pandoc + xelatex
2
+
3
+ > Locale: Korean. This reference intentionally contains Korean examples — it demonstrates Korean-PDF rendering failure modes (a locale feature of `/render-pdf-doc`). See `docs/locale_inventory.md`.
4
+
5
+ ## 1. 균등 분할 dash separator (`|---|---|---|`)
6
+
7
+ **증상**: 첫 열에 짧은 라벨만 있어도 데이터 열과 같은 폭 → 데이터 wrap, 가독성 저하.
8
+
9
+ **해결**: `scripts/infer_colwidths.py` 사용. Header + cell content 최대 display-width(CJK=2)에 비례한 dash count로 separator 행을 교체.
10
+
11
+ 수동 override: `{tbl-colwidths="[20,40,40]"}` 캡션 뒤에 부착 (Quarto 1.4+ HTML만; PDF는 위 스크립트 권장).
12
+
13
+ ## 2. CJKmainfont 미설정 → Hangul fallback
14
+
15
+ **증상**: Times New Roman 등 라틴 폰트로 fallback. 한글 글자가 빈 □ 또는 깨진 글리프로 출력.
16
+
17
+ **해결**: frontmatter에 `mainfont` + `CJKmainfont` 모두 명시. macOS는 `Apple SD Gothic Neo`, Linux는 `Noto Sans CJK KR`. xeCJK는 xelatex와 함께 자동 로드.
18
+
19
+ ## 3. CJKmainfont 설정 시 smart quotes 깨짐
20
+
21
+ **증상**: pandoc issue 7509 — CJKmainfont 활성화 시 `"hello"`의 곧은 따옴표가 CJK 폰트로 렌더되어 `”hello”` 처럼 보임.
22
+
23
+ **해결**: 본문에 영문 quote 많을 때만 영향. 필요 시 `--smart=off` 또는 본문 quote를 `\enquote{...}`로 명시.
24
+
25
+ ## 4. Em-dash 줄바꿈 깨짐
26
+
27
+ **증상**: `—` 양쪽 공백 없이 사용 시 xelatex가 줄바꿈 안 함 → 우측 마진 침범.
28
+
29
+ **해결**: 본문에서는 em-dash 25개 미만 권장 (`~/.claude/rules/manuscript-style-classical.md` §8). 필요 시 양쪽 공백 추가 또는 `\,—\,`.
30
+
31
+ ## 5. 회람 PDF에 변경이력 / 버전번호 / PI attribution 노출
32
+
33
+ **증상**: 첫 수신자가 "v3.2.2" 같은 내부 버전·작성자 코멘트를 보고 혼란.
34
+
35
+ **해결**: 회람용 markdown은 별도 파일로 (`anchor_circulation.md` 등). 변경이력 섹션은 supplementary로 분리. frontmatter `redact_internal: true` 옵션은 future work.
36
+
37
+ ## 6. xelatex 미설치 (Linux CI)
38
+
39
+ ```bash
40
+ sudo apt-get install -y texlive-xetex texlive-lang-cjk fonts-noto-cjk
41
+ ```
42
+
43
+ macOS는 `brew install --cask mactex-no-gui` (~5 GB) 또는 `basictex` + `tlmgr install xecjk` (경량).
44
+
45
+ ## 7. Pipe table 안에 ` | ` 문자
46
+
47
+ **증상**: 셀 본문에 `|`가 있으면 컬럼이 잘못 분리됨.
48
+
49
+ **해결**: `\|` escape, 또는 grid table (`+---+---+`) 사용. infer_colwidths.py는 pipe table만 처리.
50
+
51
+ ## 8. Quarto `tbl-colwidths` PDF regression
52
+
53
+ Quarto 1.4+에서 PDF에서는 무시되는 케이스 보고 (issues 6089, 9200). HTML은 OK. PDF 신뢰 불가 → raw pandoc + infer_colwidths 사용.
@@ -0,0 +1,77 @@
1
+ # Pandoc Korean PDF Cheatsheet
2
+
3
+ > Locale: Korean. This reference intentionally contains Korean examples — it documents how to render Korean academic PDFs (a locale feature of `/render-pdf-doc`). See `docs/locale_inventory.md`.
4
+
5
+ ## 검증된 frontmatter 패턴
6
+
7
+ ```yaml
8
+ ---
9
+ title: "문서 제목"
10
+ author: "작성자"
11
+ date: "2026-05-01"
12
+ mainfont: "Apple SD Gothic Neo" # macOS / Linux: "Noto Serif CJK KR"
13
+ CJKmainfont: "Apple SD Gothic Neo" # macOS / Linux: "Noto Sans CJK KR"
14
+ geometry: "margin=0.85in" # cover/proposal: 1in / briefing: 0.75in
15
+ fontsize: 11pt # briefing: 10pt
16
+ linestretch: 1.25 # cover: 1.5 / briefing: 1.2
17
+ colorlinks: true
18
+ ---
19
+ ```
20
+
21
+ ## 명령어 (raw pandoc)
22
+
23
+ ```bash
24
+ pandoc input.md \
25
+ --pdf-engine=xelatex \
26
+ -o output.pdf
27
+ ```
28
+
29
+ OS-detect 자동화는 `scripts/render_pdf.sh` 참고.
30
+
31
+ ## 표 폭 자동 추론
32
+
33
+ ```bash
34
+ # 1) 분리행 dash 비율을 content-proportional로 교체
35
+ python3 scripts/infer_colwidths.py input.md --out input.cw.md
36
+
37
+ # 2) 렌더
38
+ pandoc input.cw.md --pdf-engine=xelatex -o output.pdf
39
+ ```
40
+
41
+ 또는 wrapper 한 번에:
42
+ ```bash
43
+ bash scripts/render_pdf.sh -i input.md -o output.pdf --infer-colwidths
44
+ ```
45
+
46
+ ## Per-document 폰트 커스터마이즈
47
+
48
+ frontmatter > `--font` CLI > OS default (낮은 우선순위).
49
+
50
+ ```bash
51
+ bash scripts/render_pdf.sh -i input.md --font "Nanum Myeongjo" --cjk-font "Nanum Myeongjo"
52
+ ```
53
+
54
+ ## 폰트 후보 (한글 학술용)
55
+
56
+ | 폰트 | 비고 |
57
+ |------|------|
58
+ | Apple SD Gothic Neo | macOS 기본, sans, 가장 깔끔 |
59
+ | Noto Sans CJK KR | Linux 기본 |
60
+ | Noto Serif CJK KR | 본문 serif |
61
+ | Nanum Myeongjo | 명조계 (전통적) |
62
+ | Nanum Gothic | 고딕계 sans |
63
+ | Pretendard | 모던 sans, 별도 설치 |
64
+
65
+ ## 추가 옵션
66
+
67
+ - `--toc` — 목차 생성 (긴 proposal에 유용)
68
+ - `--number-sections` — 자동 섹션 번호
69
+ - `-V documentclass=article` (default) / `report` / `book`
70
+ - `-V papersize=a4` — A4 (default: letter)
71
+
72
+ ## 참고 링크
73
+
74
+ - [Pandoc User Guide](https://pandoc.org/MANUAL.html)
75
+ - [Pandoc with Chinese (CJK applies)](https://github.com/jgm/pandoc/wiki/Pandoc-with-Chinese)
76
+ - [Quarto tbl-colwidths](https://quarto.org/docs/authoring/tables.html#column-widths) (HTML 신뢰; PDF regression 주의)
77
+ - [Issue 7509 — CJKmainfont smart quotes](https://github.com/jgm/pandoc/issues/7509)
@@ -0,0 +1,42 @@
1
+ #!/usr/bin/env bash
2
+ # check_deps.sh — verify pandoc + xelatex + CJK font availability.
3
+ set -u
4
+
5
+ ok=0
6
+ fail=0
7
+
8
+ check() {
9
+ local name="$1"; shift
10
+ if "$@" >/dev/null 2>&1; then
11
+ echo "[OK] $name"
12
+ ok=$((ok + 1))
13
+ else
14
+ echo "[MISS] $name"
15
+ fail=$((fail + 1))
16
+ fi
17
+ }
18
+
19
+ check "pandoc" command -v pandoc
20
+ check "xelatex" command -v xelatex
21
+
22
+ if [[ "$(uname)" == "Darwin" ]]; then
23
+ if /usr/bin/fc-list 2>/dev/null | grep -qi "Apple SD Gothic Neo" \
24
+ || system_profiler SPFontsDataType 2>/dev/null | grep -qi "Apple SD Gothic Neo"; then
25
+ echo "[OK] Apple SD Gothic Neo (macOS)"
26
+ ok=$((ok + 1))
27
+ else
28
+ echo "[WARN] Apple SD Gothic Neo not detected — falling back to default fontconfig"
29
+ fi
30
+ else
31
+ if fc-list 2>/dev/null | grep -qi "Noto.*CJK.*KR"; then
32
+ echo "[OK] Noto Sans/Serif CJK KR"
33
+ ok=$((ok + 1))
34
+ else
35
+ echo "[MISS] Noto CJK KR — apt install fonts-noto-cjk"
36
+ fail=$((fail + 1))
37
+ fi
38
+ fi
39
+
40
+ echo
41
+ echo "Summary: $ok ok, $fail fail"
42
+ exit $fail