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,448 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: lit-sync
|
|
3
|
+
description: Sync research references from .bib files to Zotero library + Obsidian literature notes. Extract cross-cutting concept notes when enough literature accumulates. Works after /search-lit or standalone.
|
|
4
|
+
triggers: lit-sync, 문헌 동기화, 레퍼런스 정리, 개념 노트 추출, lit sync, Zotero 동기화, reference sync, 참고문헌 옵시디언
|
|
5
|
+
tools: Read, Write, Edit, Bash, Grep, Glob
|
|
6
|
+
model: inherit
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
# Literature Sync: Zotero + Obsidian Pipeline
|
|
10
|
+
|
|
11
|
+
Takes the `.bib` output of `/search-lit` (or any user-specified .bib file) and
|
|
12
|
+
synchronizes the references into the Zotero library and Obsidian literature notes.
|
|
13
|
+
When enough literature notes accumulate, extracts cross-cutting concept notes.
|
|
14
|
+
|
|
15
|
+
## Communication Rules
|
|
16
|
+
|
|
17
|
+
- Communicate with the user in their preferred language.
|
|
18
|
+
- **Vault layout — honor what exists, default to English.** Before creating notes, detect the
|
|
19
|
+
vault's existing layout: if the vault already uses a particular folder structure (including a
|
|
20
|
+
Korean one such as `02 연구/문헌/` and `02 연구/개념노트/`), **honor it — never silently
|
|
21
|
+
rename a user's folders**. For a new or unclear vault, default to the English folders
|
|
22
|
+
`Literature/` and `Concepts/` with the English note templates below.
|
|
23
|
+
- A Korean opt-in variant (Korean folder layout + Korean-heading templates) lives in
|
|
24
|
+
`references/locale/ko/note_templates.md` — use it when the vault is Korean-structured or the
|
|
25
|
+
user prefers Korean notes.
|
|
26
|
+
|
|
27
|
+
## When to Use
|
|
28
|
+
|
|
29
|
+
- After `/search-lit` completes — sync the produced .bib into Zotero + Obsidian.
|
|
30
|
+
- Bulk-register references from an existing .bib into Zotero + Obsidian.
|
|
31
|
+
- Tidy the `references/` folder inside a project workspace.
|
|
32
|
+
- On explicit concept-extraction request → extract cross-cutting concepts from existing literature notes.
|
|
33
|
+
|
|
34
|
+
## Prerequisites
|
|
35
|
+
|
|
36
|
+
- **Project owner only** — `/lit-sync` is an owner-scoped operation per `docs/zotero_policy.md`. Collaborators consume the committed `manuscript/_src/refs.bib` snapshot read-only.
|
|
37
|
+
- Zotero desktop 7.x + Better BibTeX plugin installed.
|
|
38
|
+
- Better BibTeX "Keep updated" auto-export configured to `<project>/manuscript/_src/refs.bib` (owner setup checklist in `docs/zotero_policy.md` §Setup).
|
|
39
|
+
- Zotero MCP server available (skip the Zotero phase if not connected; auto-export refresh still fires once Zotero is reopened).
|
|
40
|
+
- Obsidian CLI or direct file writing to the Obsidian vault.
|
|
41
|
+
- Obsidian vault path: configured in user's environment (e.g., `$OBSIDIAN_VAULT`).
|
|
42
|
+
|
|
43
|
+
## Artifact Contract
|
|
44
|
+
|
|
45
|
+
Per `docs/artifact_contract.md`, `/lit-sync` is the **sole writer** of:
|
|
46
|
+
|
|
47
|
+
| Artifact | Writer | Readers |
|
|
48
|
+
|---|---|---|
|
|
49
|
+
| `manuscript/_src/refs.bib` | `/lit-sync` (via Better BibTeX auto-export trigger) | `/write-paper`, `/verify-refs`, `/render` |
|
|
50
|
+
| `references/zotero_collection.json` | `/lit-sync` | `/verify-refs`, `/sync-submission` |
|
|
51
|
+
|
|
52
|
+
Direct hand edits to `refs.bib` are drift — revert on sight.
|
|
53
|
+
|
|
54
|
+
## Pipeline Overview
|
|
55
|
+
|
|
56
|
+
```
|
|
57
|
+
.bib file (or /search-lit output)
|
|
58
|
+
│
|
|
59
|
+
▼ Phase 1: Parse
|
|
60
|
+
Extract DOI, PMID, title, authors, journal, year
|
|
61
|
+
│
|
|
62
|
+
▼ Phase 2: Zotero Sync (owner)
|
|
63
|
+
Dedupe → zotero_add_by_doi → place in collection → pin citekey
|
|
64
|
+
│
|
|
65
|
+
▼ Phase 2.5: refs.bib snapshot refresh
|
|
66
|
+
Trigger Better BibTeX auto-export → verify manuscript/_src/refs.bib mtime updated
|
|
67
|
+
│
|
|
68
|
+
▼ Phase 3: Obsidian Literature Notes
|
|
69
|
+
Create Literature/{citekey}.md (empty note OK — fill later with highlights)
|
|
70
|
+
│
|
|
71
|
+
▼ Phase 4: Concept Extraction (conditional)
|
|
72
|
+
≥10 literature notes → scan for cross-cutting concepts → propose concept notes
|
|
73
|
+
```
|
|
74
|
+
|
|
75
|
+
---
|
|
76
|
+
|
|
77
|
+
## Phase 1: Parse BibTeX
|
|
78
|
+
|
|
79
|
+
### Input
|
|
80
|
+
|
|
81
|
+
The user-specified .bib file path, or the .bib just produced by `/search-lit`.
|
|
82
|
+
|
|
83
|
+
### Process
|
|
84
|
+
|
|
85
|
+
```python
|
|
86
|
+
# Parse .bib entries with regex.
|
|
87
|
+
# Extract per entry:
|
|
88
|
+
# - citekey (e.g., Kim_2024_Validation)
|
|
89
|
+
# - doi
|
|
90
|
+
# - pmid
|
|
91
|
+
# - title
|
|
92
|
+
# - authors (first + last minimum)
|
|
93
|
+
# - journal
|
|
94
|
+
# - year
|
|
95
|
+
# - volume, number, pages (if present)
|
|
96
|
+
```
|
|
97
|
+
|
|
98
|
+
Log any parse failures and skip those entries.
|
|
99
|
+
|
|
100
|
+
---
|
|
101
|
+
|
|
102
|
+
## Phase 2: Zotero Sync
|
|
103
|
+
|
|
104
|
+
### Step 2.1: Determine project collection
|
|
105
|
+
|
|
106
|
+
Identify the project from the current working directory or from an explicit user
|
|
107
|
+
override. Reuse an existing collection key if one is recorded; otherwise create a
|
|
108
|
+
new collection.
|
|
109
|
+
|
|
110
|
+
**Collection mapping**: Check existing Zotero collections for the current project.
|
|
111
|
+
If no collection exists, create one with `zotero_create_collection`. Record the
|
|
112
|
+
collection key for future use.
|
|
113
|
+
|
|
114
|
+
### Step 2.2: Dedupe + add
|
|
115
|
+
|
|
116
|
+
For each entry:
|
|
117
|
+
|
|
118
|
+
1. Use `zotero_search_items` to search by DOI or title — if already present, skip.
|
|
119
|
+
2. Otherwise call `zotero_add_by_doi` (when a DOI is available) or
|
|
120
|
+
`zotero_add_by_url` (falling back to the PubMed URL when no DOI is available).
|
|
121
|
+
3. Use `zotero_manage_collections` to place the item in the project collection.
|
|
122
|
+
|
|
123
|
+
### Step 2.3: Result report
|
|
124
|
+
|
|
125
|
+
```
|
|
126
|
+
Zotero Sync:
|
|
127
|
+
Added: 8 papers (new)
|
|
128
|
+
Skipped: 3 papers (already in library)
|
|
129
|
+
Failed: 1 paper (no DOI/PMID)
|
|
130
|
+
Collection: RFA-Meta (TZQEP4NH)
|
|
131
|
+
```
|
|
132
|
+
|
|
133
|
+
If the Zotero MCP is not connected, skip this entire phase and proceed to Phase 3.
|
|
134
|
+
|
|
135
|
+
Always write `references/zotero_collection.json` in the project workspace:
|
|
136
|
+
|
|
137
|
+
```json
|
|
138
|
+
{
|
|
139
|
+
"schema_version": 1,
|
|
140
|
+
"status": "synced",
|
|
141
|
+
"collection": "RFA-Meta",
|
|
142
|
+
"collection_key": "TZQEP4NH",
|
|
143
|
+
"added": 8,
|
|
144
|
+
"skipped": 3,
|
|
145
|
+
"failed": 1
|
|
146
|
+
}
|
|
147
|
+
```
|
|
148
|
+
|
|
149
|
+
If Zotero is unavailable, write the same file with `status: "skipped"` and a
|
|
150
|
+
human-readable `reason`.
|
|
151
|
+
|
|
152
|
+
---
|
|
153
|
+
|
|
154
|
+
## Phase 2.5: refs.bib snapshot refresh
|
|
155
|
+
|
|
156
|
+
Better BibTeX "Keep updated" auto-export normally refreshes `manuscript/_src/refs.bib` within seconds of a Zotero change. This phase **verifies** the snapshot actually updated before downstream skills consume it.
|
|
157
|
+
|
|
158
|
+
### Step 2.5.1: Resolve path
|
|
159
|
+
|
|
160
|
+
Read `SSOT.yaml` → `truth.refs_bib`. Default: `manuscript/_src/refs.bib`. If absent (legacy project), fall back to `manuscript/_src/refs.bib` and emit a WARN recommending SSOT migration.
|
|
161
|
+
|
|
162
|
+
### Step 2.5.1b: Precondition assertion (early-exit, do NOT poll)
|
|
163
|
+
|
|
164
|
+
Before entering the 10s polling loop in Step 2.5.2, verify both preconditions. If **either** fails, abort Phase 2.5 with setup instructions instead of waiting for a timeout that will never resolve.
|
|
165
|
+
|
|
166
|
+
1. **BBT auto-export registered.** `~/Zotero/better-bibtex/read-only.json` must be a non-empty JSON list. Check with:
|
|
167
|
+
|
|
168
|
+
```bash
|
|
169
|
+
python3 -c 'import json,sys,pathlib; p=pathlib.Path.home()/".zotero"/"zotero"/"Profiles"; \
|
|
170
|
+
f=pathlib.Path.home()/"Zotero"/"better-bibtex"/"read-only.json"; \
|
|
171
|
+
sys.exit(0 if f.exists() and json.loads(f.read_text() or "[]") else 1)'
|
|
172
|
+
```
|
|
173
|
+
|
|
174
|
+
Or equivalent shell: `[ -s ~/Zotero/better-bibtex/read-only.json ] && [ "$(jq 'length' ~/Zotero/better-bibtex/read-only.json)" -gt 0 ]`.
|
|
175
|
+
|
|
176
|
+
On failure print:
|
|
177
|
+
|
|
178
|
+
> Phase 2.5 skipped: BBT auto-export not configured (`~/Zotero/better-bibtex/read-only.json` is empty or missing). Set up "Keep updated" auto-export per `docs/zotero_policy.md` §Setup, then re-run `/lit-sync`.
|
|
179
|
+
|
|
180
|
+
2. **Target refs.bib exists.** The resolved `truth.refs_bib` path from Step 2.5.1 must exist on disk (even empty is OK — BBT will overwrite). On failure print:
|
|
181
|
+
|
|
182
|
+
> Phase 2.5 skipped: target snapshot `<path>` not found. Configure BBT auto-export with "On Change" to the SSOT path, then re-run.
|
|
183
|
+
|
|
184
|
+
In either early-exit, set `refs_bib_refreshed: false` + `reason: "precondition:<which>"` in the Step 2.5.3 JSON and return control to the caller. `/verify-refs` treats `refs_bib_refreshed: false` as an unverified snapshot — downstream skills (`/write-paper`, `/render`) block until the precondition is resolved.
|
|
185
|
+
|
|
186
|
+
Rationale (2026-04-24 Phase 1B-b dry-run): on a machine with BBT installed but no auto-export registered, the original Step 2.5.2 polled for 10s then emitted a generic "mtime unchanged" WARN that did not point at the actual cause. Findings: `~/.local/cache/phase1b_b_dryrun/findings.md`.
|
|
187
|
+
|
|
188
|
+
### Step 2.5.2: Verify refresh
|
|
189
|
+
|
|
190
|
+
After Phase 2 adds items:
|
|
191
|
+
|
|
192
|
+
1. Capture `stat -f "%m" manuscript/_src/refs.bib` before Zotero writes.
|
|
193
|
+
2. Wait up to 10s (Better BibTeX debounce). Poll mtime.
|
|
194
|
+
3. If mtime unchanged after 10s:
|
|
195
|
+
- Prompt user to check Zotero is running and BBT export is "Keep updated".
|
|
196
|
+
- If BBT auto-export path is wrong, print the expected path (`<project>/manuscript/_src/refs.bib`) and refer to `docs/zotero_policy.md` §Setup.
|
|
197
|
+
- As last resort, offer manual export: `File → Export Library → Better BibTeX → target path`.
|
|
198
|
+
4. Once mtime advances, grep for the newly added citekeys. All must be present; if any is missing, report as failure (do NOT fabricate entries).
|
|
199
|
+
|
|
200
|
+
### Step 2.5.3: Record in zotero_collection.json
|
|
201
|
+
|
|
202
|
+
Append to the JSON written in Step 2.3:
|
|
203
|
+
|
|
204
|
+
```json
|
|
205
|
+
{
|
|
206
|
+
"refs_bib_path": "manuscript/_src/refs.bib",
|
|
207
|
+
"refs_bib_mtime": "2026-04-24T14:32:11Z",
|
|
208
|
+
"refs_bib_refreshed": true,
|
|
209
|
+
"citekeys_verified": ["Kim_2024_Validation", "..."]
|
|
210
|
+
}
|
|
211
|
+
```
|
|
212
|
+
|
|
213
|
+
If refresh failed, set `refs_bib_refreshed: false` and include `reason`. `/verify-refs` uses this flag to decide whether the snapshot is trustworthy.
|
|
214
|
+
|
|
215
|
+
---
|
|
216
|
+
|
|
217
|
+
## Phase 3: Obsidian Literature Notes
|
|
218
|
+
|
|
219
|
+
### Step 3.1: Check existing literature notes
|
|
220
|
+
|
|
221
|
+
```bash
|
|
222
|
+
# Default English layout; substitute the vault's existing folder if one is present
|
|
223
|
+
# (e.g. "02 연구/문헌/" for a Korean-structured vault — see references/locale/ko/note_templates.md).
|
|
224
|
+
ls "$VAULT/Literature/" | grep -v "📊" | wc -l
|
|
225
|
+
```
|
|
226
|
+
|
|
227
|
+
### Step 3.2: Create literature notes
|
|
228
|
+
|
|
229
|
+
For each .bib entry, create `Literature/{citekey}.md` (or the vault's existing literature folder).
|
|
230
|
+
**Skip if the file already exists** (never overwrite).
|
|
231
|
+
|
|
232
|
+
#### Template
|
|
233
|
+
|
|
234
|
+
```markdown
|
|
235
|
+
---
|
|
236
|
+
notetype: literature
|
|
237
|
+
citekey: "{citekey}"
|
|
238
|
+
title: "{title}"
|
|
239
|
+
authors: "{authors}"
|
|
240
|
+
journal: "{journal}"
|
|
241
|
+
year: {year}
|
|
242
|
+
doi: "{doi}"
|
|
243
|
+
pmid: "{pmid}"
|
|
244
|
+
created: "{today}"
|
|
245
|
+
tags:
|
|
246
|
+
- type/literature
|
|
247
|
+
- _unread
|
|
248
|
+
---
|
|
249
|
+
|
|
250
|
+
# {title}
|
|
251
|
+
|
|
252
|
+
## Bibliographic info
|
|
253
|
+
- **Authors**: {authors}
|
|
254
|
+
- **Journal**: {journal}{volume_issue_pages}
|
|
255
|
+
- **Year**: {year}
|
|
256
|
+
- **DOI**: [{doi}](https://doi.org/{doi})
|
|
257
|
+
{pmid_line}
|
|
258
|
+
|
|
259
|
+
## Key points (in my own words)
|
|
260
|
+
|
|
261
|
+
|
|
262
|
+
|
|
263
|
+
## My thoughts
|
|
264
|
+
|
|
265
|
+
|
|
266
|
+
|
|
267
|
+
## Related notes
|
|
268
|
+
- [[Research Hub]]
|
|
269
|
+
- [[Papers & Reviews]]
|
|
270
|
+
-
|
|
271
|
+
-
|
|
272
|
+
```
|
|
273
|
+
|
|
274
|
+
(For a Korean-structured vault, use the Korean-heading template in `references/locale/ko/note_templates.md` and the vault's own hub-note names.)
|
|
275
|
+
|
|
276
|
+
**Rules:**
|
|
277
|
+
- `notetype: literature` — compatible with the Zotero Integration template.
|
|
278
|
+
- `_unread` tag — change to `_read` later after the user reads the PDF in Zotero and adds highlights.
|
|
279
|
+
- Leave `## Key points` and `## My thoughts` blank — the user fills these in personally.
|
|
280
|
+
- `## Related notes` contains 2 hub links + 2 empty slots (reserved for later concept-note linking).
|
|
281
|
+
- If a PMID is available, add a PubMed link.
|
|
282
|
+
|
|
283
|
+
### Step 3.3: Result report
|
|
284
|
+
|
|
285
|
+
```
|
|
286
|
+
Obsidian Literature Notes:
|
|
287
|
+
Created: 8 notes (new)
|
|
288
|
+
Skipped: 3 notes (already exist)
|
|
289
|
+
Location: Literature/
|
|
290
|
+
Total in vault: 12 literature notes
|
|
291
|
+
```
|
|
292
|
+
|
|
293
|
+
---
|
|
294
|
+
|
|
295
|
+
## Phase 4: Concept Extraction (conditional)
|
|
296
|
+
|
|
297
|
+
### Trigger condition
|
|
298
|
+
|
|
299
|
+
Run this phase only when there are **≥10** literature notes in the vault.
|
|
300
|
+
If fewer exist, print a status message like "N literature notes — concept extraction
|
|
301
|
+
unlocks at ≥10" and stop.
|
|
302
|
+
|
|
303
|
+
### Step 4.1: Cross-cutting concept scan
|
|
304
|
+
|
|
305
|
+
Read all files under `Literature/*.md` (or the vault's existing literature folder):
|
|
306
|
+
1. Extract keywords from each paper's title, journal, and tags.
|
|
307
|
+
2. Extract major concepts from the .bib entry titles.
|
|
308
|
+
3. Identify **concepts that co-occur across ≥3 literature notes**.
|
|
309
|
+
|
|
310
|
+
### Step 4.2: Filtering (5 exclusion rules)
|
|
311
|
+
|
|
312
|
+
Exclude from concept candidates:
|
|
313
|
+
- Model names (GPT-4, Claude, etc.).
|
|
314
|
+
- Dataset names (MedQA, ImageNet, etc.).
|
|
315
|
+
- Journal names.
|
|
316
|
+
- Institution names.
|
|
317
|
+
- Generic technique names (too unspecific).
|
|
318
|
+
|
|
319
|
+
Whatever remains becomes a concept-note candidate.
|
|
320
|
+
|
|
321
|
+
### Step 4.3: Draft concept note
|
|
322
|
+
|
|
323
|
+
Create `Concepts/{concept name}.md` (or the vault's existing concept-note folder):
|
|
324
|
+
|
|
325
|
+
```markdown
|
|
326
|
+
---
|
|
327
|
+
title: "{concept name}"
|
|
328
|
+
type: concept
|
|
329
|
+
tags:
|
|
330
|
+
- concept
|
|
331
|
+
- {domain tag}
|
|
332
|
+
aliases:
|
|
333
|
+
- {alternative name}
|
|
334
|
+
related_papers:
|
|
335
|
+
- "[[{lit-note-1}]]"
|
|
336
|
+
- "[[{lit-note-2}]]"
|
|
337
|
+
- "[[{lit-note-3}]]"
|
|
338
|
+
status: 🌱Seedling
|
|
339
|
+
---
|
|
340
|
+
|
|
341
|
+
# {concept name}
|
|
342
|
+
|
|
343
|
+
## Definition (My Understanding)
|
|
344
|
+
> TODO: write in your own words
|
|
345
|
+
|
|
346
|
+
## Why it matters
|
|
347
|
+
{why the concept matters in this domain — AI supplies a draft}
|
|
348
|
+
|
|
349
|
+
## Per-paper perspectives
|
|
350
|
+
- **[[{lit-note-1}]]**: {this paper's angle}
|
|
351
|
+
- **[[{lit-note-2}]]**: {a different angle}
|
|
352
|
+
- **[[{lit-note-3}]]**: {comparison / complement}
|
|
353
|
+
|
|
354
|
+
## Related concepts
|
|
355
|
+
- [[{another concept}]]
|
|
356
|
+
|
|
357
|
+
## Open questions
|
|
358
|
+
- {open question 1}
|
|
359
|
+
- {open question 2}
|
|
360
|
+
|
|
361
|
+
## Related notes
|
|
362
|
+
- [[Research Hub]]
|
|
363
|
+
- [[{related project hub}]]
|
|
364
|
+
- [[{lit-note-1}]]
|
|
365
|
+
- [[{lit-note-2}]]
|
|
366
|
+
```
|
|
367
|
+
|
|
368
|
+
(For a Korean-structured vault, use the Korean-heading concept template in `references/locale/ko/note_templates.md`.)
|
|
369
|
+
|
|
370
|
+
**Key rules:**
|
|
371
|
+
- Keep the `## Definition` section as a `> TODO` marker — the 2nd-layer note only becomes
|
|
372
|
+
meaningful once the user writes the definition in their own words.
|
|
373
|
+
- `status` always starts at `🌱Seedling`.
|
|
374
|
+
- At least 4 wikilinks under `## Related notes` (vault convention).
|
|
375
|
+
|
|
376
|
+
### Step 4.4: Propose to the user
|
|
377
|
+
|
|
378
|
+
```
|
|
379
|
+
Concept-note candidates (≥3 papers cross-referenced):
|
|
380
|
+
1. {Concept A} (4 papers)
|
|
381
|
+
2. {Concept B} (3 papers)
|
|
382
|
+
3. {Concept C} (5 papers)
|
|
383
|
+
|
|
384
|
+
Create? (all / selected / skip)
|
|
385
|
+
```
|
|
386
|
+
|
|
387
|
+
Create only after user confirmation. **Auto-draft but always confirm.**
|
|
388
|
+
|
|
389
|
+
---
|
|
390
|
+
|
|
391
|
+
## Standalone Modes
|
|
392
|
+
|
|
393
|
+
This skill can run without a fresh .bib file.
|
|
394
|
+
|
|
395
|
+
### Concept extraction only
|
|
396
|
+
On an explicit concept-extraction request, scan existing
|
|
397
|
+
`Literature/*.md` (or the vault's existing literature folder) and run only Phase 4.
|
|
398
|
+
|
|
399
|
+
### References tidy
|
|
400
|
+
On a "tidy this project's references" request, locate `.bib` files inside the
|
|
401
|
+
workspace and run Phase 1–3.
|
|
402
|
+
|
|
403
|
+
### Zotero sync only
|
|
404
|
+
On a "sync Zotero" request, diff the Zotero collection against the `.bib` file
|
|
405
|
+
and add whatever is missing.
|
|
406
|
+
|
|
407
|
+
### PMID-list ingestion (no .bib)
|
|
408
|
+
When the user supplies a list of PMIDs (e.g., from a HANDOFF or a colleague), resolve
|
|
409
|
+
PMIDs to DOIs via PubMed esummary first, then enter Phase 2 with the DOIs:
|
|
410
|
+
|
|
411
|
+
```bash
|
|
412
|
+
PMIDS="12345,67890,..."
|
|
413
|
+
curl -s "https://eutils.ncbi.nlm.nih.gov/entrez/eutils/esummary.fcgi?db=pubmed&id=${PMIDS}&retmode=json" \
|
|
414
|
+
| jq -r '.result | to_entries[] | select(.key != "uids") | "\(.value.uid)\t\(.value.elocationid)\t\(.value.title)"'
|
|
415
|
+
```
|
|
416
|
+
|
|
417
|
+
For each resolved DOI call `zotero_add_by_doi` (auto-dedup by DOI). For items
|
|
418
|
+
already in the library (returned as "skipped" or detected via `zotero_search_items`
|
|
419
|
+
by DOI), use `zotero_manage_collections` to attach them to the project collection
|
|
420
|
+
**without re-adding** — re-adding by URL/PubMed-URL would bypass DOI dedup and
|
|
421
|
+
create duplicates. Record both `added` and `existing` items in
|
|
422
|
+
`references/zotero_collection.json`.
|
|
423
|
+
|
|
424
|
+
If a PMID has no DOI in PubMed (rare; older papers, non-indexed), fall back to
|
|
425
|
+
`zotero_add_by_url` with the PubMed URL and mark the entry as `no_doi: true`.
|
|
426
|
+
|
|
427
|
+
---
|
|
428
|
+
|
|
429
|
+
## Safety Rules
|
|
430
|
+
|
|
431
|
+
1. **Never overwrite literature notes** — the user may have added highlights or
|
|
432
|
+
personal notes.
|
|
433
|
+
2. **Never auto-fill `## Definition` of a concept note** — keep the TODO marker; the
|
|
434
|
+
essence of the 2nd-layer note is the user's own wording.
|
|
435
|
+
3. **Skip Zotero for entries without a DOI** — ask the user to add those manually.
|
|
436
|
+
4. **Gracefully skip Zotero when the MCP is not connected** — Obsidian notes are
|
|
437
|
+
created independently; but do NOT hand-edit `refs.bib` to compensate (violates artifact contract).
|
|
438
|
+
5. **Always record the collection key** — report the key to the user when a new
|
|
439
|
+
collection is created.
|
|
440
|
+
6. **Never write `refs.bib` directly.** Only Better BibTeX auto-export may write that file. If auto-export is broken, fix the Zotero setup rather than writing the file from this skill.
|
|
441
|
+
7. **Owner-only execution.** If the current user is a collaborator (no Zotero access per `SSOT.yaml` `reference_manager.required_for`), abort with instructions to flag `[@NEW:topic]` placeholders in the manuscript and notify the owner.
|
|
442
|
+
|
|
443
|
+
## Anti-Hallucination
|
|
444
|
+
|
|
445
|
+
- **Never fabricate DOIs, PMIDs, or citation metadata.** All bibliographic data must come from the .bib file or API responses.
|
|
446
|
+
- **Never auto-fill the "Definition (My Understanding)" section** of concept notes. This must be written by the user.
|
|
447
|
+
- **Never overwrite existing literature notes.** User highlights and annotations may be present.
|
|
448
|
+
- If a DOI lookup fails, report the failure rather than guessing the metadata.
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
# Korean (ko) locale — Obsidian vault layout + note templates
|
|
2
|
+
|
|
3
|
+
> Opt-in Korean variant for `/lit-sync`. The skill defaults to English folder names
|
|
4
|
+
> (`Literature/`, `Concepts/`) and English note headings. Use this layout when the user's
|
|
5
|
+
> Obsidian vault already follows a Korean structure (the skill honors an existing layout) or
|
|
6
|
+
> when the user explicitly prefers Korean notes.
|
|
7
|
+
|
|
8
|
+
## Vault folder layout (Korean)
|
|
9
|
+
|
|
10
|
+
- Literature notes: `02 연구/문헌/{citekey}.md`
|
|
11
|
+
- Concept notes: `02 연구/개념노트/{concept name}.md`
|
|
12
|
+
|
|
13
|
+
```bash
|
|
14
|
+
# Step 3.1 — count existing literature notes
|
|
15
|
+
ls "$VAULT/02 연구/문헌/" | grep -v "📊" | wc -l
|
|
16
|
+
```
|
|
17
|
+
|
|
18
|
+
## Literature note template (Korean headings)
|
|
19
|
+
|
|
20
|
+
```markdown
|
|
21
|
+
---
|
|
22
|
+
notetype: literature
|
|
23
|
+
citekey: "{citekey}"
|
|
24
|
+
title: "{title}"
|
|
25
|
+
authors: "{authors}"
|
|
26
|
+
journal: "{journal}"
|
|
27
|
+
year: {year}
|
|
28
|
+
doi: "{doi}"
|
|
29
|
+
pmid: "{pmid}"
|
|
30
|
+
created: "{today}"
|
|
31
|
+
tags:
|
|
32
|
+
- type/literature
|
|
33
|
+
- _unread
|
|
34
|
+
---
|
|
35
|
+
|
|
36
|
+
# {title}
|
|
37
|
+
|
|
38
|
+
## 서지 정보
|
|
39
|
+
- **저자**: {authors}
|
|
40
|
+
- **저널**: {journal}{volume_issue_pages}
|
|
41
|
+
- **연도**: {year}
|
|
42
|
+
- **DOI**: [{doi}](https://doi.org/{doi})
|
|
43
|
+
{pmid_line}
|
|
44
|
+
|
|
45
|
+
## 핵심 내용 (내 언어로)
|
|
46
|
+
|
|
47
|
+
|
|
48
|
+
|
|
49
|
+
## 내 생각
|
|
50
|
+
|
|
51
|
+
|
|
52
|
+
|
|
53
|
+
## 관련 노트
|
|
54
|
+
- [[🗺️ 연구 종합]]
|
|
55
|
+
- [[🗺️ 논문과 리뷰]]
|
|
56
|
+
-
|
|
57
|
+
-
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
- Leave `## 핵심 내용` and `## 내 생각` blank — the user fills these in personally.
|
|
61
|
+
- `## 관련 노트` contains 2 hub links + 2 empty slots (reserved for later concept-note linking).
|
|
62
|
+
|
|
63
|
+
## Concept note template (Korean headings)
|
|
64
|
+
|
|
65
|
+
```markdown
|
|
66
|
+
---
|
|
67
|
+
title: "{concept name}"
|
|
68
|
+
type: concept
|
|
69
|
+
tags:
|
|
70
|
+
- 🧠개념
|
|
71
|
+
- {domain tag}
|
|
72
|
+
aliases:
|
|
73
|
+
- {English/Korean alternative name}
|
|
74
|
+
related_papers:
|
|
75
|
+
- "[[{lit-note-1}]]"
|
|
76
|
+
- "[[{lit-note-2}]]"
|
|
77
|
+
- "[[{lit-note-3}]]"
|
|
78
|
+
status: 🌱Seedling
|
|
79
|
+
---
|
|
80
|
+
|
|
81
|
+
# {concept name}
|
|
82
|
+
|
|
83
|
+
## 정의 (My Understanding)
|
|
84
|
+
> TODO: write in your own words
|
|
85
|
+
|
|
86
|
+
## 왜 중요한가
|
|
87
|
+
{why the concept matters in this domain — AI supplies a draft}
|
|
88
|
+
|
|
89
|
+
## 논문별 관점
|
|
90
|
+
- **[[{lit-note-1}]]**: {this paper's angle}
|
|
91
|
+
- **[[{lit-note-2}]]**: {a different angle}
|
|
92
|
+
- **[[{lit-note-3}]]**: {comparison / complement}
|
|
93
|
+
|
|
94
|
+
## 관련 개념
|
|
95
|
+
- [[{another concept}]]
|
|
96
|
+
|
|
97
|
+
## 열린 질문
|
|
98
|
+
- {open question 1}
|
|
99
|
+
- {open question 2}
|
|
100
|
+
|
|
101
|
+
## 관련 노트
|
|
102
|
+
- [[🗺️ 연구 종합]]
|
|
103
|
+
- [[{related project hub}]]
|
|
104
|
+
- [[{lit-note-1}]]
|
|
105
|
+
- [[{lit-note-2}]]
|
|
106
|
+
```
|
|
107
|
+
|
|
108
|
+
- Keep the `## 정의` section as a `> TODO` marker — the 2nd-layer note only becomes meaningful once the user writes the definition in their own words.
|
|
109
|
+
- Never auto-fill `## 정의` of a concept note — keep the TODO marker.
|
|
110
|
+
- At least 4 wikilinks under `## 관련 노트` (vault convention).
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
schema_version: 2
|
|
2
|
+
name: lit-sync
|
|
3
|
+
layer: A
|
|
4
|
+
owner_domain: zotero_sync
|
|
5
|
+
when_to_use:
|
|
6
|
+
- User wants to add PMIDs / DOIs / Zotero collection items to the project library
|
|
7
|
+
- After /search-lit when verified candidates need to flow into Zotero + refs.bib
|
|
8
|
+
- Cross-cutting concept-note extraction from accumulated literature into Obsidian
|
|
9
|
+
- Refreshing manuscript/_src/refs.bib via Better BibTeX auto-export before a build
|
|
10
|
+
when_NOT_to_use:
|
|
11
|
+
- Pure literature search without sync (use /search-lit)
|
|
12
|
+
- Hand-editing refs.bib (BBT is the sole writer; never touch the file directly)
|
|
13
|
+
- Reference verification audit (use /verify-refs)
|
|
14
|
+
inputs:
|
|
15
|
+
- references/library.bib # search-lit candidate pool (optional)
|
|
16
|
+
- PMID list, DOI list, or Zotero collection name
|
|
17
|
+
outputs:
|
|
18
|
+
- references/zotero_collection.json
|
|
19
|
+
- manuscript/_src/refs.bib # SOLE WRITER via Better BibTeX auto-export "Keep updated"
|
|
20
|
+
- obsidian_literature_notes
|
|
21
|
+
deterministic_scripts:
|
|
22
|
+
- none_required # leverages Zotero MCP + Better BibTeX auto-export GUI
|
|
23
|
+
side_effects:
|
|
24
|
+
- may_update_zotero
|
|
25
|
+
- may_write_obsidian_notes
|
|
26
|
+
- refreshes_manuscript_refs_bib # via BBT auto-export
|
|
27
|
+
downstream_consumers:
|
|
28
|
+
- write-paper
|
|
29
|
+
- verify-refs
|
|
30
|
+
- manage-refs # consumes refreshed refs.bib for citekey validation + CSL render
|
|
31
|
+
ssot_boundary:
|
|
32
|
+
- SOLE writer of manuscript/_src/refs.bib. write-paper, manage-refs, verify-refs are read-only consumers.
|
|
33
|
+
quality_gates:
|
|
34
|
+
- refs_bib_refreshed: refs.bib mtime newer than collection snapshot in zotero_collection.json
|
|
35
|
+
- bbt_auto_export_active: Better BibTeX "Keep updated" must be ON for the project collection (verified per ~/.claude/rules/zotero-workflow.md)
|
|
36
|
+
forbidden_actions:
|
|
37
|
+
- fabricate_bibliographic_metadata
|
|
38
|
+
- overwrite_existing_literature_notes
|
|
39
|
+
- hand_edit_manuscript_refs_bib # only Better BibTeX may write
|
|
40
|
+
|
|
41
|
+
# v2.1 quality card
|
|
42
|
+
purpose: "Sync verified references from .bib into Zotero and Obsidian literature notes, extracting cross-cutting concept notes when enough literature accumulates."
|
|
43
|
+
safety_boundaries:
|
|
44
|
+
- "Bibliographic metadata is never fabricated; only Better BibTeX may write refs.bib."
|
|
45
|
+
- "Existing literature notes are not overwritten."
|
|
46
|
+
known_limitations:
|
|
47
|
+
- "Depends on a connected Zotero MCP + Better BibTeX auto-export; degrades to manual without them."
|
|
48
|
+
- "No standalone demo; effects are in the user's Zotero/Obsidian."
|
|
49
|
+
validation_commands:
|
|
50
|
+
- "confirm refs.bib mtime refreshed via Better BibTeX"
|
|
51
|
+
- "zotero_find_duplicates after sync"
|
|
52
|
+
evidence_surface: manual_workflow
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
# Regression test for /lit-sync Phase 2.5 mtime-polling logic.
|
|
3
|
+
#
|
|
4
|
+
# Four synthetic scenarios (origin: ~/.local/cache/phase1b_b_dryrun/ dry-run,
|
|
5
|
+
# 2026-04-24). Runs in an isolated tmpdir; does not touch any real Zotero or
|
|
6
|
+
# project files. macOS (stat -f) and Linux (stat -c) compatible.
|
|
7
|
+
#
|
|
8
|
+
# Usage: bash skills/lit-sync/tests/test_poll_logic.sh
|
|
9
|
+
# Exit: 0 all pass, 1 any scenario fails.
|
|
10
|
+
|
|
11
|
+
set -u
|
|
12
|
+
|
|
13
|
+
TMP=$(mktemp -d)
|
|
14
|
+
trap 'rm -rf "$TMP"' EXIT
|
|
15
|
+
|
|
16
|
+
# Inline poll script — same logic shipped with lit-sync Phase 2.5 guidance.
|
|
17
|
+
POLL="$TMP/poll.sh"
|
|
18
|
+
cat > "$POLL" <<'POLL_EOF'
|
|
19
|
+
#!/usr/bin/env bash
|
|
20
|
+
TARGET="$1"
|
|
21
|
+
TIMEOUT="${2:-10}"
|
|
22
|
+
if stat -f "%m" /dev/null >/dev/null 2>&1; then
|
|
23
|
+
STAT_CMD='stat -f %m'
|
|
24
|
+
else
|
|
25
|
+
STAT_CMD='stat -c %Y'
|
|
26
|
+
fi
|
|
27
|
+
BEFORE=$($STAT_CMD "$TARGET")
|
|
28
|
+
START=$(date +%s)
|
|
29
|
+
while true; do
|
|
30
|
+
NOW=$($STAT_CMD "$TARGET")
|
|
31
|
+
if [[ "$NOW" != "$BEFORE" ]]; then
|
|
32
|
+
ELAPSED=$(( $(date +%s) - START ))
|
|
33
|
+
echo "DETECTED mtime change after ${ELAPSED}s"
|
|
34
|
+
exit 0
|
|
35
|
+
fi
|
|
36
|
+
if (( $(date +%s) - START >= TIMEOUT )); then
|
|
37
|
+
echo "TIMEOUT after ${TIMEOUT}s"
|
|
38
|
+
exit 1
|
|
39
|
+
fi
|
|
40
|
+
sleep 0.5
|
|
41
|
+
done
|
|
42
|
+
POLL_EOF
|
|
43
|
+
chmod +x "$POLL"
|
|
44
|
+
|
|
45
|
+
PASS=0
|
|
46
|
+
FAIL=0
|
|
47
|
+
|
|
48
|
+
run_scenario() {
|
|
49
|
+
local name="$1" window="$2" write_at="$3" expected_exit="$4"
|
|
50
|
+
local bib="$TMP/refs_${name//[^a-z0-9]/_}.bib"
|
|
51
|
+
echo "@misc{test, title={x}}" > "$bib"
|
|
52
|
+
# Age the file so mtime isn't "now" (macOS second-granularity could cause
|
|
53
|
+
# the initial BEFORE to match a sub-second later write).
|
|
54
|
+
touch -t 202001010000 "$bib"
|
|
55
|
+
|
|
56
|
+
if [[ "$write_at" != "none" ]]; then
|
|
57
|
+
( sleep "$write_at" && echo "@misc{test, title={y}}" > "$bib" ) &
|
|
58
|
+
WRITER_PID=$!
|
|
59
|
+
else
|
|
60
|
+
WRITER_PID=""
|
|
61
|
+
fi
|
|
62
|
+
|
|
63
|
+
"$POLL" "$bib" "$window" >/dev/null
|
|
64
|
+
local actual=$?
|
|
65
|
+
|
|
66
|
+
[[ -n "$WRITER_PID" ]] && wait "$WRITER_PID" 2>/dev/null
|
|
67
|
+
|
|
68
|
+
if [[ "$actual" == "$expected_exit" ]]; then
|
|
69
|
+
echo " PASS [$name] exit=$actual (expected $expected_exit)"
|
|
70
|
+
PASS=$((PASS+1))
|
|
71
|
+
else
|
|
72
|
+
echo " FAIL [$name] exit=$actual (expected $expected_exit)"
|
|
73
|
+
FAIL=$((FAIL+1))
|
|
74
|
+
fi
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
echo "Phase 2.5 polling regression (4 scenarios)"
|
|
78
|
+
echo " Tmpdir: $TMP"
|
|
79
|
+
echo
|
|
80
|
+
|
|
81
|
+
# 1. BBT write within window → detect
|
|
82
|
+
run_scenario "detect-within-window" 10 3 0
|
|
83
|
+
# 2. No write, short window → timeout
|
|
84
|
+
run_scenario "timeout-silent" 3 none 1
|
|
85
|
+
# 3. BBT debounce, late-but-within write → detect
|
|
86
|
+
run_scenario "debounce-late" 10 8 0
|
|
87
|
+
# 4. Slow BBT, write outside window → timeout (Phase 2.5 fallback prompt)
|
|
88
|
+
run_scenario "slow-bbt-timeout" 4 8 1
|
|
89
|
+
|
|
90
|
+
echo
|
|
91
|
+
echo "Summary: $PASS passed, $FAIL failed"
|
|
92
|
+
[[ $FAIL -eq 0 ]]
|