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,174 @@
1
+ #!/usr/bin/env python3
2
+ """Categorical-implied-zero (structural-zero) detector for clean-data Stage 2.
3
+
4
+ A dose/duration variable anchored to a categorical exposure has a known zero at
5
+ the reference level: a never-smoker's pack-years is 0 *by definition*, not
6
+ missing. When that implied zero is instead stored as NULL/blank, two downstream
7
+ failures follow — a complete-case model silently drops the whole unexposed
8
+ stratum, or MICE imputes a non-zero dose for people who have no exposure — both
9
+ of which corrupt the exposure contrast. This script finds those contradiction
10
+ rows so they are fixed at cleaning time (set 0 at the reference level; impute
11
+ only the residual missingness among the exposed).
12
+
13
+ INPUTS
14
+ --data CSV with one row per subject.
15
+ --category-col categorical exposure column (e.g. smoking_status).
16
+ --reference-level value of the category that implies a zero dose (e.g. never).
17
+ --dose-col dose/duration column that should be 0 at the reference level
18
+ (e.g. pack_years). Repeatable for several dose columns.
19
+
20
+ OUTPUT
21
+ Per (reference-level, dose) pair: counts of
22
+ - implied_zero_missing : category == reference AND dose is NULL/blank (FIX)
23
+ - implied_zero_nonzero : category == reference AND dose > 0 (mislabeled — review)
24
+ - implied_zero_ok : category == reference AND dose == 0
25
+ Exit 1 (with --strict) if any implied_zero_missing rows exist.
26
+
27
+ Stdlib-only (csv / json / argparse). Exit codes: 0 clean (or report-only),
28
+ 1 contradiction rows found (with --strict), 2 input/usage error.
29
+ """
30
+
31
+ from __future__ import annotations
32
+
33
+ import argparse
34
+ import csv
35
+ import json
36
+ import sys
37
+ from pathlib import Path
38
+
39
+ NULLISH = {"", "na", "n/a", "nan", "null", "none", ".", "missing"}
40
+
41
+
42
+ def _is_null(v: str) -> bool:
43
+ return v.strip().lower() in NULLISH
44
+
45
+
46
+ def _to_float(v: str):
47
+ try:
48
+ return float(v.strip())
49
+ except (ValueError, AttributeError):
50
+ return None
51
+
52
+
53
+ def _norm(s: str) -> str:
54
+ return s.strip().lower()
55
+
56
+
57
+ def analyze(data: str, category_col: str, reference: str, dose_cols: list[str]) -> dict:
58
+ p = Path(data)
59
+ if not p.is_file():
60
+ sys.stderr.write(f"ERROR: data file not found: {data}\n")
61
+ sys.exit(2)
62
+ with p.open(encoding="utf-8-sig", newline="") as f:
63
+ reader = csv.DictReader(f)
64
+ if reader.fieldnames is None:
65
+ sys.stderr.write("ERROR: empty CSV\n")
66
+ sys.exit(2)
67
+ fields = {_norm(c): c for c in reader.fieldnames}
68
+ cat_key = fields.get(_norm(category_col))
69
+ if cat_key is None:
70
+ sys.stderr.write(f"ERROR: category column '{category_col}' not in {reader.fieldnames}\n")
71
+ sys.exit(2)
72
+ dose_keys = {}
73
+ for d in dose_cols:
74
+ k = fields.get(_norm(d))
75
+ if k is None:
76
+ sys.stderr.write(f"ERROR: dose column '{d}' not in {reader.fieldnames}\n")
77
+ sys.exit(2)
78
+ dose_keys[d] = k
79
+ rows = list(reader)
80
+
81
+ ref = _norm(reference)
82
+ results = []
83
+ total_missing = 0
84
+ for d, dkey in dose_keys.items():
85
+ miss = nonzero = ok = ref_n = 0
86
+ for r in rows:
87
+ if _norm(r.get(cat_key, "")) != ref:
88
+ continue
89
+ ref_n += 1
90
+ raw = r.get(dkey, "")
91
+ if _is_null(raw):
92
+ miss += 1
93
+ else:
94
+ val = _to_float(raw)
95
+ if val is None:
96
+ continue # non-numeric, not our concern here
97
+ if val > 0:
98
+ nonzero += 1
99
+ else:
100
+ ok += 1
101
+ total_missing += miss
102
+ results.append({
103
+ "dose_col": d,
104
+ "reference_level": reference,
105
+ "reference_n": ref_n,
106
+ "implied_zero_missing": miss,
107
+ "implied_zero_nonzero": nonzero,
108
+ "implied_zero_ok": ok,
109
+ "verdict": "FIX_STRUCTURAL_ZERO" if miss else ("REVIEW_MISLABEL" if nonzero else "OK"),
110
+ })
111
+
112
+ return {
113
+ "data": str(p),
114
+ "category_col": category_col,
115
+ "n_rows": len(rows),
116
+ "results": results,
117
+ "total_implied_zero_missing": total_missing,
118
+ "suggested_fix": (
119
+ f"Set dose = 0 where {category_col} == '{reference}' (structural zero), "
120
+ "then impute only the residual missingness among the exposed."
121
+ ) if total_missing else None,
122
+ }
123
+
124
+
125
+ def render(result: dict) -> str:
126
+ lines = [
127
+ "| Dose col | ref n | implied-zero MISSING | nonzero (mislabel) | zero (ok) | Verdict |",
128
+ "|---|---|---|---|---|---|",
129
+ ]
130
+ for r in result["results"]:
131
+ mark = {"FIX_STRUCTURAL_ZERO": "✗ Fix", "REVIEW_MISLABEL": "△ Review", "OK": "✓"}[r["verdict"]]
132
+ lines.append(
133
+ f"| {r['dose_col']} | {r['reference_n']} | {r['implied_zero_missing']} | "
134
+ f"{r['implied_zero_nonzero']} | {r['implied_zero_ok']} | {mark} |"
135
+ )
136
+ return "\n".join(lines)
137
+
138
+
139
+ def main() -> int:
140
+ ap = argparse.ArgumentParser(description="Categorical-implied-zero (structural-zero) detector.")
141
+ ap.add_argument("--data", required=True, help="subject-level CSV")
142
+ ap.add_argument("--category-col", required=True, help="categorical exposure column")
143
+ ap.add_argument("--reference-level", required=True, help="category value implying a zero dose")
144
+ ap.add_argument("--dose-col", required=True, action="append",
145
+ help="dose/duration column (repeatable)")
146
+ ap.add_argument("--out", help="write JSON artifact to this path")
147
+ ap.add_argument("--strict", action="store_true", help="exit 1 if any implied-zero-missing rows")
148
+ args = ap.parse_args()
149
+
150
+ result = analyze(args.data, args.category_col, args.reference_level, args.dose_col)
151
+
152
+ print("=" * 41)
153
+ print(" Categorical-Implied-Zero (structural zero)")
154
+ print("=" * 41)
155
+ print(f"category: {args.category_col} == '{args.reference_level}'")
156
+ print(render(result))
157
+ print()
158
+ if result["total_implied_zero_missing"]:
159
+ print(f"FIX: {result['total_implied_zero_missing']} reference-level row(s) store the implied "
160
+ f"zero as missing.")
161
+ print(result["suggested_fix"])
162
+ else:
163
+ print("OK: no categorical-implied-zero stored as missing.")
164
+
165
+ if args.out:
166
+ Path(args.out).parent.mkdir(parents=True, exist_ok=True)
167
+ Path(args.out).write_text(json.dumps(result, indent=2), encoding="utf-8")
168
+ print(f"\nwrote {args.out}")
169
+
170
+ return 1 if (args.strict and result["total_implied_zero_missing"]) else 0
171
+
172
+
173
+ if __name__ == "__main__":
174
+ sys.exit(main())
@@ -0,0 +1,35 @@
1
+ schema_version: 2
2
+ name: clean-data
3
+ layer: B
4
+ owner_domain: data_preparation
5
+
6
+ when_to_use: "Profile and clean clinical CSV/Excel data through a three-stage workflow with user approval at each gate."
7
+ when_NOT_to_use: "Removing PHI (use deidentify); statistical analysis (use analyze-stats)."
8
+
9
+ inputs:
10
+ - "raw analysis dataset (CSV/Excel)"
11
+ outputs:
12
+ - "data profile report"
13
+ - "cleaning code"
14
+ - "cleaned dataset"
15
+ side_effects:
16
+ - writes_project_artifacts
17
+ downstream_consumers:
18
+ - analyze-stats
19
+ - version-dataset
20
+ forbidden_actions:
21
+ - auto_clean_without_user_approval
22
+ - drop_rows_or_impute_silently
23
+
24
+ # v2.1 quality card
25
+ purpose: "Profile, flag, and code-generate cleaning steps for clinical tabular data, with a researcher approval gate at every stage."
26
+ safety_boundaries:
27
+ - "Never auto-cleans; every decision (missing values, outliers, dups, types) requires user confirmation."
28
+ - "All transforms are emitted as reviewable code, not applied silently."
29
+ known_limitations:
30
+ - "Heuristic flags need clinical judgement; the skill does not decide what is a true outlier."
31
+ - "No standalone demo; correctness depends on user approvals."
32
+ validation_commands:
33
+ - "re-run the emitted cleaning code and re-profile"
34
+ - "/version-dataset for a manifest"
35
+ evidence_surface: manual_workflow
@@ -0,0 +1,8 @@
1
+ id,smoking_status,pack_years
2
+ 1,never,
3
+ 2,never,
4
+ 3,never,0
5
+ 4,former,20
6
+ 5,current,30
7
+ 6,never,5
8
+ 7,current,
@@ -0,0 +1,49 @@
1
+ #!/usr/bin/env bash
2
+ # Regression test for the categorical-implied-zero (structural-zero) detector.
3
+ # Synthetic fixture: never-smokers with NULL pack-years (the bug), one with an
4
+ # explicit 0 (ok), one mislabeled with a positive dose. Stdlib-only (python3).
5
+ set -u
6
+
7
+ HERE="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
8
+ SCRIPT="$HERE/../scripts/check_structural_zero.py"
9
+ FIXTURE="$HERE/fixtures/smoking.csv"
10
+ OUT="$(mktemp -t sz_XXXX).json"
11
+ trap 'rm -f "$OUT"' EXIT
12
+
13
+ fail=0
14
+ check() { local label="$1"; shift
15
+ if "$@" >/dev/null 2>&1; then printf ' PASS %s\n' "$label"
16
+ else printf ' FAIL %s\n' "$label"; fail=$((fail+1)); fi
17
+ }
18
+
19
+ [[ -f "$SCRIPT" ]] || { echo "ENV-ERR: script missing" >&2; exit 2; }
20
+ [[ -f "$FIXTURE" ]] || { echo "ENV-ERR: fixture missing" >&2; exit 2; }
21
+
22
+ python3 "$SCRIPT" --data "$FIXTURE" --category-col smoking_status \
23
+ --reference-level never --dose-col pack_years --out "$OUT" --strict >/dev/null 2>&1
24
+ check "exit 1 under --strict (implied-zero missing present)" test "$?" -eq 1
25
+ check "JSON artifact written" test -s "$OUT"
26
+
27
+ check "implied_zero_missing == 2" python3 -c "
28
+ import json; d=json.load(open('$OUT'))
29
+ assert d['total_implied_zero_missing']==2, d['total_implied_zero_missing']"
30
+ check "implied_zero_nonzero (mislabel) == 1" python3 -c "
31
+ import json; d=json.load(open('$OUT'))
32
+ assert d['results'][0]['implied_zero_nonzero']==1"
33
+ check "implied_zero_ok == 1" python3 -c "
34
+ import json; d=json.load(open('$OUT'))
35
+ assert d['results'][0]['implied_zero_ok']==1"
36
+ check "reference_n == 4 (never-smokers)" python3 -c "
37
+ import json; d=json.load(open('$OUT'))
38
+ assert d['results'][0]['reference_n']==4"
39
+ check "verdict FIX_STRUCTURAL_ZERO" python3 -c "
40
+ import json; d=json.load(open('$OUT'))
41
+ assert d['results'][0]['verdict']=='FIX_STRUCTURAL_ZERO'"
42
+
43
+ # Clean case: a reference level with no missing dose -> exit 0 under --strict.
44
+ python3 "$SCRIPT" --data "$FIXTURE" --category-col smoking_status \
45
+ --reference-level former --dose-col pack_years --strict >/dev/null 2>&1
46
+ check "exit 0 when reference level has no missing dose" test "$?" -eq 0
47
+
48
+ echo "fail=$fail"; [[ "$fail" -eq 0 ]] && echo "ALL PASS" || echo "FAILURES: $fail"
49
+ exit "$fail"
@@ -0,0 +1,264 @@
1
+ ---
2
+ name: cross-national
3
+ description: End-to-end cross-national comparison study using KNHANES + NHANES + CHNS (or other parallel surveys). Variable harmonization, parallel weighted analysis, and comparison tables. Supports 2-country (KR+US) and 3-country (KR+US+CN) designs.
4
+ triggers: cross-national, 한미 비교, Korea US comparison, KNHANES NHANES, 양국 비교, binational, cross-country, 비교연구, 3국 비교, CHNS, 한미중
5
+ tools: Read, Write, Edit, Bash, Grep, Glob
6
+ model: opus
7
+ ---
8
+
9
+ # Cross-National Comparison Study Skill
10
+
11
+ You are assisting a medical researcher in conducting a cross-national comparison study
12
+ using parallel nationally representative surveys (e.g., KNHANES for Korea, NHANES for the US, CHNS for China).
13
+
14
+ ## When to Use
15
+
16
+ - Researcher has a clinical question to compare across two countries
17
+ - KNHANES + NHANES data available (or other parallel survey pairs)
18
+ - Goal: produce a complete analysis with country-stratified results + comparison table
19
+
20
+ ## Inputs
21
+
22
+ 1. **Research question**: exposure → outcome association to compare across countries
23
+ 2. **Korean data path**: KNHANES CSV file
24
+ 3. **US data path**: NHANES CSV directory (multiple tables to merge)
25
+ 4. **Harmonization table** (optional): CSV mapping variables across surveys
26
+ - Default: replicate-study skill's `harmonization_knhanes_nhanes.csv`
27
+
28
+ ## Reference Files
29
+
30
+ - Harmonization table: `medsci-skills/skills/replicate-study/references/harmonization_knhanes_nhanes.csv`
31
+ - Upstream:
32
+ - `medsci-skills/skills/write-paper/references/paper_types/cross_national.md` — writing template
33
+ - `medsci-skills/skills/analyze-stats/references/analysis_guides/survey_weighted.md`
34
+
35
+ ## Workflow
36
+
37
+ ### Phase 1: Study Definition
38
+
39
+ 1. Confirm research question: Exposure → Outcome
40
+ 2. Define variable coding for both countries:
41
+ - Exposure: PHQ-9, BMI category, smoking, etc.
42
+ - Outcome: diabetes, hypertension, mortality, etc.
43
+ - Covariates: age, sex, education, income, smoking, alcohol, obesity, CVD
44
+ 3. Check harmonization table for variable availability
45
+ 4. Output: study protocol summary for user approval
46
+
47
+ ### Phase 2: Data Preparation
48
+
49
+ **KNHANES (single CSV)**:
50
+ 1. Load CSV, filter age ≥20 (or per protocol)
51
+ 2. Derive variables using KNHANES coding:
52
+ - Smoking: BS3_1 (1,2=current, 3=former, 8=never)
53
+ - Alcohol: BD1_11 (2-6=frequent, 1=occasional, 8=never)
54
+ - Obesity: HE_obe (≥4=obesity for BMI≥25 Asian cutoff)
55
+ - PHQ-9: BP_PHQ_1~9, sum score, ≥10=depression
56
+ - Diabetes: HE_glu≥126 | HE_HbA1c≥6.5 | DE1_dg=1
57
+ - CVD: DI4_dg=1 | DI5_dg=1 | DI6_dg=1
58
+ 3. Set survey design: svydesign(id=~psu, strata=~kstrata, weights=~wt_itvex, nest=TRUE)
59
+
60
+ **NHANES (multiple CSVs)**:
61
+ 1. Load and merge tables by SEQN (DEMO_J, DPQ_J, GHB_J, BIOPRO_J, BMX_J, SMQ_J, ALQ_J, DIQ_J, MCQ_J, BPQ_J)
62
+ 2. Derive variables using NHANES coding:
63
+ - Smoking: SMQ020 + SMQ040 (100 cigs + now smoke)
64
+ - Alcohol: ALQ121 (past 12 mo frequency → categories)
65
+ - Obesity: BMXBMI ≥30 (WHO cutoff, NOT Asian)
66
+ - PHQ-9: DPQ010~DPQ090, sum score, ≥10=depression
67
+ - Diabetes: LBXSGL≥126 | LBXGH≥6.5 | DIQ010=="Yes" (CRITICAL: LBXSGL not LBXSGLU)
68
+ - CVD: MCQ160B=="Yes" (CHF) | MCQ160C=="Yes" (CHD) | MCQ160D=="Yes" (angina) | MCQ160E=="Yes" (MI)
69
+ - HTN: BPXOSY3≥140 | BPXODI3≥90 | BPQ020=="Yes"
70
+ 3. Set survey design: svydesign(id=~SDMVPSU, strata=~SDMVSTRA, weights=~WTMECPRP, nest=TRUE)
71
+
72
+ ### Phase 3: Parallel Analysis
73
+
74
+ For EACH country independently:
75
+ 1. **Table 1**: Baseline characteristics by exposure (weighted counts + percentages)
76
+ 2. **Main analysis**: Sequential logistic regression models
77
+ - Model 1 (unadjusted)
78
+ - Model 2 (age + sex)
79
+ - Model 3 (fully adjusted: + education, income, smoking, alcohol, obesity, CVD)
80
+ 3. **Subgroup analyses**: By sex, age group, education, income, alcohol, smoking, CVD, obesity
81
+ 4. **Dose-response** (if applicable): RCS with 3 knots
82
+
83
+ ### Phase 4: Cross-National Comparison Table
84
+
85
+ Generate a side-by-side comparison:
86
+
87
+ | Analysis | Korea wOR (95% CI) | US wOR (95% CI) | Direction Agreement |
88
+ |----------|-------------------|-----------------|---------------------|
89
+ | Overall (fully adjusted) | ... | ... | ✓/✗ |
90
+ | Male | ... | ... | |
91
+ | Female | ... | ... | |
92
+ | ... | ... | ... | |
93
+
94
+ ### Phase 5: Output Files
95
+
96
+ ```
97
+ {working_dir}/
98
+ ├── cross_national_report.md — Study summary + comparison tables
99
+ ├── variable_mapping.csv — Variable mapping with match status
100
+ ├── analysis_korea.R — KNHANES analysis (self-contained)
101
+ ├── analysis_us.R — NHANES analysis (self-contained)
102
+ ├── results/
103
+ │ ├── table1_korea.csv
104
+ │ ├── table1_us.csv
105
+ │ ├── main_results_comparison.csv
106
+ │ └── subgroup_comparison.csv
107
+ └── manuscript_draft/ — Optional: Methods + Results draft
108
+ ├── methods_draft.md
109
+ └── results_draft.md
110
+ ```
111
+
112
+ ## Critical Rules
113
+
114
+ 1. **NEVER pool data across countries**. Each country analyzed with its own survey design.
115
+ 2. **Country-specific BMI cutoffs**: Korea ≥25 (Asian), US ≥30 (WHO).
116
+ 3. **Country-specific income**: KNHANES quartile, NHANES PIR → harmonize to binary.
117
+ 4. **Weighted analysis mandatory**: Both KNHANES and NHANES are complex surveys.
118
+ 5. **Document all harmonization decisions**: What matches, what needed recoding, what differs.
119
+ 6. **Same analytic approach**: Identical model specifications for both countries for fair comparison.
120
+
121
+ ## KNHANES Variable Coding Reference (validated via Joo 2026 replication)
122
+
123
+ | Variable | Raw Var | Coding |
124
+ |----------|---------|--------|
125
+ | Smoking | BS3_1 | 1,2=Current; 3=Former; 8=Never |
126
+ | Alcohol | BD1_11 | 2-6=Frequent (current drinker); 1=Occasional (past-year abstainer); 8=Never |
127
+ | Obesity | HE_obe | 1-3=Normal; 4-6=Obesity (BMI≥25) |
128
+ | Depression | BP_PHQ_1~9 | Sum ≥10 = depression |
129
+ | Diabetes | HE_glu, HE_HbA1c, DE1_dg | FPG≥126 or HbA1c≥6.5 or DE1_dg=1 |
130
+ | CVD | DI4_dg, DI5_dg, DI6_dg | Any = 1 → CVD yes |
131
+ | Education | edu | 1-3=Non-college; 4=College |
132
+ | Income | incm | 1-3=Bottom 80%; 4=Top 20% |
133
+ | Survey design | kstrata, psu, wt_itvex | strata, cluster, weight |
134
+
135
+ ## NHANES Variable Coding Reference (validated via Joo 2026 cross-national)
136
+
137
+ **CRITICAL**: NHANES data downloaded via R `nhanesA` package uses TEXT LABELS, not numeric codes.
138
+
139
+ | Variable | Raw Var | Text Labels → Numeric |
140
+ |----------|---------|----------------------|
141
+ | PHQ-9 items | DPQ010~DPQ090 | "Not at all"→0, "Several days"→1, "More than half the days"→2, "Nearly every day"→3 |
142
+ | Sex | RIAGENDR | "Male" / "Female" (NOT 1/2) |
143
+ | Smoking (100 cigs) | SMQ020 | "Yes" / "No" |
144
+ | Smoking (now) | SMQ040 | "Every day" / "Some days" / "Not at all" |
145
+ | Alcohol freq | ALQ121 | Text labels (see below) |
146
+ | Alcohol ever | ALQ111 | "Yes" / "No" |
147
+ | Education | DMDEDUC2 | 5 text levels (see SKILL.md Phase 2) |
148
+ | Diabetes dx | DIQ010 | "Yes" / "No" / "Borderline" |
149
+ | CVD (CHF) | MCQ160B | "Yes" / "No" / "Don't know" |
150
+ | CVD (CHD) | MCQ160C | "Yes" / "No" / "Don't know" |
151
+ | CVD (angina) | MCQ160D | "Yes" / "No" / "Don't know" |
152
+ | Fasting glucose | LBXSGL (BIOPRO_J) | Numeric (mg/dL) — note: NOT LBXSGLU |
153
+ | HbA1c | LBXGH (GHB_J) | Numeric (%) |
154
+ | BMI | BMXBMI (BMX_J) | Numeric (kg/m²) |
155
+ | Weight | WTMEC2YR (single-cycle) or WTMECPRP (pre-pandemic pooled) | Numeric |
156
+ | Strata | SDMVSTRA | Numeric |
157
+ | PSU | SDMVPSU | Numeric |
158
+
159
+ ### ALQ121 Text Label Mapping (Alcohol Frequency)
160
+ - Frequent (current drinker): Any specific frequency except "Never in the last year"
161
+ - Occasional (past-year abstainer): "Never in the last year"
162
+ - Never (lifetime non-drinker): ALQ111 == "No" (ALQ121 will be NA)
163
+
164
+ ### Additional KNHANES Variables (validated via LE8-Asthma replication)
165
+
166
+ | Variable | Raw Var | Coding |
167
+ |----------|---------|--------|
168
+ | Asthma | DJ2_dg | 0=No, 1=Yes (physician dx), 9=Don't know → exclude |
169
+ | Asthma treatment | DJ2_pt | 0=No, 1=Yes, 8=N/A, 9=Don't know |
170
+ | Sleep (2017-18) | BP16_11/12/13/14 | **Clock times, NOT hours!** 11=bed hour, 12=bed min, 13=wake hour, 14=wake min. Calculate: duration = wake_time - bed_time (handle midnight crossing). 99=Don't know→NA |
171
+ | Sleep (2017-18 weekend) | BP16_21/22/23/24 | Same format as weekday |
172
+ | Sleep (2019-20) | BP16_1/2 | Direct sleep hours (weekday/weekend). 99=Don't know→NA |
173
+ | PA aerobic | pa_aerobic | 0=Doesn't meet, 1=Meets guidelines. **Note: values are 0/1, NOT 1/2** |
174
+ | HTN treatment | DI1_pr | 1=Yes, 0=No (currently treating hypertension) |
175
+ | Dyslipidemia tx | DI3_pr | 1=Yes, 0=No (if available) |
176
+ | Non-HDL chol | HE_chol - HE_HDL_st2 | Derived: total cholesterol minus HDL |
177
+
178
+ ### Additional NHANES Variables (validated via LE8-Asthma replication)
179
+
180
+ | Variable | Raw Var | Coding |
181
+ |----------|---------|--------|
182
+ | Asthma | MCQ010 | "Yes" / "No" (ever told by doctor) |
183
+ | Sleep hours | SLD012 | Numeric (hours/night on weekdays) |
184
+ | BP treatment | BPQ020 | "Yes" / "No" (told by doctor, high BP) |
185
+ | Cholesterol treatment | BPQ100D | "Yes" / "No" (taking cholesterol Rx) |
186
+ | PA vigorous work | PAQ605/PAQ610/PAD615 | Yes/No, days/week, min/day |
187
+ | PA moderate work | PAQ620/PAQ625/PAD630 | Yes/No, days/week, min/day |
188
+ | PA walk/bike | PAQ635/PAQ640/PAD645 | Yes/No, days/week, min/day |
189
+ | PA vigorous rec | PAQ665/PAQ670/PAD675 | Yes/No, days/week, min/day |
190
+ | PA moderate rec | PAQ650/PAQ655/PAD660 | Yes/No, days/week, min/day |
191
+ | Dietary fiber | DR1TFIBE (DR1TOT_J) | Numeric (grams, day 1 recall) |
192
+ | Dietary sodium | DR1TSODI (DR1TOT_J) | Numeric (mg) |
193
+ | Dietary sat fat | DR1TSFAT (DR1TOT_J) | Numeric (grams) |
194
+ | Total energy | DR1TKCAL (DR1TOT_J) | Numeric (kcal) |
195
+ | Total sugars | DR1TSUGR (DR1TOT_J) | Numeric (grams) |
196
+ | Non-HDL chol | LBXTC - LBDHDD | Derived: TCHOL_J minus HDL_J |
197
+
198
+ ## CHNS Variable Coding Reference (validated via 3-country batch)
199
+
200
+ **Data source**: cpc.unc.edu/projects/china (free registration)
201
+ **Biomarker wave**: 2009 only (N=9,549). Other variables available 1989-2015.
202
+ **Survey design**: No formal weights. Use `svydesign(id=~COMMID, weights=~1)` or cluster-robust SE.
203
+
204
+ ### Key Files and Merge Strategy
205
+
206
+ | File | Key Variables | Join Key |
207
+ |------|--------------|----------|
208
+ | mast_pub_12 | IDind, GENDER (1=M/2=F), WEST_DOB_Y (birth year) | IDind |
209
+ | pexam_00 | HEIGHT, WEIGHT, U10 (waist), SYSTOL1-3, DIASTOL1-3, U22 (HBP dx), U24 (HBP meds), U24A (DM dx), U25 (ever smoked), U27 (still smokes), U40 (alcohol), U41 (freq), U48A (self-health), COMMID | IDind + filter WAVE==2009 |
210
+ | biomarker_09 | GLUCOSE_MG, HbA1c, TC_MG, TG_MG, HDL_C_MG, LDL_C_MG, HS_CRP, HGB, WBC, ALT, CRE_MG | IDind |
211
+ | educ_12 | A12 (education 0-6) | IDind + filter WAVE==2009 |
212
+ | indinc_10 | indwage (yuan, continuous → quartiles) | IDind + filter wave==2009 |
213
+
214
+ ### Variable Coding
215
+
216
+ | Variable | Raw Var | Coding | Notes |
217
+ |----------|---------|--------|-------|
218
+ | Sex | GENDER | 1=Male, 2=Female | Same as KNHANES/NHANES |
219
+ | Age | WEST_DOB_Y | age = wave_year - WEST_DOB_Y | Integer truncation |
220
+ | BMI | HEIGHT, WEIGHT | WEIGHT / (HEIGHT/100)^2 | **Obesity: BMI ≥ 28 (WGOC, NOT 25 or 30)** |
221
+ | Waist | U10 | cm, direct measurement | **Central obesity: ≥90M / ≥80F (IDF-Asian)** |
222
+ | SBP | SYSTOL1-3 | mean(SYSTOL1, SYSTOL2, SYSTOL3) | 3 readings averaged |
223
+ | DBP | DIASTOL1-3 | mean(DIASTOL1, DIASTOL2, DIASTOL3) | 3 readings averaged |
224
+ | HBP diagnosed | U22 | 0=No, 1=Yes, 9=Don't know (→NA) | |
225
+ | HBP medication | U24 | 0=No, 1=Yes | |
226
+ | DM diagnosed | U24A | 0=No, 1=Yes, 9=Don't know (→NA) | |
227
+ | Smoking | U25 + U27 | never(U25==0) / former(U25==1 & U27==0) / current(U25==1 & U27==1) | |
228
+ | Alcohol | U40 + U41 | never(U40==0) / occasional(U41≥4) / frequent(U41≤3, ≥1x/week) | U41: 1=daily, 2=3-4x/wk, 3=1-2x/wk, 4=1-2x/mo, 5=<1x/mo |
229
+ | Education | A12 | 0=none, 1=primary, 2=lower-mid, 3=upper-mid, 4=technical, 5=university, 6=master+. Recode: 0-2→low, 3-4→mid, 5-6→high | |
230
+ | Income | indwage | Continuous yuan → quartiles within wave | |
231
+ | Glucose | GLUCOSE_MG | mg/dL (also GLUCOSE in mmol/L) | 2009 only |
232
+ | HbA1c | HbA1c | % (direct) | 2009 only |
233
+ | TC | TC_MG | mg/dL | 2009 only |
234
+ | TG | TG_MG | mg/dL | 2009 only |
235
+ | HDL | HDL_C_MG | mg/dL | 2009 only |
236
+ | hsCRP | HS_CRP | mg/L | 2009 only |
237
+ | Hemoglobin | HGB | **g/L (divide by 10 for g/dL)** | Unit differs from KR/US |
238
+ | Self-health | U48A | Self-reported health status | 2004-2011 |
239
+ | Depression | — | **NOT AVAILABLE** in standard download. CES-D exists but needs separate dataset. | Cannot directly compare with PHQ-9 |
240
+
241
+ ### CHNS-Specific Warnings
242
+
243
+ 1. **No survey weights**: CHNS is NOT a formally weighted survey. Use unweighted analysis with cluster-robust SE by COMMID. Report as limitation.
244
+ 2. **Biomarker = 2009 only**: Glucose, HbA1c, lipids, hsCRP available only in 2009 wave. Other waves lack lab data.
245
+ 3. **CES-D not in standard download**: Depression comparison requires separate dataset download from cpc.unc.edu.
246
+ 4. **BMI cutoff ≠ KR ≠ US**: China=28, Korea=25, US=30. Use country-specific cutoffs AND sensitivity analysis with WHO cutoff=25.
247
+ 5. **SES-health gradient may reverse**: Low education and low income are NOT always risk factors in China (null/protective). This is the "developing country health transition" — do NOT treat as a bug.
248
+ 6. **Hemoglobin unit**: CHNS reports g/L (KR/US report g/dL). Divide by 10 when comparing.
249
+ 7. **Education scale**: 7-level (0-6) vs KR 4-level vs US 5-level. Harmonize to 3-level for comparison.
250
+
251
+ ### Composite Score Replication Warnings (learned from LE8 replication)
252
+
253
+ 1. **BMI cutoff mismatch**: LE8 uses WHO <25 which classifies most Koreans as "ideal" → Factor subscore loses BMI discriminatory power in Asian populations. Report this limitation.
254
+ 2. **KNHANES sleep = clock times**: BP16_11-14 are bedtime/waketime (hour:min), NOT sleep duration. Must compute `wake_time - bed_time` with midnight crossing.
255
+ 3. **pa_aerobic codes**: Values are 0/1 (not 1/2). Binary → MET-hours approximation is coarse.
256
+ 4. **Diet quality scoring**: AHEI-2010 requires detailed food group data; nutrient-based proxy gives different distribution. Recommend downloading NHANES DR1TOT_J for dietary recall nutrients.
257
+ 5. **LE8 sensitivity to implementation**: Small scoring differences compound across 8 components → overall score can diverge substantially, especially in the "moderate" range where most people cluster.
258
+
259
+ ## Anti-Hallucination
260
+
261
+ - **Never fabricate variable names, dataset column names, or variable codings.** If a variable mapping is uncertain, output `[VERIFY: variable_name]` and ask the user to confirm against the data dictionary.
262
+ - **Never fabricate statistical results** — no invented p-values, effect sizes, confidence intervals, or sample sizes. All numbers must come from executed code output.
263
+ - **Never generate references from memory.** Use `/search-lit` for all citations.
264
+ - If a function, package, or API does not exist or you are unsure, say so explicitly rather than guessing.
@@ -0,0 +1,37 @@
1
+ schema_version: 2
2
+ name: cross-national
3
+ layer: B
4
+ owner_domain: cross_national_comparison
5
+
6
+ when_to_use: "Run a cross-national comparison (KNHANES + NHANES + CHNS or similar) with harmonized variables and parallel weighted analysis."
7
+ when_NOT_to_use: "Single-cohort analysis (use analyze-stats); replicating one study on one DB (use replicate-study)."
8
+
9
+ inputs:
10
+ - "parallel survey datasets"
11
+ - "variable harmonization plan"
12
+ outputs:
13
+ - "harmonization table"
14
+ - "parallel weighted analysis"
15
+ - "comparison tables"
16
+ side_effects:
17
+ - writes_project_artifacts
18
+ - executes_analysis_code
19
+ downstream_consumers:
20
+ - analyze-stats
21
+ - self-review
22
+ forbidden_actions:
23
+ - harmonize_variables_without_documented_mapping
24
+ - ignore_survey_weights
25
+
26
+ # v2.1 quality card
27
+ purpose: "Harmonize and analyze parallel national surveys (2- or 3-country) with correct complex-survey weighting."
28
+ safety_boundaries:
29
+ - "Variable harmonization is documented in an explicit mapping; survey weights are always applied."
30
+ - "Numbers come from executed weighted analysis on real survey data."
31
+ known_limitations:
32
+ - "Cross-survey comparability is limited by instrument differences; residual non-comparability remains."
33
+ - "No standalone demo; depends on a sound harmonization plan."
34
+ validation_commands:
35
+ - "re-run weighted analysis per country and reconcile"
36
+ - "/self-review"
37
+ evidence_surface: manual_workflow