medsci-skills 4.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +50 -0
- package/README.md +602 -0
- package/README_FIRST.md +27 -0
- package/bin/medsci-skills.js +159 -0
- package/installers/install-macos.command +19 -0
- package/installers/install-windows.cmd +26 -0
- package/installers/install-windows.ps1 +17 -0
- package/installers/install.py +218 -0
- package/metadata/skills_catalog.json +452 -0
- package/package.json +48 -0
- package/skills/academic-aio/SKILL.md +408 -0
- package/skills/academic-aio/references/case_studies/kjr_mllm_2025.md +82 -0
- package/skills/academic-aio/references/checklists/AIO_GENERAL.md +354 -0
- package/skills/academic-aio/references/journal_summarybox_templates.yaml +126 -0
- package/skills/academic-aio/references/oac_funding_checklist.yaml +129 -0
- package/skills/academic-aio/references/reporting_guideline_mapping.md +39 -0
- package/skills/academic-aio/references/schema_markup_templates/CodeRepository.jsonld +32 -0
- package/skills/academic-aio/references/schema_markup_templates/Dataset.jsonld +36 -0
- package/skills/academic-aio/references/schema_markup_templates/Person.jsonld +30 -0
- package/skills/academic-aio/references/schema_markup_templates/README.md +43 -0
- package/skills/academic-aio/references/schema_markup_templates/ScholarlyArticle.jsonld +55 -0
- package/skills/academic-aio/scripts/batch_metadata_audit.py +169 -0
- package/skills/academic-aio/scripts/validate_schema.py +118 -0
- package/skills/academic-aio/skill.yml +36 -0
- package/skills/academic-aio/templates/aio_audit_checklist.md.j2 +108 -0
- package/skills/add-journal/SKILL.md +482 -0
- package/skills/add-journal/skill.yml +33 -0
- package/skills/analyze-stats/SKILL.md +598 -0
- package/skills/analyze-stats/references/analysis_guides/missing_data.md +109 -0
- package/skills/analyze-stats/references/analysis_guides/nhis_icd10_mapping.md +247 -0
- package/skills/analyze-stats/references/analysis_guides/propensity_score.md +132 -0
- package/skills/analyze-stats/references/analysis_guides/regression.md +115 -0
- package/skills/analyze-stats/references/analysis_guides/repeated_measures.md +160 -0
- package/skills/analyze-stats/references/analysis_guides/survey_weighted.md +366 -0
- package/skills/analyze-stats/references/analysis_guides/test_selection.md +86 -0
- package/skills/analyze-stats/references/style/figure_style.mplstyle +69 -0
- package/skills/analyze-stats/references/style/theme_publication.R +147 -0
- package/skills/analyze-stats/references/table-standards/journal-profiles/ajr.yaml +51 -0
- package/skills/analyze-stats/references/table-standards/journal-profiles/european_radiology.yaml +55 -0
- package/skills/analyze-stats/references/table-standards/journal-profiles/jama.yaml +66 -0
- package/skills/analyze-stats/references/table-standards/journal-profiles/lancet.yaml +57 -0
- package/skills/analyze-stats/references/table-standards/journal-profiles/nejm.yaml +51 -0
- package/skills/analyze-stats/references/table-standards/journal-profiles/radiology.yaml +66 -0
- package/skills/analyze-stats/references/table-standards/table-standards.md +287 -0
- package/skills/analyze-stats/references/table-standards/table-types/diagnostic_accuracy.md +36 -0
- package/skills/analyze-stats/references/table-standards/table-types/meta_analysis.md +58 -0
- package/skills/analyze-stats/references/table-standards/table-types/model_comparison.md +36 -0
- package/skills/analyze-stats/references/table-standards/table-types/regression_results.md +50 -0
- package/skills/analyze-stats/references/table-standards/table-types/table1_demographics.md +51 -0
- package/skills/analyze-stats/references/table-standards/tool-comparison.md +79 -0
- package/skills/analyze-stats/references/templates/agreement_analysis.py +436 -0
- package/skills/analyze-stats/references/templates/dca_plot.R +237 -0
- package/skills/analyze-stats/references/templates/diagnostic_accuracy.py +401 -0
- package/skills/analyze-stats/references/templates/dta_meta_analysis.R +384 -0
- package/skills/analyze-stats/references/templates/forest_plot.py +412 -0
- package/skills/analyze-stats/references/templates/likert_summary.py +356 -0
- package/skills/analyze-stats/references/templates/meta_analysis.R +365 -0
- package/skills/analyze-stats/references/templates/propensity_score.py +478 -0
- package/skills/analyze-stats/references/templates/regression.py +425 -0
- package/skills/analyze-stats/references/templates/repeated_measures.py +434 -0
- package/skills/analyze-stats/references/templates/sample_size.R +382 -0
- package/skills/analyze-stats/references/templates/survey_weighted_analysis.py +411 -0
- package/skills/analyze-stats/references/templates/survival_analysis.py +325 -0
- package/skills/analyze-stats/references/templates/table1_demographics.py +287 -0
- package/skills/analyze-stats/scripts/check_generated_code.py +335 -0
- package/skills/analyze-stats/skill.yml +38 -0
- package/skills/analyze-stats/tests/fixtures/gen_bad.R +16 -0
- package/skills/analyze-stats/tests/fixtures/gen_bad.py +24 -0
- package/skills/analyze-stats/tests/fixtures/gen_clean.py +21 -0
- package/skills/analyze-stats/tests/test_generated_code.sh +59 -0
- package/skills/analyze-stats/tests/test_survival_template.sh +53 -0
- package/skills/author-strategy/SKILL.md +117 -0
- package/skills/author-strategy/analyze_patterns.py +303 -0
- package/skills/author-strategy/fetch_pubmed.py +374 -0
- package/skills/author-strategy/skill.yml +34 -0
- package/skills/batch-cohort/SKILL.md +223 -0
- package/skills/batch-cohort/references/base_template_knhanes.R +210 -0
- package/skills/batch-cohort/references/batch_template_generator.R +222 -0
- package/skills/batch-cohort/references/variable_coding_registry.md +136 -0
- package/skills/batch-cohort/skill.yml +35 -0
- package/skills/calc-sample-size/SKILL.md +491 -0
- package/skills/calc-sample-size/references/formulas.md +655 -0
- package/skills/calc-sample-size/references/observational_cohort.md +49 -0
- package/skills/calc-sample-size/skill.yml +51 -0
- package/skills/check-reporting/SKILL.md +534 -0
- package/skills/check-reporting/references/LICENSES.md +41 -0
- package/skills/check-reporting/references/checklists/AMSTAR2.md +54 -0
- package/skills/check-reporting/references/checklists/ARRIVE_2.md +234 -0
- package/skills/check-reporting/references/checklists/CARE.md +102 -0
- package/skills/check-reporting/references/checklists/CLAIM_2024.md +128 -0
- package/skills/check-reporting/references/checklists/CLEAR.md +113 -0
- package/skills/check-reporting/references/checklists/CONSORT.md +86 -0
- package/skills/check-reporting/references/checklists/COSMIN_RoB.md +136 -0
- package/skills/check-reporting/references/checklists/GRRAS.md +61 -0
- package/skills/check-reporting/references/checklists/MI_CLEAR_LLM.md +167 -0
- package/skills/check-reporting/references/checklists/MOOSE.md +85 -0
- package/skills/check-reporting/references/checklists/NOS.md +88 -0
- package/skills/check-reporting/references/checklists/PRISMA_2020.md +135 -0
- package/skills/check-reporting/references/checklists/PRISMA_DTA.md +36 -0
- package/skills/check-reporting/references/checklists/PRISMA_P.md +56 -0
- package/skills/check-reporting/references/checklists/PROBAST.md +75 -0
- package/skills/check-reporting/references/checklists/PROBAST_AI.md +130 -0
- package/skills/check-reporting/references/checklists/QUADAS2.md +77 -0
- package/skills/check-reporting/references/checklists/QUADAS_C.md +131 -0
- package/skills/check-reporting/references/checklists/ROBINS_E.md +179 -0
- package/skills/check-reporting/references/checklists/ROBINS_I.md +87 -0
- package/skills/check-reporting/references/checklists/ROBIS.md +114 -0
- package/skills/check-reporting/references/checklists/ROB_ME.md +126 -0
- package/skills/check-reporting/references/checklists/RoB2.md +79 -0
- package/skills/check-reporting/references/checklists/RoB_NMA.md +96 -0
- package/skills/check-reporting/references/checklists/SPIRIT.md +112 -0
- package/skills/check-reporting/references/checklists/SQUIRE_2.md +68 -0
- package/skills/check-reporting/references/checklists/STARD.md +129 -0
- package/skills/check-reporting/references/checklists/STARD_AI.md +211 -0
- package/skills/check-reporting/references/checklists/STROBE.md +80 -0
- package/skills/check-reporting/references/checklists/SWiM.md +33 -0
- package/skills/check-reporting/references/checklists/TRIPOD.md +157 -0
- package/skills/check-reporting/references/checklists/TRIPOD_AI.md +140 -0
- package/skills/check-reporting/references/step4c_registration_timing.md +93 -0
- package/skills/check-reporting/references/step4d_prisma_figure_audit.md +137 -0
- package/skills/check-reporting/scripts/check_checklist_exists.py +183 -0
- package/skills/check-reporting/scripts/check_checklist_version.py +168 -0
- package/skills/check-reporting/scripts/check_framework_naming.py +206 -0
- package/skills/check-reporting/scripts/check_prisma_figure.py +209 -0
- package/skills/check-reporting/scripts/prisma_cascade_check.py +274 -0
- package/skills/check-reporting/skill.yml +41 -0
- package/skills/check-reporting/tests/fixtures/framework_bad.md +8 -0
- package/skills/check-reporting/tests/fixtures/framework_clean.md +7 -0
- package/skills/check-reporting/tests/test_checklist_fail_fast.sh +77 -0
- package/skills/check-reporting/tests/test_checklist_version.sh +72 -0
- package/skills/check-reporting/tests/test_framework_naming.sh +45 -0
- package/skills/check-reporting/tests/test_prisma_cascade.sh +104 -0
- package/skills/clean-data/SKILL.md +180 -0
- package/skills/clean-data/references/cleaning_patterns.md +299 -0
- package/skills/clean-data/references/profiling_template.py +304 -0
- package/skills/clean-data/scripts/check_structural_zero.py +174 -0
- package/skills/clean-data/skill.yml +35 -0
- package/skills/clean-data/tests/fixtures/smoking.csv +8 -0
- package/skills/clean-data/tests/test_structural_zero.sh +49 -0
- package/skills/cross-national/SKILL.md +264 -0
- package/skills/cross-national/skill.yml +37 -0
- package/skills/define-variables/SKILL.md +146 -0
- package/skills/define-variables/references/common_definitions.md +190 -0
- package/skills/define-variables/skill.yml +34 -0
- package/skills/define-variables/templates/variable_operationalization.md +64 -0
- package/skills/deidentify/SKILL.md +203 -0
- package/skills/deidentify/deidentify.py +1224 -0
- package/skills/deidentify/locales/_template.json +45 -0
- package/skills/deidentify/locales/au.json +43 -0
- package/skills/deidentify/locales/ca.json +44 -0
- package/skills/deidentify/locales/cn.json +47 -0
- package/skills/deidentify/locales/de.json +48 -0
- package/skills/deidentify/locales/fr.json +48 -0
- package/skills/deidentify/locales/in.json +48 -0
- package/skills/deidentify/locales/jp.json +48 -0
- package/skills/deidentify/locales/kr.json +48 -0
- package/skills/deidentify/locales/uk.json +45 -0
- package/skills/deidentify/locales/us.json +43 -0
- package/skills/deidentify/references/date_shift_guide.md +82 -0
- package/skills/deidentify/references/hipaa_18_identifiers.md +48 -0
- package/skills/deidentify/references/korean_phi_patterns.md +135 -0
- package/skills/deidentify/skill.yml +43 -0
- package/skills/deidentify/tests/README.md +26 -0
- package/skills/deidentify/tests/test_clean.csv +16 -0
- package/skills/deidentify/tests/test_edge_cases.csv +11 -0
- package/skills/deidentify/tests/test_phi_korean.csv +11 -0
- package/skills/design-ai-benchmarking/SKILL.md +214 -0
- package/skills/design-ai-benchmarking/references/benchmark_export_schema.json +69 -0
- package/skills/design-ai-benchmarking/references/elicitation_rubric_template.md +37 -0
- package/skills/design-ai-benchmarking/skill.yml +38 -0
- package/skills/design-study/SKILL.md +298 -0
- package/skills/design-study/skill.yml +33 -0
- package/skills/fill-icmje-coi/SKILL.md +216 -0
- package/skills/fill-icmje-coi/scripts/fill_icmje_coi.py +140 -0
- package/skills/fill-icmje-coi/skill.yml +35 -0
- package/skills/fill-icmje-coi/templates/icmje_coi_seed_synthetic.docx +0 -0
- package/skills/fill-protocol/SKILL.md +248 -0
- package/skills/fill-protocol/examples/example_irb_template.yaml +53 -0
- package/skills/fill-protocol/references/best_practices.md +121 -0
- package/skills/fill-protocol/scripts/doc_to_docx.py +111 -0
- package/skills/fill-protocol/scripts/fill_form.py +611 -0
- package/skills/fill-protocol/scripts/inspect_template.py +61 -0
- package/skills/fill-protocol/setup.sh +162 -0
- package/skills/fill-protocol/skill.yml +37 -0
- package/skills/find-cohort-gap/SKILL.md +309 -0
- package/skills/find-cohort-gap/references/cohort_profile_template.md +93 -0
- package/skills/find-cohort-gap/references/onepager_template.md +84 -0
- package/skills/find-cohort-gap/references/pattern_scoring_rubric.md +169 -0
- package/skills/find-cohort-gap/references/saturation_query_templates.md +143 -0
- package/skills/find-cohort-gap/skill.yml +35 -0
- package/skills/find-journal/POLICY.md +87 -0
- package/skills/find-journal/SKILL.md +340 -0
- package/skills/find-journal/references/journal_profiles/AJNR.md +29 -0
- package/skills/find-journal/references/journal_profiles/AJR.md +30 -0
- package/skills/find-journal/references/journal_profiles/Abdominal_Radiology.md +30 -0
- package/skills/find-journal/references/journal_profiles/Academic_Radiology.md +30 -0
- package/skills/find-journal/references/journal_profiles/Annals_of_Internal_Medicine.md +33 -0
- package/skills/find-journal/references/journal_profiles/Artificial_Intelligence_in_Medicine.md +28 -0
- package/skills/find-journal/references/journal_profiles/BMC_Medicine.md +31 -0
- package/skills/find-journal/references/journal_profiles/British_Journal_of_Radiology.md +39 -0
- package/skills/find-journal/references/journal_profiles/CVIR.md +30 -0
- package/skills/find-journal/references/journal_profiles/Chest.md +39 -0
- package/skills/find-journal/references/journal_profiles/Clinical_Radiology.md +30 -0
- package/skills/find-journal/references/journal_profiles/Clinical_and_Molecular_Hepatology.md +32 -0
- package/skills/find-journal/references/journal_profiles/Diabetes_Metabolism_Journal.md +36 -0
- package/skills/find-journal/references/journal_profiles/Diagnostic_and_Interventional_Radiology.md +32 -0
- package/skills/find-journal/references/journal_profiles/Endocrinology_and_Metabolism.md +37 -0
- package/skills/find-journal/references/journal_profiles/European_Journal_of_Preventive_Cardiology.md +39 -0
- package/skills/find-journal/references/journal_profiles/European_Radiology.md +29 -0
- package/skills/find-journal/references/journal_profiles/Hepatology_Communications.md +40 -0
- package/skills/find-journal/references/journal_profiles/Hepatology_International.md +37 -0
- package/skills/find-journal/references/journal_profiles/IEEE_JBHI.md +28 -0
- package/skills/find-journal/references/journal_profiles/IEEE_TMI.md +28 -0
- package/skills/find-journal/references/journal_profiles/INSI.md +29 -0
- package/skills/find-journal/references/journal_profiles/Investigative_Radiology.md +25 -0
- package/skills/find-journal/references/journal_profiles/JACC_Advances.md +41 -0
- package/skills/find-journal/references/journal_profiles/JACC_Asia.md +30 -0
- package/skills/find-journal/references/journal_profiles/JACR.md +28 -0
- package/skills/find-journal/references/journal_profiles/JAMA.md +40 -0
- package/skills/find-journal/references/journal_profiles/JAMA_Network_Open.md +30 -0
- package/skills/find-journal/references/journal_profiles/JCSM.md +39 -0
- package/skills/find-journal/references/journal_profiles/JKMS.md +32 -0
- package/skills/find-journal/references/journal_profiles/JMIR.md +29 -0
- package/skills/find-journal/references/journal_profiles/JMIR_Medical_Education.md +29 -0
- package/skills/find-journal/references/journal_profiles/JNIS.md +35 -0
- package/skills/find-journal/references/journal_profiles/JVIR.md +31 -0
- package/skills/find-journal/references/journal_profiles/Journal_of_Biomedical_Informatics.md +29 -0
- package/skills/find-journal/references/journal_profiles/Journal_of_Clinical_Endocrinology_and_Metabolism.md +40 -0
- package/skills/find-journal/references/journal_profiles/Journal_of_Magnetic_Resonance_Imaging.md +30 -0
- package/skills/find-journal/references/journal_profiles/Journal_of_Nuclear_Medicine.md +31 -0
- package/skills/find-journal/references/journal_profiles/Journal_of_Stroke.md +32 -0
- package/skills/find-journal/references/journal_profiles/KJR.md +38 -0
- package/skills/find-journal/references/journal_profiles/Korean_Circulation_Journal.md +38 -0
- package/skills/find-journal/references/journal_profiles/Korean_Journal_of_Internal_Medicine.md +36 -0
- package/skills/find-journal/references/journal_profiles/Lancet_Diabetes_and_Endocrinology.md +40 -0
- package/skills/find-journal/references/journal_profiles/Lancet_Gastroenterology_and_Hepatology.md +49 -0
- package/skills/find-journal/references/journal_profiles/Lancet_Infectious_Diseases.md +38 -0
- package/skills/find-journal/references/journal_profiles/Lancet_Neurology.md +39 -0
- package/skills/find-journal/references/journal_profiles/Lancet_Oncology.md +40 -0
- package/skills/find-journal/references/journal_profiles/Lancet_Psychiatry.md +38 -0
- package/skills/find-journal/references/journal_profiles/Lancet_Public_Health.md +30 -0
- package/skills/find-journal/references/journal_profiles/Lancet_Respiratory_Medicine.md +39 -0
- package/skills/find-journal/references/journal_profiles/Liver_International.md +33 -0
- package/skills/find-journal/references/journal_profiles/Medical_Image_Analysis.md +28 -0
- package/skills/find-journal/references/journal_profiles/NEJM.md +33 -0
- package/skills/find-journal/references/journal_profiles/Nature_Machine_Intelligence.md +31 -0
- package/skills/find-journal/references/journal_profiles/Nature_Medicine.md +39 -0
- package/skills/find-journal/references/journal_profiles/Neuroradiology.md +31 -0
- package/skills/find-journal/references/journal_profiles/Nutrition_Metabolism_and_Cardiovascular_Diseases.md +39 -0
- package/skills/find-journal/references/journal_profiles/PLOS_Medicine.md +32 -0
- package/skills/find-journal/references/journal_profiles/RYAI.md +28 -0
- package/skills/find-journal/references/journal_profiles/Radiology.md +29 -0
- package/skills/find-journal/references/journal_profiles/Skeletal_Radiology.md +31 -0
- package/skills/find-journal/references/journal_profiles/Stroke.md +37 -0
- package/skills/find-journal/references/journal_profiles/The_BMJ.md +31 -0
- package/skills/find-journal/references/journal_profiles/The_Lancet.md +31 -0
- package/skills/find-journal/references/journal_profiles/The_Lancet_Digital_Health.md +29 -0
- package/skills/find-journal/references/journal_profiles/World_Journal_of_Hepatology.md +53 -0
- package/skills/find-journal/references/journal_profiles/npj_Digital_Medicine.md +29 -0
- package/skills/find-journal/skill.yml +34 -0
- package/skills/fulltext-retrieval/SKILL.md +174 -0
- package/skills/fulltext-retrieval/fetch_oa.py +433 -0
- package/skills/fulltext-retrieval/pdf_to_md.py +160 -0
- package/skills/fulltext-retrieval/skill.yml +41 -0
- package/skills/generate-codebook/SKILL.md +155 -0
- package/skills/generate-codebook/references/codebook_schema.md +76 -0
- package/skills/generate-codebook/scripts/generate_codebook.py +278 -0
- package/skills/generate-codebook/skill.yml +35 -0
- package/skills/generate-codebook/tests/test_generate_codebook.sh +76 -0
- package/skills/grant-builder/SKILL.md +251 -0
- package/skills/grant-builder/skill.yml +34 -0
- package/skills/humanize/SKILL.md +251 -0
- package/skills/humanize/references/ai_patterns.md +571 -0
- package/skills/humanize/skill.yml +33 -0
- package/skills/intake-project/SKILL.md +264 -0
- package/skills/intake-project/skill.yml +34 -0
- package/skills/lit-sync/SKILL.md +448 -0
- package/skills/lit-sync/references/locale/ko/note_templates.md +110 -0
- package/skills/lit-sync/skill.yml +52 -0
- package/skills/lit-sync/tests/test_poll_logic.sh +92 -0
- package/skills/ma-scout/SKILL.md +640 -0
- package/skills/ma-scout/references/project_readme_template.md +95 -0
- package/skills/ma-scout/references/project_readme_template_ko.md +82 -0
- package/skills/ma-scout/skill.yml +33 -0
- package/skills/make-figures/SKILL.md +957 -0
- package/skills/make-figures/references/critic_rubrics/data_plot.md +166 -0
- package/skills/make-figures/references/critic_rubrics/flow_diagram.md +169 -0
- package/skills/make-figures/references/design_principles.md +181 -0
- package/skills/make-figures/references/exemplar_diagrams/README.md +65 -0
- package/skills/make-figures/references/exemplar_diagrams/consort/README.md +15 -0
- package/skills/make-figures/references/exemplar_diagrams/consort/template_input.yaml +37 -0
- package/skills/make-figures/references/exemplar_diagrams/consort/template_output.pdf +0 -0
- package/skills/make-figures/references/exemplar_diagrams/consort/template_output.png +0 -0
- package/skills/make-figures/references/exemplar_diagrams/consort/template_output_600.png +0 -0
- package/skills/make-figures/references/exemplar_diagrams/other/other_02.meta.yaml +4 -0
- package/skills/make-figures/references/exemplar_diagrams/other/other_02.png +0 -0
- package/skills/make-figures/references/exemplar_diagrams/other/other_02_why.md +13 -0
- package/skills/make-figures/references/exemplar_diagrams/pipeline/README.md +15 -0
- package/skills/make-figures/references/exemplar_diagrams/pipeline/pipeline_01.meta.yaml +4 -0
- package/skills/make-figures/references/exemplar_diagrams/pipeline/pipeline_01.png +0 -0
- package/skills/make-figures/references/exemplar_diagrams/pipeline/pipeline_01_why.md +13 -0
- package/skills/make-figures/references/exemplar_diagrams/pipeline/pipeline_03.meta.yaml +4 -0
- package/skills/make-figures/references/exemplar_diagrams/pipeline/pipeline_03.png +0 -0
- package/skills/make-figures/references/exemplar_diagrams/pipeline/pipeline_03_why.md +13 -0
- package/skills/make-figures/references/exemplar_diagrams/pipeline/pipeline_04.meta.yaml +4 -0
- package/skills/make-figures/references/exemplar_diagrams/pipeline/pipeline_04.png +0 -0
- package/skills/make-figures/references/exemplar_diagrams/pipeline/pipeline_04_why.md +13 -0
- package/skills/make-figures/references/exemplar_diagrams/pipeline/pipeline_05.meta.yaml +4 -0
- package/skills/make-figures/references/exemplar_diagrams/pipeline/pipeline_05.png +0 -0
- package/skills/make-figures/references/exemplar_diagrams/pipeline/pipeline_05_why.md +13 -0
- package/skills/make-figures/references/exemplar_diagrams/pipeline/pipeline_06.meta.yaml +4 -0
- package/skills/make-figures/references/exemplar_diagrams/pipeline/pipeline_06.png +0 -0
- package/skills/make-figures/references/exemplar_diagrams/pipeline/pipeline_06_why.md +13 -0
- package/skills/make-figures/references/exemplar_diagrams/pipeline/pipeline_07.meta.yaml +4 -0
- package/skills/make-figures/references/exemplar_diagrams/pipeline/pipeline_07.png +0 -0
- package/skills/make-figures/references/exemplar_diagrams/pipeline/pipeline_07_why.md +13 -0
- package/skills/make-figures/references/exemplar_diagrams/pipeline/pipeline_08.meta.yaml +4 -0
- package/skills/make-figures/references/exemplar_diagrams/pipeline/pipeline_08.png +0 -0
- package/skills/make-figures/references/exemplar_diagrams/pipeline/pipeline_08_why.md +13 -0
- package/skills/make-figures/references/exemplar_diagrams/pipeline/pipeline_09.meta.yaml +4 -0
- package/skills/make-figures/references/exemplar_diagrams/pipeline/pipeline_09.png +0 -0
- package/skills/make-figures/references/exemplar_diagrams/pipeline/pipeline_09_why.md +13 -0
- package/skills/make-figures/references/exemplar_diagrams/pipeline/pipeline_10.meta.yaml +4 -0
- package/skills/make-figures/references/exemplar_diagrams/pipeline/pipeline_10.png +0 -0
- package/skills/make-figures/references/exemplar_diagrams/pipeline/pipeline_10_why.md +13 -0
- package/skills/make-figures/references/exemplar_diagrams/prisma/README.md +15 -0
- package/skills/make-figures/references/exemplar_diagrams/prisma/template_input.yaml +47 -0
- package/skills/make-figures/references/exemplar_diagrams/prisma/template_output.pdf +0 -0
- package/skills/make-figures/references/exemplar_diagrams/prisma/template_output.png +0 -0
- package/skills/make-figures/references/exemplar_diagrams/prisma/template_output_600.png +0 -0
- package/skills/make-figures/references/exemplar_diagrams/stard/README.md +15 -0
- package/skills/make-figures/references/exemplar_diagrams/stard/template_input.yaml +40 -0
- package/skills/make-figures/references/exemplar_diagrams/stard/template_output.pdf +0 -0
- package/skills/make-figures/references/exemplar_diagrams/stard/template_output.png +0 -0
- package/skills/make-figures/references/exemplar_diagrams/stard/template_output_600.png +0 -0
- package/skills/make-figures/references/exemplar_diagrams/strobe/template_input.yaml +43 -0
- package/skills/make-figures/references/exemplar_diagrams/strobe/template_input_pptx.yaml +43 -0
- package/skills/make-figures/references/exemplar_diagrams/strobe/template_output.pdf +0 -0
- package/skills/make-figures/references/exemplar_diagrams/strobe/template_output.png +0 -0
- package/skills/make-figures/references/exemplar_diagrams/strobe/template_output.pptx +0 -0
- package/skills/make-figures/references/exemplar_diagrams/strobe/template_output_600.png +0 -0
- package/skills/make-figures/references/figure_specs.md +291 -0
- package/skills/make-figures/references/flow_diagram_lessons.md +164 -0
- package/skills/make-figures/references/jacc_central_illustration_principles.md +91 -0
- package/skills/make-figures/references/medical_illustration_sources.md +98 -0
- package/skills/make-figures/references/pipeline_concepts_medical_ai.md +240 -0
- package/skills/make-figures/references/reporting_guideline_figure_map.md +104 -0
- package/skills/make-figures/references/visual_abstract_templates/european_radiology.pptx +0 -0
- package/skills/make-figures/references/visual_abstract_templates/jacc_central_illustration.pptx +0 -0
- package/skills/make-figures/references/visual_abstract_templates/medsci_default.pptx +0 -0
- package/skills/make-figures/references/visual_abstract_templates/template_guide.md +114 -0
- package/skills/make-figures/scripts/build_jacc_template.py +77 -0
- package/skills/make-figures/scripts/build_prisma2020_template.py +371 -0
- package/skills/make-figures/scripts/build_strobe_template.py +351 -0
- package/skills/make-figures/scripts/critic_figure.py +264 -0
- package/skills/make-figures/scripts/derive_figure_legend_counts.py +138 -0
- package/skills/make-figures/scripts/extract_exemplar_from_pdf.py +186 -0
- package/skills/make-figures/scripts/fetch_official_templates.sh +88 -0
- package/skills/make-figures/scripts/fill_prisma_template.py +142 -0
- package/skills/make-figures/scripts/generate_flow_diagram.R +133 -0
- package/skills/make-figures/scripts/generate_image.py +99 -0
- package/skills/make-figures/scripts/generate_visual_abstract.py +438 -0
- package/skills/make-figures/scripts/validate_pptx_mac_compat.py +233 -0
- package/skills/make-figures/skill.yml +52 -0
- package/skills/make-figures/templates/official/NOTES.md +62 -0
- package/skills/make-figures/templates/official/consort2010/CONSORT_2025_editable_checklist.docx +0 -0
- package/skills/make-figures/templates/official/consort2010/CONSORT_2025_flow_diagram.docx +0 -0
- package/skills/make-figures/templates/official/prisma2020/PRISMA_2020_flow_new_v1.pptx +0 -0
- package/skills/make-figures/templates/official/prisma2020/PRISMA_2020_flow_new_v2.pptx +0 -0
- package/skills/make-figures/templates/official/prisma2020/PRISMA_2020_flow_updated_v2.pptx +0 -0
- package/skills/make-figures/templates/official/spirit2013/SPIRIT_2025_editable_checklist.docx +0 -0
- package/skills/make-figures/templates/official/spirit2013/SPIRIT_2025_participant_timeline.docx +0 -0
- package/skills/make-figures/templates/official/stard2015/STARD_2015_checklist.docx +0 -0
- package/skills/make-figures/templates/official/stard2015/STARD_2015_flow_diagram.pdf +0 -0
- package/skills/make-figures/tests/fixtures/figure1_flow.yaml +8 -0
- package/skills/make-figures/tests/fixtures/manuscript_ok.md +9 -0
- package/skills/make-figures/tests/fixtures/manuscript_stale.md +4 -0
- package/skills/make-figures/tests/test_legend_reconcile.sh +36 -0
- package/skills/manage-project/SKILL.md +358 -0
- package/skills/manage-project/references/pre_submission_checklist.md +53 -0
- package/skills/manage-project/references/project_state_template.json +37 -0
- package/skills/manage-project/references/scaffold_templates.md +118 -0
- package/skills/manage-project/references/status_output_format.md +44 -0
- package/skills/manage-project/references/timeline_example.md +20 -0
- package/skills/manage-project/skill.yml +36 -0
- package/skills/manage-project/templates/SSOT.yaml.template +41 -0
- package/skills/manage-refs/LICENSE.zotero-mcp +21 -0
- package/skills/manage-refs/NOTICE.md +29 -0
- package/skills/manage-refs/SKILL.md +289 -0
- package/skills/manage-refs/citation_styles/README.md +40 -0
- package/skills/manage-refs/citation_styles/american-journal-of-roentgenology.csl +211 -0
- package/skills/manage-refs/citation_styles/cardiovascular-and-interventional-radiology.csl +19 -0
- package/skills/manage-refs/citation_styles/european-radiology.csl +19 -0
- package/skills/manage-refs/citation_styles/journal-of-cachexia-sarcopenia-and-muscle.csl +150 -0
- package/skills/manage-refs/citation_styles/journal-of-korean-medical-science-strict.csl +533 -0
- package/skills/manage-refs/citation_styles/journal-of-korean-medical-science.csl +16 -0
- package/skills/manage-refs/citation_styles/korean-journal-of-radiology.csl +155 -0
- package/skills/manage-refs/citation_styles/nature.csl +189 -0
- package/skills/manage-refs/citation_styles/nlm-citation-sequence.csl +535 -0
- package/skills/manage-refs/citation_styles/radiology.csl +228 -0
- package/skills/manage-refs/citation_styles/springer-basic-brackets.csl +187 -0
- package/skills/manage-refs/citation_styles/springer-vancouver-brackets.csl +276 -0
- package/skills/manage-refs/citation_styles/vancouver-superscript.csl +536 -0
- package/skills/manage-refs/citation_styles/vancouver.csl +535 -0
- package/skills/manage-refs/references/REFERENCE_STYLE_SPECS.md +59 -0
- package/skills/manage-refs/references/check_xref_symptoms.md +35 -0
- package/skills/manage-refs/scripts/_vendor_citation_writer.py +600 -0
- package/skills/manage-refs/scripts/check_citation_keys.py +112 -0
- package/skills/manage-refs/scripts/check_csl_render.py +102 -0
- package/skills/manage-refs/scripts/check_xref.py +633 -0
- package/skills/manage-refs/scripts/fill_journal_abbrev.py +104 -0
- package/skills/manage-refs/scripts/inject_zotero_cwyw.py +133 -0
- package/skills/manage-refs/scripts/md_marker_convert.py +193 -0
- package/skills/manage-refs/scripts/pre_submission_gate.sh +238 -0
- package/skills/manage-refs/scripts/render_pandoc.sh +88 -0
- package/skills/manage-refs/skill.yml +70 -0
- package/skills/manage-refs/tests/fixtures/pre_submission_gate/README.md +32 -0
- package/skills/manage-refs/tests/fixtures/pre_submission_gate/manuscript.md +10 -0
- package/skills/manage-refs/tests/fixtures/pre_submission_gate/refs.bib +34 -0
- package/skills/manage-refs/tests/fixtures/pre_submission_gate/run.sh +117 -0
- package/skills/manage-refs/tests/test_vN_docx_check.sh +145 -0
- package/skills/meta-analysis/SKILL.md +739 -0
- package/skills/meta-analysis/references/LICENSES.md +21 -0
- package/skills/meta-analysis/references/PROSPERO_template.md +221 -0
- package/skills/meta-analysis/references/ai_pre_screening_template.py +245 -0
- package/skills/meta-analysis/references/checklists/JBI_Case_Series.md +45 -0
- package/skills/meta-analysis/references/checklists/NOS.md +88 -0
- package/skills/meta-analysis/references/checklists/PRISMA_DTA.md +36 -0
- package/skills/meta-analysis/references/checklists/PROBAST.md +75 -0
- package/skills/meta-analysis/references/checklists/QUADAS2.md +77 -0
- package/skills/meta-analysis/references/checklists/ROBINS_I.md +87 -0
- package/skills/meta-analysis/references/checklists/RoB2.md +79 -0
- package/skills/meta-analysis/references/data_integrity_checklist.md +57 -0
- package/skills/meta-analysis/references/icmje_coi_guide.md +181 -0
- package/skills/meta-analysis/references/phase10_recovery.md +136 -0
- package/skills/meta-analysis/references/phase4_km_composite.md +58 -0
- package/skills/meta-analysis/references/phase6_statistical_synthesis.md +148 -0
- package/skills/meta-analysis/references/phase9_circulation.md +84 -0
- package/skills/meta-analysis/references/post_submission_release_ops.md +41 -0
- package/skills/meta-analysis/references/r_templates.md +132 -0
- package/skills/meta-analysis/references/review_orchestration.md +40 -0
- package/skills/meta-analysis/references/submission_package_drift.md +71 -0
- package/skills/meta-analysis/scripts/check_pool_consistency.py +201 -0
- package/skills/meta-analysis/scripts/cohort_overlap_check.py +242 -0
- package/skills/meta-analysis/scripts/dta_extraction_qc.py +137 -0
- package/skills/meta-analysis/scripts/screening_reconcile.py +160 -0
- package/skills/meta-analysis/skill.yml +47 -0
- package/skills/meta-analysis/templates/FINAL_POOL_LOCK.yaml.template +70 -0
- package/skills/meta-analysis/templates/extraction_form_v2.md +129 -0
- package/skills/meta-analysis/templates/supplementary_8file_checklist.md +94 -0
- package/skills/meta-analysis/tests/test_pool_consistency.sh +123 -0
- package/skills/orchestrate/SKILL.md +501 -0
- package/skills/orchestrate/references/dialogue_nodes.md +196 -0
- package/skills/orchestrate/references/report_template.md +109 -0
- package/skills/orchestrate/references/report_template_ko.md +88 -0
- package/skills/orchestrate/skill.yml +44 -0
- package/skills/peer-review/SKILL.md +381 -0
- package/skills/peer-review/references/aczel_2021_reviewer2_patterns.md +88 -0
- package/skills/peer-review/references/domain-probes/ai_overclaiming.md +47 -0
- package/skills/peer-review/references/domain-probes/narrative_review.md +44 -0
- package/skills/peer-review/references/domain-probes/observational_confounding.md +48 -0
- package/skills/peer-review/references/domain-probes/radiomics.md +38 -0
- package/skills/peer-review/references/domain-probes/sr_ma.md +87 -0
- package/skills/peer-review/references/domain-probes/survival_prognostic.md +68 -0
- package/skills/peer-review/references/exemplar_reviews/README.md +43 -0
- package/skills/peer-review/references/exemplar_reviews/ai_overclaiming.md +47 -0
- package/skills/peer-review/references/exemplar_reviews/calibration_missing.md +44 -0
- package/skills/peer-review/references/exemplar_reviews/data_leakage.md +48 -0
- package/skills/peer-review/references/exemplar_reviews/reference_standard_validity.md +45 -0
- package/skills/peer-review/references/narrative_review_audit.md +67 -0
- package/skills/peer-review/references/reviewer_calibration/README.md +34 -0
- package/skills/peer-review/references/reviewer_calibration/compliance_floor.md +52 -0
- package/skills/peer-review/references/reviewer_profiles/AJR.md +82 -0
- package/skills/peer-review/references/reviewer_profiles/EURE.md +64 -0
- package/skills/peer-review/references/reviewer_profiles/INSI.md +57 -0
- package/skills/peer-review/references/reviewer_profiles/KJR.md +100 -0
- package/skills/peer-review/references/reviewer_profiles/README.md +32 -0
- package/skills/peer-review/references/reviewer_profiles/RYAI.md +86 -0
- package/skills/peer-review/skill.yml +39 -0
- package/skills/present-paper/SKILL.md +675 -0
- package/skills/present-paper/references/critic_rubrics/slide.md +155 -0
- package/skills/present-paper/references/generate_pptx_templates.py +604 -0
- package/skills/present-paper/references/medical_presentation_templates.md +277 -0
- package/skills/present-paper/references/slide_design_principles.md +202 -0
- package/skills/present-paper/references/slide_visual_styles/nature_lancet.md +168 -0
- package/skills/present-paper/references/workflow-checklist.md +109 -0
- package/skills/present-paper/scripts/extract_pdf_figures.py +243 -0
- package/skills/present-paper/scripts/inject_pronunciation_notes.py +178 -0
- package/skills/present-paper/scripts/inject_speaker_notes.py +133 -0
- package/skills/present-paper/scripts/strip_notes_for_sharing.py +140 -0
- package/skills/present-paper/scripts/trim_caption.py +271 -0
- package/skills/present-paper/skill.yml +41 -0
- package/skills/present-paper/templates/build_pptx_nature_lancet.py +688 -0
- package/skills/publish-skill/SKILL.md +370 -0
- package/skills/publish-skill/references/license-compatibility-matrix.md +132 -0
- package/skills/publish-skill/references/pii-patterns.md +130 -0
- package/skills/publish-skill/scripts/audit_skill.sh +278 -0
- package/skills/publish-skill/skill.yml +35 -0
- package/skills/render-pdf-doc/SKILL.md +146 -0
- package/skills/render-pdf-doc/references/known_pitfalls.md +53 -0
- package/skills/render-pdf-doc/references/pandoc_korean_cheatsheet.md +77 -0
- package/skills/render-pdf-doc/scripts/check_deps.sh +42 -0
- package/skills/render-pdf-doc/scripts/infer_colwidths.py +164 -0
- package/skills/render-pdf-doc/scripts/render_pdf.sh +98 -0
- package/skills/render-pdf-doc/skill.yml +57 -0
- package/skills/render-pdf-doc/templates/anchor-doc.md +27 -0
- package/skills/render-pdf-doc/templates/anchor-doc_ko.md +25 -0
- package/skills/render-pdf-doc/templates/briefing-handout.md +33 -0
- package/skills/render-pdf-doc/templates/briefing-handout_ko.md +31 -0
- package/skills/render-pdf-doc/templates/proposal-cover.md +33 -0
- package/skills/render-pdf-doc/templates/proposal-cover_ko.md +31 -0
- package/skills/render-pdf-doc/templates/reference-table.md +22 -0
- package/skills/render-pdf-doc/templates/reference-table_ko.md +20 -0
- package/skills/replicate-study/SKILL.md +150 -0
- package/skills/replicate-study/references/harmonization_3country.csv +47 -0
- package/skills/replicate-study/references/harmonization_knhanes_nhanes.csv +68 -0
- package/skills/replicate-study/references/methodology_extraction_template.md +134 -0
- package/skills/replicate-study/skill.yml +37 -0
- package/skills/review-paper/SKILL.md +104 -0
- package/skills/review-paper/references/macro_skeleton.md +6 -0
- package/skills/review-paper/skill.yml +25 -0
- package/skills/revise/SKILL.md +515 -0
- package/skills/revise/references/r2r_voice.md +346 -0
- package/skills/revise/skill.yml +43 -0
- package/skills/search-lit/SKILL.md +443 -0
- package/skills/search-lit/references/parse_pubmed.py +326 -0
- package/skills/search-lit/references/pubmed_eutils.sh +111 -0
- package/skills/search-lit/skill.yml +46 -0
- package/skills/self-review/SKILL.md +1045 -0
- package/skills/self-review/references/domain-probes/ai_overclaiming.md +47 -0
- package/skills/self-review/references/domain-probes/narrative_review.md +44 -0
- package/skills/self-review/references/domain-probes/observational_confounding.md +48 -0
- package/skills/self-review/references/domain-probes/radiomics.md +38 -0
- package/skills/self-review/references/domain-probes/sr_ma.md +87 -0
- package/skills/self-review/references/domain-probes/survival_prognostic.md +68 -0
- package/skills/self-review/references/exemplar_findings/README.md +43 -0
- package/skills/self-review/references/exemplar_findings/cohort_arithmetic_mismatch.md +35 -0
- package/skills/self-review/references/exemplar_findings/estimand_drift_posthoc_primary.md +39 -0
- package/skills/self-review/references/exemplar_findings/scope_overreach_cross_sectional.md +35 -0
- package/skills/self-review/references/exemplar_findings/unadjusted_confounder.md +36 -0
- package/skills/self-review/references/panel_review_template.md +177 -0
- package/skills/self-review/scripts/check_artifact_coverage.py +301 -0
- package/skills/self-review/scripts/check_claim_artifact.py +248 -0
- package/skills/self-review/scripts/check_classical_style.py +185 -0
- package/skills/self-review/scripts/check_cohort_arithmetic.py +481 -0
- package/skills/self-review/scripts/check_confounding_completeness.py +287 -0
- package/skills/self-review/scripts/check_panel_diversity.py +336 -0
- package/skills/self-review/scripts/check_reference_adequacy.py +392 -0
- package/skills/self-review/scripts/check_reviewer_team_consistency.py +412 -0
- package/skills/self-review/scripts/check_scope_coherence.py +177 -0
- package/skills/self-review/skill.yml +47 -0
- package/skills/self-review/tests/fixtures/claim_manuscript.md +17 -0
- package/skills/self-review/tests/fixtures/claim_prereg.md +6 -0
- package/skills/self-review/tests/fixtures/cohort_bad.md +21 -0
- package/skills/self-review/tests/fixtures/cohort_clean.md +21 -0
- package/skills/self-review/tests/fixtures/cohort_partition.csv +5 -0
- package/skills/self-review/tests/fixtures/coverage_analysis/31_delong_nested_added_value.csv +3 -0
- package/skills/self-review/tests/fixtures/coverage_analysis/table1_demographics.csv +3 -0
- package/skills/self-review/tests/fixtures/coverage_clean.md +13 -0
- package/skills/self-review/tests/fixtures/coverage_manuscript.md +11 -0
- package/skills/self-review/tests/fixtures/panel_collapse.json +27 -0
- package/skills/self-review/tests/fixtures/panel_good.json +32 -0
- package/skills/self-review/tests/fixtures/panel_monoculture.json +32 -0
- package/skills/self-review/tests/fixtures/refadeq_letter.md +13 -0
- package/skills/self-review/tests/fixtures/refadeq_original_fixed.md +42 -0
- package/skills/self-review/tests/fixtures/refadeq_original_uncited.md +40 -0
- package/skills/self-review/tests/fixtures/scope_bad.md +9 -0
- package/skills/self-review/tests/fixtures/scope_clean.md +8 -0
- package/skills/self-review/tests/fixtures/scope_surrogate.md +8 -0
- package/skills/self-review/tests/fixtures/style_bad.md +13 -0
- package/skills/self-review/tests/fixtures/style_clean.md +11 -0
- package/skills/self-review/tests/fixtures/table1_by_exposure.csv +11 -0
- package/skills/self-review/tests/test_artifact_coverage.sh +44 -0
- package/skills/self-review/tests/test_claim_artifact.sh +50 -0
- package/skills/self-review/tests/test_classical_style.sh +44 -0
- package/skills/self-review/tests/test_cohort_arithmetic.sh +49 -0
- package/skills/self-review/tests/test_confounding_completeness.sh +66 -0
- package/skills/self-review/tests/test_panel_diversity.sh +55 -0
- package/skills/self-review/tests/test_panel_mode.sh +69 -0
- package/skills/self-review/tests/test_reference_adequacy.sh +68 -0
- package/skills/self-review/tests/test_reviewer_team_consistency.sh +138 -0
- package/skills/self-review/tests/test_scope_coherence.sh +46 -0
- package/skills/setup-medsci/SKILL.md +110 -0
- package/skills/setup-medsci/references/setup-checklist.md +51 -0
- package/skills/setup-medsci/skill.yml +30 -0
- package/skills/sync-submission/SKILL.md +382 -0
- package/skills/sync-submission/scripts/author_registry_example.yaml +36 -0
- package/skills/sync-submission/scripts/blind_sweep.py +203 -0
- package/skills/sync-submission/scripts/check_asset_anonymization.py +300 -0
- package/skills/sync-submission/scripts/check_cross_artifact_stale.py +211 -0
- package/skills/sync-submission/scripts/cover_letter_drift_check.py +451 -0
- package/skills/sync-submission/scripts/cross_document_n_check.py +486 -0
- package/skills/sync-submission/scripts/detect_copy_divergence.py +136 -0
- package/skills/sync-submission/scripts/preflight_gate.py +458 -0
- package/skills/sync-submission/scripts/scope_drift_check.py +362 -0
- package/skills/sync-submission/scripts/sync_submission.py +169 -0
- package/skills/sync-submission/skill.yml +43 -0
- package/skills/sync-submission/tests/fixtures/copy_ok.md +5 -0
- package/skills/sync-submission/tests/fixtures/copy_stale.md +5 -0
- package/skills/sync-submission/tests/fixtures/ssot.md +5 -0
- package/skills/sync-submission/tests/test_asset_anonymization.sh +99 -0
- package/skills/sync-submission/tests/test_copy_divergence.sh +44 -0
- package/skills/sync-submission/tests/test_cross_artifact_stale.sh +80 -0
- package/skills/sync-submission/tests/test_cross_document_n.sh +132 -0
- package/skills/sync-submission/tests/test_preflight_gate.sh +112 -0
- package/skills/sync-submission/tests/test_scope_drift.sh +122 -0
- package/skills/sync-submission/tests/test_vN_docx_assertion.sh +51 -0
- package/skills/verify-refs/SKILL.md +177 -0
- package/skills/verify-refs/references/manual_checkpoint_guide.md +100 -0
- package/skills/verify-refs/scripts/verify_cli.sh +62 -0
- package/skills/verify-refs/scripts/verify_refs.py +782 -0
- package/skills/verify-refs/skill.yml +44 -0
- package/skills/verify-refs/tests/fixtures/pagination_placeholder.bib +17 -0
- package/skills/verify-refs/tests/test_pagination_placeholder.sh +42 -0
- package/skills/version-dataset/SKILL.md +143 -0
- package/skills/version-dataset/references/manifest_schema.md +72 -0
- package/skills/version-dataset/scripts/version_dataset.py +242 -0
- package/skills/version-dataset/skill.yml +35 -0
- package/skills/version-dataset/tests/test_version_dataset.sh +52 -0
- package/skills/write-paper/SKILL.md +1148 -0
- package/skills/write-paper/references/exemplar_methods/README.md +38 -0
- package/skills/write-paper/references/exemplar_methods/ai_validation_tripod_claim.md +47 -0
- package/skills/write-paper/references/exemplar_methods/diagnostic_accuracy_stard.md +50 -0
- package/skills/write-paper/references/exemplar_methods/observational_cohort_strobe.md +43 -0
- package/skills/write-paper/references/journal_profiles/AJNR.md +185 -0
- package/skills/write-paper/references/journal_profiles/AJR.md +149 -0
- package/skills/write-paper/references/journal_profiles/Abdominal_Radiology.md +139 -0
- package/skills/write-paper/references/journal_profiles/Academic_Radiology.md +90 -0
- package/skills/write-paper/references/journal_profiles/Annals_of_Internal_Medicine.md +150 -0
- package/skills/write-paper/references/journal_profiles/Artificial_Intelligence_in_Medicine.md +82 -0
- package/skills/write-paper/references/journal_profiles/British_Journal_of_Radiology.md +161 -0
- package/skills/write-paper/references/journal_profiles/CVIR.md +157 -0
- package/skills/write-paper/references/journal_profiles/Chest.md +270 -0
- package/skills/write-paper/references/journal_profiles/Clinical_Radiology.md +160 -0
- package/skills/write-paper/references/journal_profiles/Clinical_and_Molecular_Hepatology.md +147 -0
- package/skills/write-paper/references/journal_profiles/Diabetes_Metabolism_Journal.md +163 -0
- package/skills/write-paper/references/journal_profiles/Diagnostic_and_Interventional_Radiology.md +216 -0
- package/skills/write-paper/references/journal_profiles/Endocrinology_and_Metabolism.md +167 -0
- package/skills/write-paper/references/journal_profiles/European_Journal_of_Preventive_Cardiology.md +192 -0
- package/skills/write-paper/references/journal_profiles/European_Radiology.md +159 -0
- package/skills/write-paper/references/journal_profiles/Hepatology_Communications.md +110 -0
- package/skills/write-paper/references/journal_profiles/Hepatology_International.md +106 -0
- package/skills/write-paper/references/journal_profiles/IEEE_TMI.md +180 -0
- package/skills/write-paper/references/journal_profiles/INSI.md +163 -0
- package/skills/write-paper/references/journal_profiles/Investigative_Radiology.md +86 -0
- package/skills/write-paper/references/journal_profiles/JACC_Advances.md +197 -0
- package/skills/write-paper/references/journal_profiles/JACC_Asia.md +168 -0
- package/skills/write-paper/references/journal_profiles/JACR.md +87 -0
- package/skills/write-paper/references/journal_profiles/JAMA.md +188 -0
- package/skills/write-paper/references/journal_profiles/JAMA_Network_Open.md +170 -0
- package/skills/write-paper/references/journal_profiles/JCSM.md +266 -0
- package/skills/write-paper/references/journal_profiles/JKMS.md +201 -0
- package/skills/write-paper/references/journal_profiles/JMIR.md +88 -0
- package/skills/write-paper/references/journal_profiles/JMIR_Medical_Education.md +86 -0
- package/skills/write-paper/references/journal_profiles/JNIS.md +227 -0
- package/skills/write-paper/references/journal_profiles/JVIR.md +158 -0
- package/skills/write-paper/references/journal_profiles/Journal_of_Clinical_Endocrinology_and_Metabolism.md +191 -0
- package/skills/write-paper/references/journal_profiles/Journal_of_Stroke.md +176 -0
- package/skills/write-paper/references/journal_profiles/KJR.md +185 -0
- package/skills/write-paper/references/journal_profiles/Korean_Circulation_Journal.md +184 -0
- package/skills/write-paper/references/journal_profiles/Korean_Journal_of_Internal_Medicine.md +178 -0
- package/skills/write-paper/references/journal_profiles/Lancet_Gastroenterology_and_Hepatology.md +127 -0
- package/skills/write-paper/references/journal_profiles/Liver_International.md +165 -0
- package/skills/write-paper/references/journal_profiles/Medical_Image_Analysis.md +147 -0
- package/skills/write-paper/references/journal_profiles/NEJM.md +147 -0
- package/skills/write-paper/references/journal_profiles/Nature_Medicine.md +181 -0
- package/skills/write-paper/references/journal_profiles/Neuroradiology.md +151 -0
- package/skills/write-paper/references/journal_profiles/Nutrition_Metabolism_and_Cardiovascular_Diseases.md +184 -0
- package/skills/write-paper/references/journal_profiles/PLOS_Medicine.md +166 -0
- package/skills/write-paper/references/journal_profiles/RYAI.md +124 -0
- package/skills/write-paper/references/journal_profiles/Radiology.md +173 -0
- package/skills/write-paper/references/journal_profiles/Skeletal_Radiology.md +135 -0
- package/skills/write-paper/references/journal_profiles/Stroke.md +210 -0
- package/skills/write-paper/references/journal_profiles/The_BMJ.md +121 -0
- package/skills/write-paper/references/journal_profiles/The_Lancet.md +112 -0
- package/skills/write-paper/references/journal_profiles/The_Lancet_Digital_Health.md +104 -0
- package/skills/write-paper/references/journal_profiles/World_Journal_of_Hepatology.md +106 -0
- package/skills/write-paper/references/journal_profiles/npj_Digital_Medicine.md +93 -0
- package/skills/write-paper/references/paper_types/ai_validation.md +270 -0
- package/skills/write-paper/references/paper_types/animal_study.md +194 -0
- package/skills/write-paper/references/paper_types/case_report.md +237 -0
- package/skills/write-paper/references/paper_types/cross_national.md +328 -0
- package/skills/write-paper/references/paper_types/letter.md +127 -0
- package/skills/write-paper/references/paper_types/meta_analysis.md +181 -0
- package/skills/write-paper/references/paper_types/nhis_cohort.md +297 -0
- package/skills/write-paper/references/paper_types/original_article.md +221 -0
- package/skills/write-paper/references/paper_types/technical_note.md +131 -0
- package/skills/write-paper/references/section_guides/discussion.md +155 -0
- package/skills/write-paper/references/section_guides/introduction.md +108 -0
- package/skills/write-paper/references/section_guides/methods.md +144 -0
- package/skills/write-paper/references/section_guides/results.md +113 -0
- package/skills/write-paper/references/section_guides/step7_1_classical_qc.md +67 -0
- package/skills/write-paper/references/section_guides/step7_4a_audit_recovery.md +74 -0
- package/skills/write-paper/references/section_guides/title_abstract.md +123 -0
- package/skills/write-paper/references/section_templates/methods_statistical.md +147 -0
- package/skills/write-paper/scripts/check_placeholders.py +182 -0
- package/skills/write-paper/skill.yml +48 -0
- package/skills/write-paper/tests/test_placeholders.sh +107 -0
- package/skills/write-protocol/SKILL.md +243 -0
- package/skills/write-protocol/references/ethics_checklist.md +150 -0
- package/skills/write-protocol/references/protocol_template.md +304 -0
- package/skills/write-protocol/skill.yml +34 -0
|
@@ -0,0 +1,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
|