@synsci/cli-darwin-x64 1.1.70 → 1.1.72
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/bin/skills/citation-management/SKILL.md +1109 -0
- package/bin/skills/citation-management/assets/bibtex_template.bib +264 -0
- package/bin/skills/citation-management/assets/citation_checklist.md +386 -0
- package/bin/skills/citation-management/references/bibtex_formatting.md +908 -0
- package/bin/skills/citation-management/references/citation_validation.md +794 -0
- package/bin/skills/citation-management/references/google_scholar_search.md +725 -0
- package/bin/skills/citation-management/references/metadata_extraction.md +870 -0
- package/bin/skills/citation-management/references/pubmed_search.md +839 -0
- package/bin/skills/citation-management/scripts/doi_to_bibtex.py +182 -0
- package/bin/skills/citation-management/scripts/extract_metadata.py +570 -0
- package/bin/skills/citation-management/scripts/format_bibtex.py +349 -0
- package/bin/skills/citation-management/scripts/search_google_scholar.py +251 -0
- package/bin/skills/citation-management/scripts/search_pubmed.py +348 -0
- package/bin/skills/citation-management/scripts/validate_citations.py +494 -0
- package/bin/skills/clinical-decision-support/README.md +129 -0
- package/bin/skills/clinical-decision-support/SKILL.md +506 -0
- package/bin/skills/clinical-decision-support/assets/biomarker_report_template.tex +380 -0
- package/bin/skills/clinical-decision-support/assets/clinical_pathway_template.tex +222 -0
- package/bin/skills/clinical-decision-support/assets/cohort_analysis_template.tex +359 -0
- package/bin/skills/clinical-decision-support/assets/color_schemes.tex +149 -0
- package/bin/skills/clinical-decision-support/assets/example_gbm_cohort.md +208 -0
- package/bin/skills/clinical-decision-support/assets/recommendation_strength_guide.md +328 -0
- package/bin/skills/clinical-decision-support/assets/treatment_recommendation_template.tex +529 -0
- package/bin/skills/clinical-decision-support/references/biomarker_classification.md +719 -0
- package/bin/skills/clinical-decision-support/references/clinical_decision_algorithms.md +604 -0
- package/bin/skills/clinical-decision-support/references/evidence_synthesis.md +840 -0
- package/bin/skills/clinical-decision-support/references/outcome_analysis.md +640 -0
- package/bin/skills/clinical-decision-support/references/patient_cohort_analysis.md +427 -0
- package/bin/skills/clinical-decision-support/references/treatment_recommendations.md +521 -0
- package/bin/skills/clinical-decision-support/scripts/biomarker_classifier.py +383 -0
- package/bin/skills/clinical-decision-support/scripts/build_decision_tree.py +417 -0
- package/bin/skills/clinical-decision-support/scripts/create_cohort_tables.py +509 -0
- package/bin/skills/clinical-decision-support/scripts/generate_survival_analysis.py +441 -0
- package/bin/skills/clinical-decision-support/scripts/validate_cds_document.py +326 -0
- package/bin/skills/clinical-reports/IMPLEMENTATION_SUMMARY.md +641 -0
- package/bin/skills/clinical-reports/README.md +236 -0
- package/bin/skills/clinical-reports/SKILL.md +1127 -0
- package/bin/skills/clinical-reports/assets/case_report_template.md +352 -0
- package/bin/skills/clinical-reports/assets/clinical_trial_csr_template.md +353 -0
- package/bin/skills/clinical-reports/assets/clinical_trial_sae_template.md +359 -0
- package/bin/skills/clinical-reports/assets/consult_note_template.md +305 -0
- package/bin/skills/clinical-reports/assets/discharge_summary_template.md +453 -0
- package/bin/skills/clinical-reports/assets/hipaa_compliance_checklist.md +395 -0
- package/bin/skills/clinical-reports/assets/history_physical_template.md +305 -0
- package/bin/skills/clinical-reports/assets/lab_report_template.md +309 -0
- package/bin/skills/clinical-reports/assets/pathology_report_template.md +249 -0
- package/bin/skills/clinical-reports/assets/quality_checklist.md +338 -0
- package/bin/skills/clinical-reports/assets/radiology_report_template.md +318 -0
- package/bin/skills/clinical-reports/assets/soap_note_template.md +253 -0
- package/bin/skills/clinical-reports/references/case_report_guidelines.md +570 -0
- package/bin/skills/clinical-reports/references/clinical_trial_reporting.md +693 -0
- package/bin/skills/clinical-reports/references/data_presentation.md +530 -0
- package/bin/skills/clinical-reports/references/diagnostic_reports_standards.md +629 -0
- package/bin/skills/clinical-reports/references/medical_terminology.md +588 -0
- package/bin/skills/clinical-reports/references/patient_documentation.md +744 -0
- package/bin/skills/clinical-reports/references/peer_review_standards.md +585 -0
- package/bin/skills/clinical-reports/references/regulatory_compliance.md +577 -0
- package/bin/skills/clinical-reports/scripts/check_deidentification.py +332 -0
- package/bin/skills/clinical-reports/scripts/compliance_checker.py +78 -0
- package/bin/skills/clinical-reports/scripts/extract_clinical_data.py +97 -0
- package/bin/skills/clinical-reports/scripts/format_adverse_events.py +97 -0
- package/bin/skills/clinical-reports/scripts/generate_report_template.py +149 -0
- package/bin/skills/clinical-reports/scripts/terminology_validator.py +126 -0
- package/bin/skills/clinical-reports/scripts/validate_case_report.py +323 -0
- package/bin/skills/clinical-reports/scripts/validate_trial_report.py +88 -0
- package/bin/skills/fireworks-ai/SKILL.md +665 -0
- package/bin/skills/generate-image/SKILL.md +178 -0
- package/bin/skills/generate-image/scripts/generate_image.py +254 -0
- package/bin/skills/groq/SKILL.md +347 -0
- package/bin/skills/hypothesis-generation/SKILL.md +293 -0
- package/bin/skills/hypothesis-generation/assets/FORMATTING_GUIDE.md +672 -0
- package/bin/skills/hypothesis-generation/assets/hypothesis_generation.sty +307 -0
- package/bin/skills/hypothesis-generation/assets/hypothesis_report_template.tex +572 -0
- package/bin/skills/hypothesis-generation/references/experimental_design_patterns.md +329 -0
- package/bin/skills/hypothesis-generation/references/hypothesis_quality_criteria.md +198 -0
- package/bin/skills/hypothesis-generation/references/literature_search_strategies.md +622 -0
- package/bin/skills/latex-posters/README.md +417 -0
- package/bin/skills/latex-posters/SKILL.md +1602 -0
- package/bin/skills/latex-posters/assets/baposter_template.tex +257 -0
- package/bin/skills/latex-posters/assets/beamerposter_template.tex +244 -0
- package/bin/skills/latex-posters/assets/poster_quality_checklist.md +358 -0
- package/bin/skills/latex-posters/assets/tikzposter_template.tex +251 -0
- package/bin/skills/latex-posters/references/latex_poster_packages.md +745 -0
- package/bin/skills/latex-posters/references/poster_content_guide.md +748 -0
- package/bin/skills/latex-posters/references/poster_design_principles.md +806 -0
- package/bin/skills/latex-posters/references/poster_layout_design.md +900 -0
- package/bin/skills/latex-posters/scripts/review_poster.sh +214 -0
- package/bin/skills/literature-review/SKILL.md +641 -0
- package/bin/skills/literature-review/assets/review_template.md +412 -0
- package/bin/skills/literature-review/references/citation_styles.md +166 -0
- package/bin/skills/literature-review/references/database_strategies.md +455 -0
- package/bin/skills/literature-review/scripts/generate_pdf.py +184 -0
- package/bin/skills/literature-review/scripts/search_databases.py +310 -0
- package/bin/skills/literature-review/scripts/verify_citations.py +218 -0
- package/bin/skills/market-research-reports/SKILL.md +904 -0
- package/bin/skills/market-research-reports/assets/FORMATTING_GUIDE.md +428 -0
- package/bin/skills/market-research-reports/assets/market_report_template.tex +1380 -0
- package/bin/skills/market-research-reports/assets/market_research.sty +564 -0
- package/bin/skills/market-research-reports/references/data_analysis_patterns.md +548 -0
- package/bin/skills/market-research-reports/references/report_structure_guide.md +999 -0
- package/bin/skills/market-research-reports/references/visual_generation_guide.md +1077 -0
- package/bin/skills/market-research-reports/scripts/generate_market_visuals.py +472 -0
- package/bin/skills/markitdown/INSTALLATION_GUIDE.md +318 -0
- package/bin/skills/markitdown/LICENSE.txt +22 -0
- package/bin/skills/markitdown/OPENROUTER_INTEGRATION.md +359 -0
- package/bin/skills/markitdown/QUICK_REFERENCE.md +309 -0
- package/bin/skills/markitdown/README.md +184 -0
- package/bin/skills/markitdown/SKILL.md +486 -0
- package/bin/skills/markitdown/SKILL_SUMMARY.md +307 -0
- package/bin/skills/markitdown/assets/example_usage.md +463 -0
- package/bin/skills/markitdown/references/api_reference.md +399 -0
- package/bin/skills/markitdown/references/file_formats.md +542 -0
- package/bin/skills/markitdown/scripts/batch_convert.py +195 -0
- package/bin/skills/markitdown/scripts/convert_literature.py +262 -0
- package/bin/skills/markitdown/scripts/convert_with_ai.py +224 -0
- package/bin/skills/ml-paper-writing/SKILL.md +937 -0
- package/bin/skills/ml-paper-writing/references/checklists.md +361 -0
- package/bin/skills/ml-paper-writing/references/citation-workflow.md +562 -0
- package/bin/skills/ml-paper-writing/references/reviewer-guidelines.md +367 -0
- package/bin/skills/ml-paper-writing/references/sources.md +159 -0
- package/bin/skills/ml-paper-writing/references/writing-guide.md +476 -0
- package/bin/skills/ml-paper-writing/templates/README.md +251 -0
- package/bin/skills/ml-paper-writing/templates/aaai2026/README.md +534 -0
- package/bin/skills/ml-paper-writing/templates/aaai2026/aaai2026-unified-supp.tex +144 -0
- package/bin/skills/ml-paper-writing/templates/aaai2026/aaai2026-unified-template.tex +952 -0
- package/bin/skills/ml-paper-writing/templates/aaai2026/aaai2026.bib +111 -0
- package/bin/skills/ml-paper-writing/templates/aaai2026/aaai2026.bst +1493 -0
- package/bin/skills/ml-paper-writing/templates/aaai2026/aaai2026.sty +315 -0
- package/bin/skills/ml-paper-writing/templates/acl/README.md +50 -0
- package/bin/skills/ml-paper-writing/templates/acl/acl.sty +312 -0
- package/bin/skills/ml-paper-writing/templates/acl/acl_latex.tex +377 -0
- package/bin/skills/ml-paper-writing/templates/acl/acl_lualatex.tex +101 -0
- package/bin/skills/ml-paper-writing/templates/acl/acl_natbib.bst +1940 -0
- package/bin/skills/ml-paper-writing/templates/acl/anthology.bib.txt +26 -0
- package/bin/skills/ml-paper-writing/templates/acl/custom.bib +70 -0
- package/bin/skills/ml-paper-writing/templates/acl/formatting.md +326 -0
- package/bin/skills/ml-paper-writing/templates/colm2025/README.md +3 -0
- package/bin/skills/ml-paper-writing/templates/colm2025/colm2025_conference.bib +11 -0
- package/bin/skills/ml-paper-writing/templates/colm2025/colm2025_conference.bst +1440 -0
- package/bin/skills/ml-paper-writing/templates/colm2025/colm2025_conference.pdf +0 -0
- package/bin/skills/ml-paper-writing/templates/colm2025/colm2025_conference.sty +218 -0
- package/bin/skills/ml-paper-writing/templates/colm2025/colm2025_conference.tex +305 -0
- package/bin/skills/ml-paper-writing/templates/colm2025/fancyhdr.sty +485 -0
- package/bin/skills/ml-paper-writing/templates/colm2025/math_commands.tex +508 -0
- package/bin/skills/ml-paper-writing/templates/colm2025/natbib.sty +1246 -0
- package/bin/skills/ml-paper-writing/templates/iclr2026/fancyhdr.sty +485 -0
- package/bin/skills/ml-paper-writing/templates/iclr2026/iclr2026_conference.bib +24 -0
- package/bin/skills/ml-paper-writing/templates/iclr2026/iclr2026_conference.bst +1440 -0
- package/bin/skills/ml-paper-writing/templates/iclr2026/iclr2026_conference.pdf +0 -0
- package/bin/skills/ml-paper-writing/templates/iclr2026/iclr2026_conference.sty +246 -0
- package/bin/skills/ml-paper-writing/templates/iclr2026/iclr2026_conference.tex +414 -0
- package/bin/skills/ml-paper-writing/templates/iclr2026/math_commands.tex +508 -0
- package/bin/skills/ml-paper-writing/templates/iclr2026/natbib.sty +1246 -0
- package/bin/skills/ml-paper-writing/templates/icml2026/algorithm.sty +79 -0
- package/bin/skills/ml-paper-writing/templates/icml2026/algorithmic.sty +201 -0
- package/bin/skills/ml-paper-writing/templates/icml2026/example_paper.bib +75 -0
- package/bin/skills/ml-paper-writing/templates/icml2026/example_paper.pdf +0 -0
- package/bin/skills/ml-paper-writing/templates/icml2026/example_paper.tex +662 -0
- package/bin/skills/ml-paper-writing/templates/icml2026/fancyhdr.sty +864 -0
- package/bin/skills/ml-paper-writing/templates/icml2026/icml2026.bst +1443 -0
- package/bin/skills/ml-paper-writing/templates/icml2026/icml2026.sty +767 -0
- package/bin/skills/ml-paper-writing/templates/icml2026/icml_numpapers.pdf +0 -0
- package/bin/skills/ml-paper-writing/templates/neurips2025/Makefile +36 -0
- package/bin/skills/ml-paper-writing/templates/neurips2025/extra_pkgs.tex +53 -0
- package/bin/skills/ml-paper-writing/templates/neurips2025/main.tex +38 -0
- package/bin/skills/ml-paper-writing/templates/neurips2025/neurips.sty +382 -0
- package/bin/skills/paper-2-web/SKILL.md +491 -0
- package/bin/skills/paper-2-web/references/installation.md +141 -0
- package/bin/skills/paper-2-web/references/paper2poster.md +346 -0
- package/bin/skills/paper-2-web/references/paper2video.md +305 -0
- package/bin/skills/paper-2-web/references/paper2web.md +187 -0
- package/bin/skills/paper-2-web/references/usage_examples.md +436 -0
- package/bin/skills/peer-review/SKILL.md +702 -0
- package/bin/skills/peer-review/references/calibration_guidelines.md +196 -0
- package/bin/skills/peer-review/references/common_issues.md +552 -0
- package/bin/skills/peer-review/references/paper_mechanics.md +269 -0
- package/bin/skills/peer-review/references/reporting_standards.md +290 -0
- package/bin/skills/peer-review/references/scoring_rubric.md +239 -0
- package/bin/skills/pptx-posters/SKILL.md +410 -0
- package/bin/skills/pptx-posters/assets/poster_html_template.html +257 -0
- package/bin/skills/pptx-posters/assets/poster_quality_checklist.md +358 -0
- package/bin/skills/pptx-posters/references/poster_content_guide.md +748 -0
- package/bin/skills/pptx-posters/references/poster_design_principles.md +806 -0
- package/bin/skills/pptx-posters/references/poster_layout_design.md +900 -0
- package/bin/skills/research-grants/README.md +285 -0
- package/bin/skills/research-grants/SKILL.md +938 -0
- package/bin/skills/research-grants/assets/budget_justification_template.md +453 -0
- package/bin/skills/research-grants/assets/nih_specific_aims_template.md +166 -0
- package/bin/skills/research-grants/assets/nsf_project_summary_template.md +92 -0
- package/bin/skills/research-grants/references/broader_impacts.md +392 -0
- package/bin/skills/research-grants/references/darpa_guidelines.md +636 -0
- package/bin/skills/research-grants/references/doe_guidelines.md +586 -0
- package/bin/skills/research-grants/references/nih_guidelines.md +851 -0
- package/bin/skills/research-grants/references/nsf_guidelines.md +570 -0
- package/bin/skills/research-grants/references/specific_aims_guide.md +458 -0
- package/bin/skills/research-lookup/README.md +156 -0
- package/bin/skills/research-lookup/SKILL.md +606 -0
- package/bin/skills/research-lookup/examples.py +174 -0
- package/bin/skills/research-lookup/lookup.py +187 -0
- package/bin/skills/research-lookup/research_lookup.py +483 -0
- package/bin/skills/research-lookup/scripts/research_lookup.py +483 -0
- package/bin/skills/scholar-evaluation/SKILL.md +289 -0
- package/bin/skills/scholar-evaluation/references/evaluation_framework.md +663 -0
- package/bin/skills/scholar-evaluation/scripts/calculate_scores.py +366 -0
- package/bin/skills/scientific-critical-thinking/SKILL.md +566 -0
- package/bin/skills/scientific-critical-thinking/references/common_biases.md +364 -0
- package/bin/skills/scientific-critical-thinking/references/evidence_hierarchy.md +484 -0
- package/bin/skills/scientific-critical-thinking/references/experimental_design.md +496 -0
- package/bin/skills/scientific-critical-thinking/references/logical_fallacies.md +478 -0
- package/bin/skills/scientific-critical-thinking/references/scientific_method.md +169 -0
- package/bin/skills/scientific-critical-thinking/references/statistical_pitfalls.md +506 -0
- package/bin/skills/scientific-schematics/QUICK_REFERENCE.md +207 -0
- package/bin/skills/scientific-schematics/README.md +327 -0
- package/bin/skills/scientific-schematics/SKILL.md +615 -0
- package/bin/skills/scientific-schematics/example_usage.sh +89 -0
- package/bin/skills/scientific-schematics/references/best_practices.md +559 -0
- package/bin/skills/scientific-schematics/scripts/generate_schematic.py +135 -0
- package/bin/skills/scientific-schematics/scripts/generate_schematic_ai.py +807 -0
- package/bin/skills/scientific-schematics/test_ai_generation.py +243 -0
- package/bin/skills/scientific-slides/SKILL.md +942 -0
- package/bin/skills/scientific-slides/assets/timing_guidelines.md +597 -0
- package/bin/skills/scientific-slides/references/data_visualization_slides.md +708 -0
- package/bin/skills/scientific-slides/references/presentation_structure.md +642 -0
- package/bin/skills/scientific-slides/references/slide_design_principles.md +849 -0
- package/bin/skills/scientific-slides/references/talk_types_guide.md +687 -0
- package/bin/skills/scientific-slides/references/visual_review_workflow.md +775 -0
- package/bin/skills/scientific-slides/scripts/generate_slide_image.py +143 -0
- package/bin/skills/scientific-slides/scripts/generate_slide_image_ai.py +748 -0
- package/bin/skills/scientific-slides/scripts/pdf_to_images.py +201 -0
- package/bin/skills/scientific-slides/scripts/slides_to_pdf.py +220 -0
- package/bin/skills/scientific-slides/scripts/validate_presentation.py +367 -0
- package/bin/skills/scientific-writing/SKILL.md +714 -0
- package/bin/skills/scientific-writing/assets/REPORT_FORMATTING_GUIDE.md +574 -0
- package/bin/skills/scientific-writing/assets/scientific_report.sty +606 -0
- package/bin/skills/scientific-writing/assets/scientific_report_template.tex +449 -0
- package/bin/skills/scientific-writing/references/citation_styles.md +720 -0
- package/bin/skills/scientific-writing/references/figures_tables.md +806 -0
- package/bin/skills/scientific-writing/references/imrad_structure.md +686 -0
- package/bin/skills/scientific-writing/references/professional_report_formatting.md +664 -0
- package/bin/skills/scientific-writing/references/reporting_guidelines.md +748 -0
- package/bin/skills/scientific-writing/references/writing_principles.md +824 -0
- package/bin/skills/tinker/SKILL.md +2 -3
- package/bin/skills/together-ai/SKILL.md +722 -0
- package/bin/skills/treatment-plans/README.md +488 -0
- package/bin/skills/treatment-plans/SKILL.md +1579 -0
- package/bin/skills/treatment-plans/assets/STYLING_QUICK_REFERENCE.md +185 -0
- package/bin/skills/treatment-plans/assets/chronic_disease_management_plan.tex +665 -0
- package/bin/skills/treatment-plans/assets/general_medical_treatment_plan.tex +547 -0
- package/bin/skills/treatment-plans/assets/medical_treatment_plan.sty +222 -0
- package/bin/skills/treatment-plans/assets/mental_health_treatment_plan.tex +774 -0
- package/bin/skills/treatment-plans/assets/one_page_treatment_plan.tex +193 -0
- package/bin/skills/treatment-plans/assets/pain_management_plan.tex +799 -0
- package/bin/skills/treatment-plans/assets/perioperative_care_plan.tex +753 -0
- package/bin/skills/treatment-plans/assets/quality_checklist.md +471 -0
- package/bin/skills/treatment-plans/assets/rehabilitation_treatment_plan.tex +756 -0
- package/bin/skills/treatment-plans/references/goal_setting_frameworks.md +411 -0
- package/bin/skills/treatment-plans/references/intervention_guidelines.md +507 -0
- package/bin/skills/treatment-plans/references/regulatory_compliance.md +476 -0
- package/bin/skills/treatment-plans/references/specialty_specific_guidelines.md +655 -0
- package/bin/skills/treatment-plans/references/treatment_plan_standards.md +485 -0
- package/bin/skills/treatment-plans/scripts/check_completeness.py +322 -0
- package/bin/skills/treatment-plans/scripts/generate_template.py +233 -0
- package/bin/skills/treatment-plans/scripts/timeline_generator.py +385 -0
- package/bin/skills/treatment-plans/scripts/validate_treatment_plan.py +369 -0
- package/bin/skills/unsloth/SKILL.md +565 -47
- package/bin/skills/unsloth/docs/advanced-rl.md +222 -0
- package/bin/skills/unsloth/docs/chat-templates.md +141 -0
- package/bin/skills/unsloth/docs/datasets.md +489 -0
- package/bin/skills/unsloth/docs/docker-extended.md +99 -0
- package/bin/skills/unsloth/docs/dynamic-ggufs-2.0.md +116 -0
- package/bin/skills/unsloth/docs/dynamic-ggufs-aider.md +118 -0
- package/bin/skills/unsloth/docs/faq.md +91 -0
- package/bin/skills/unsloth/docs/fp16-vs-bf16.md +61 -0
- package/bin/skills/unsloth/docs/fp8-rl.md +224 -0
- package/bin/skills/unsloth/docs/glm-4.7-flash.md +997 -0
- package/bin/skills/unsloth/docs/inference-deployment-overview.md +17 -0
- package/bin/skills/unsloth/docs/inference.md +27 -0
- package/bin/skills/unsloth/docs/installation-docker.md +155 -0
- package/bin/skills/unsloth/docs/installation-pip.md +148 -0
- package/bin/skills/unsloth/docs/kernels-packing.md +190 -0
- package/bin/skills/unsloth/docs/kimi-k2.5.md +634 -0
- package/bin/skills/unsloth/docs/lm-studio.md +235 -0
- package/bin/skills/unsloth/docs/lora-hot-swapping.md +75 -0
- package/bin/skills/unsloth/docs/lora-hyperparameters.md +363 -0
- package/bin/skills/unsloth/docs/memory-efficient-rl.md +267 -0
- package/bin/skills/unsloth/docs/model-selection.md +70 -0
- package/bin/skills/unsloth/docs/models.md +532 -0
- package/bin/skills/unsloth/docs/multi-gpu-ddp.md +90 -0
- package/bin/skills/unsloth/docs/notebooks.md +223 -0
- package/bin/skills/unsloth/docs/overview.md +110 -0
- package/bin/skills/unsloth/docs/qwen3-coder-next-extended.md +900 -0
- package/bin/skills/unsloth/docs/qwen3-coder-next.md +900 -0
- package/bin/skills/unsloth/docs/requirements.md +45 -0
- package/bin/skills/unsloth/docs/reward-hacking.md +25 -0
- package/bin/skills/unsloth/docs/saving-to-gguf.md +138 -0
- package/bin/skills/unsloth/docs/saving-to-ollama.md +46 -0
- package/bin/skills/unsloth/docs/sglang-guide.md +278 -0
- package/bin/skills/unsloth/docs/speculative-decoding.md +70 -0
- package/bin/skills/unsloth/docs/tool-calling.md +334 -0
- package/bin/skills/unsloth/docs/troubleshooting-faq.md +204 -0
- package/bin/skills/unsloth/docs/troubleshooting-inference.md +26 -0
- package/bin/skills/unsloth/docs/tts-fine-tuning.md +149 -0
- package/bin/skills/unsloth/docs/tutorial-grpo.md +273 -0
- package/bin/skills/unsloth/docs/tutorial-llama3-ollama.md +356 -0
- package/bin/skills/unsloth/docs/vision-fine-tuning.md +135 -0
- package/bin/skills/unsloth/docs/vision-rl.md +170 -0
- package/bin/skills/unsloth/docs/vllm-engine-arguments.md +43 -0
- package/bin/skills/unsloth/docs/vllm-guide.md +98 -0
- package/bin/skills/venue-templates/SKILL.md +686 -0
- package/bin/skills/venue-templates/assets/examples/cell_summary_example.md +247 -0
- package/bin/skills/venue-templates/assets/examples/medical_structured_abstract.md +313 -0
- package/bin/skills/venue-templates/assets/examples/nature_abstract_examples.md +213 -0
- package/bin/skills/venue-templates/assets/examples/neurips_introduction_example.md +245 -0
- package/bin/skills/venue-templates/assets/grants/nih_specific_aims.tex +235 -0
- package/bin/skills/venue-templates/assets/grants/nsf_proposal_template.tex +375 -0
- package/bin/skills/venue-templates/assets/journals/nature_article.tex +171 -0
- package/bin/skills/venue-templates/assets/journals/neurips_article.tex +283 -0
- package/bin/skills/venue-templates/assets/journals/plos_one.tex +317 -0
- package/bin/skills/venue-templates/assets/posters/beamerposter_academic.tex +311 -0
- package/bin/skills/venue-templates/references/cell_press_style.md +483 -0
- package/bin/skills/venue-templates/references/conferences_formatting.md +564 -0
- package/bin/skills/venue-templates/references/cs_conference_style.md +463 -0
- package/bin/skills/venue-templates/references/grants_requirements.md +787 -0
- package/bin/skills/venue-templates/references/journals_formatting.md +486 -0
- package/bin/skills/venue-templates/references/medical_journal_styles.md +535 -0
- package/bin/skills/venue-templates/references/ml_conference_style.md +556 -0
- package/bin/skills/venue-templates/references/nature_science_style.md +405 -0
- package/bin/skills/venue-templates/references/posters_guidelines.md +628 -0
- package/bin/skills/venue-templates/references/reviewer_expectations.md +417 -0
- package/bin/skills/venue-templates/references/venue_writing_styles.md +321 -0
- package/bin/skills/venue-templates/scripts/customize_template.py +195 -0
- package/bin/skills/venue-templates/scripts/query_template.py +266 -0
- package/bin/skills/venue-templates/scripts/validate_format.py +250 -0
- package/bin/synsc +0 -0
- package/package.json +1 -1
- package/bin/skills/unsloth/references/index.md +0 -7
- package/bin/skills/unsloth/references/llms-full.md +0 -16799
- package/bin/skills/unsloth/references/llms-txt.md +0 -12044
- package/bin/skills/unsloth/references/llms.md +0 -82
|
@@ -0,0 +1,266 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
"""
|
|
3
|
+
Query Template Script
|
|
4
|
+
Search and retrieve venue-specific templates by name, type, or keywords.
|
|
5
|
+
|
|
6
|
+
Usage:
|
|
7
|
+
python query_template.py --venue "Nature" --type "article"
|
|
8
|
+
python query_template.py --keyword "machine learning"
|
|
9
|
+
python query_template.py --list-all
|
|
10
|
+
python query_template.py --venue "NeurIPS" --requirements
|
|
11
|
+
"""
|
|
12
|
+
|
|
13
|
+
import argparse
|
|
14
|
+
import json
|
|
15
|
+
from pathlib import Path
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
# Template database
|
|
19
|
+
TEMPLATES = {
|
|
20
|
+
"journals": {
|
|
21
|
+
"nature": {
|
|
22
|
+
"file": "nature_article.tex",
|
|
23
|
+
"full_name": "Nature",
|
|
24
|
+
"description": "Top-tier multidisciplinary science journal",
|
|
25
|
+
"page_limit": "~3000 words",
|
|
26
|
+
"citation_style": "Superscript numbered",
|
|
27
|
+
"format": "Single column",
|
|
28
|
+
},
|
|
29
|
+
"neurips": {
|
|
30
|
+
"file": "neurips_article.tex",
|
|
31
|
+
"full_name": "NeurIPS (Neural Information Processing Systems)",
|
|
32
|
+
"description": "Top-tier machine learning conference",
|
|
33
|
+
"page_limit": "8 pages + unlimited refs",
|
|
34
|
+
"citation_style": "Numbered [1]",
|
|
35
|
+
"format": "Two column",
|
|
36
|
+
"anonymization": "Required (double-blind)",
|
|
37
|
+
},
|
|
38
|
+
"plos_one": {
|
|
39
|
+
"file": "plos_one.tex",
|
|
40
|
+
"full_name": "PLOS ONE",
|
|
41
|
+
"description": "Open-access multidisciplinary journal",
|
|
42
|
+
"page_limit": "No limit",
|
|
43
|
+
"citation_style": "Vancouver [1]",
|
|
44
|
+
"format": "Single column",
|
|
45
|
+
},
|
|
46
|
+
},
|
|
47
|
+
"posters": {
|
|
48
|
+
"beamerposter": {
|
|
49
|
+
"file": "beamerposter_academic.tex",
|
|
50
|
+
"full_name": "Beamerposter Academic",
|
|
51
|
+
"description": "Classic academic conference poster using beamerposter",
|
|
52
|
+
"size": "A0, customizable",
|
|
53
|
+
"package": "beamerposter",
|
|
54
|
+
}
|
|
55
|
+
},
|
|
56
|
+
"grants": {
|
|
57
|
+
"nsf": {
|
|
58
|
+
"file": "nsf_proposal_template.tex",
|
|
59
|
+
"full_name": "NSF Standard Grant",
|
|
60
|
+
"description": "National Science Foundation research proposal",
|
|
61
|
+
"page_limit": "15 pages (project description)",
|
|
62
|
+
"key_sections": "Project Summary, Project Description, Broader Impacts",
|
|
63
|
+
},
|
|
64
|
+
"nih_specific_aims": {
|
|
65
|
+
"file": "nih_specific_aims.tex",
|
|
66
|
+
"full_name": "NIH Specific Aims Page",
|
|
67
|
+
"description": "Most critical page of NIH proposals",
|
|
68
|
+
"page_limit": "1 page (strictly enforced)",
|
|
69
|
+
"key_sections": "Hook, Hypothesis, 3 Aims, Payoff",
|
|
70
|
+
},
|
|
71
|
+
},
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
|
|
75
|
+
def get_skill_path():
|
|
76
|
+
"""Get the path to the venue-templates skill directory."""
|
|
77
|
+
# Assume script is in .claude/skills/venue-templates/scripts/
|
|
78
|
+
script_dir = Path(__file__).parent
|
|
79
|
+
skill_dir = script_dir.parent
|
|
80
|
+
return skill_dir
|
|
81
|
+
|
|
82
|
+
|
|
83
|
+
def search_templates(venue=None, template_type=None, keyword=None):
|
|
84
|
+
"""Search for templates matching criteria."""
|
|
85
|
+
results = []
|
|
86
|
+
|
|
87
|
+
for cat_name, category in TEMPLATES.items():
|
|
88
|
+
# Filter by type if specified
|
|
89
|
+
if template_type and cat_name != template_type and template_type != "all":
|
|
90
|
+
continue
|
|
91
|
+
|
|
92
|
+
for temp_id, template in category.items():
|
|
93
|
+
# Filter by venue name
|
|
94
|
+
if venue:
|
|
95
|
+
venue_lower = venue.lower()
|
|
96
|
+
if venue_lower not in temp_id and venue_lower not in template.get("full_name", "").lower():
|
|
97
|
+
continue
|
|
98
|
+
|
|
99
|
+
# Filter by keyword
|
|
100
|
+
if keyword:
|
|
101
|
+
keyword_lower = keyword.lower()
|
|
102
|
+
search_text = json.dumps(template).lower()
|
|
103
|
+
if keyword_lower not in search_text:
|
|
104
|
+
continue
|
|
105
|
+
|
|
106
|
+
results.append(
|
|
107
|
+
{
|
|
108
|
+
"id": temp_id,
|
|
109
|
+
"category": cat_name,
|
|
110
|
+
"file": template["file"],
|
|
111
|
+
"full_name": template.get("full_name", temp_id),
|
|
112
|
+
"description": template.get("description", ""),
|
|
113
|
+
"details": template,
|
|
114
|
+
}
|
|
115
|
+
)
|
|
116
|
+
|
|
117
|
+
return results
|
|
118
|
+
|
|
119
|
+
|
|
120
|
+
def list_all_templates():
|
|
121
|
+
"""List all available templates."""
|
|
122
|
+
print("\n=== AVAILABLE TEMPLATES ===\n")
|
|
123
|
+
|
|
124
|
+
for cat_name, category in TEMPLATES.items():
|
|
125
|
+
print(f"\n{cat_name.upper()}:")
|
|
126
|
+
for temp_id, template in category.items():
|
|
127
|
+
print(f" • {template.get('full_name', temp_id)}")
|
|
128
|
+
print(f" File: {template['file']}")
|
|
129
|
+
if "description" in template:
|
|
130
|
+
print(f" Description: {template['description']}")
|
|
131
|
+
print()
|
|
132
|
+
|
|
133
|
+
|
|
134
|
+
def print_template_info(template):
|
|
135
|
+
"""Print detailed information about a template."""
|
|
136
|
+
print(f"\n{'=' * 60}")
|
|
137
|
+
print(f"Template: {template['full_name']}")
|
|
138
|
+
print(f"{'=' * 60}")
|
|
139
|
+
print(f"Category: {template['category']}")
|
|
140
|
+
print(f"File: {template['file']}")
|
|
141
|
+
|
|
142
|
+
details = template['details']
|
|
143
|
+
|
|
144
|
+
print(f"\nDescription: {details.get('description', 'N/A')}")
|
|
145
|
+
|
|
146
|
+
if 'page_limit' in details:
|
|
147
|
+
print(f"Page Limit: {details['page_limit']}")
|
|
148
|
+
if 'citation_style' in details:
|
|
149
|
+
print(f"Citation Style: {details['citation_style']}")
|
|
150
|
+
if 'format' in details:
|
|
151
|
+
print(f"Format: {details['format']}")
|
|
152
|
+
if 'anonymization' in details:
|
|
153
|
+
print(f"⚠️ Anonymization: {details['anonymization']}")
|
|
154
|
+
if 'size' in details:
|
|
155
|
+
print(f"Poster Size: {details['size']}")
|
|
156
|
+
if 'package' in details:
|
|
157
|
+
print(f"LaTeX Package: {details['package']}")
|
|
158
|
+
if 'key_sections' in details:
|
|
159
|
+
print(f"Key Sections: {details['key_sections']}")
|
|
160
|
+
|
|
161
|
+
# Print full path to template
|
|
162
|
+
skill_path = get_skill_path()
|
|
163
|
+
template_path = skill_path / "assets" / template['category'] / template['file']
|
|
164
|
+
print(f"\nFull Path: {template_path}")
|
|
165
|
+
|
|
166
|
+
if template_path.exists():
|
|
167
|
+
print("✓ Template file exists")
|
|
168
|
+
else:
|
|
169
|
+
print("✗ Template file not found")
|
|
170
|
+
|
|
171
|
+
print()
|
|
172
|
+
|
|
173
|
+
|
|
174
|
+
def print_requirements(venue):
|
|
175
|
+
"""Print formatting requirements for a venue."""
|
|
176
|
+
results = search_templates(venue=venue)
|
|
177
|
+
|
|
178
|
+
if not results:
|
|
179
|
+
print(f"No templates found for venue: {venue}")
|
|
180
|
+
return
|
|
181
|
+
|
|
182
|
+
template = results[0] # Take first match
|
|
183
|
+
details = template['details']
|
|
184
|
+
|
|
185
|
+
print(f"\n{'=' * 60}")
|
|
186
|
+
print(f"FORMATTING REQUIREMENTS: {template['full_name']}")
|
|
187
|
+
print(f"{'=' * 60}\n")
|
|
188
|
+
|
|
189
|
+
if 'page_limit' in details:
|
|
190
|
+
print(f"📄 Page Limit: {details['page_limit']}")
|
|
191
|
+
if 'format' in details:
|
|
192
|
+
print(f"📐 Format: {details['format']}")
|
|
193
|
+
if 'citation_style' in details:
|
|
194
|
+
print(f"📚 Citation Style: {details['citation_style']}")
|
|
195
|
+
if 'anonymization' in details:
|
|
196
|
+
print(f"🔒 Anonymization: {details['anonymization']}")
|
|
197
|
+
if 'size' in details:
|
|
198
|
+
print(f"📏 Size: {details['size']}")
|
|
199
|
+
|
|
200
|
+
print("\n💡 For detailed requirements, see:")
|
|
201
|
+
skill_path = get_skill_path()
|
|
202
|
+
|
|
203
|
+
if template['category'] == "journals":
|
|
204
|
+
print(f" {skill_path}/references/journals_formatting.md")
|
|
205
|
+
elif template['category'] == "posters":
|
|
206
|
+
print(f" {skill_path}/references/posters_guidelines.md")
|
|
207
|
+
elif template['category'] == "grants":
|
|
208
|
+
print(f" {skill_path}/references/grants_requirements.md")
|
|
209
|
+
|
|
210
|
+
print()
|
|
211
|
+
|
|
212
|
+
|
|
213
|
+
def main():
|
|
214
|
+
parser = argparse.ArgumentParser(
|
|
215
|
+
description="Query venue-specific LaTeX templates",
|
|
216
|
+
formatter_class=argparse.RawDescriptionHelpFormatter,
|
|
217
|
+
epilog="""
|
|
218
|
+
Examples:
|
|
219
|
+
%(prog)s --list-all
|
|
220
|
+
%(prog)s --venue "Nature" --type journals
|
|
221
|
+
%(prog)s --keyword "machine learning"
|
|
222
|
+
%(prog)s --venue "NeurIPS" --requirements
|
|
223
|
+
""",
|
|
224
|
+
)
|
|
225
|
+
|
|
226
|
+
parser.add_argument('--venue', type=str, help='Venue name (e.g., "Nature", "NeurIPS")')
|
|
227
|
+
parser.add_argument('--type', type=str, choices=['journals', 'posters', 'grants', 'all'], help='Template type')
|
|
228
|
+
parser.add_argument('--keyword', type=str, help='Search keyword')
|
|
229
|
+
parser.add_argument('--list-all', action='store_true', help='List all available templates')
|
|
230
|
+
parser.add_argument('--requirements', action='store_true', help='Show formatting requirements for venue')
|
|
231
|
+
|
|
232
|
+
args = parser.parse_args()
|
|
233
|
+
|
|
234
|
+
# List all templates
|
|
235
|
+
if args.list_all:
|
|
236
|
+
list_all_templates()
|
|
237
|
+
return
|
|
238
|
+
|
|
239
|
+
# Show requirements
|
|
240
|
+
if args.requirements:
|
|
241
|
+
if not args.venue:
|
|
242
|
+
print("Error: --requirements requires --venue")
|
|
243
|
+
parser.print_help()
|
|
244
|
+
return
|
|
245
|
+
print_requirements(args.venue)
|
|
246
|
+
return
|
|
247
|
+
|
|
248
|
+
# Search for templates
|
|
249
|
+
if not any([args.venue, args.type, args.keyword]):
|
|
250
|
+
parser.print_help()
|
|
251
|
+
return
|
|
252
|
+
|
|
253
|
+
results = search_templates(venue=args.venue, template_type=args.type, keyword=args.keyword)
|
|
254
|
+
|
|
255
|
+
if not results:
|
|
256
|
+
print("No templates found matching your criteria.")
|
|
257
|
+
return
|
|
258
|
+
|
|
259
|
+
print(f"\nFound {len(results)} template(s):\n")
|
|
260
|
+
|
|
261
|
+
for result in results:
|
|
262
|
+
print_template_info(result)
|
|
263
|
+
|
|
264
|
+
|
|
265
|
+
if __name__ == "__main__":
|
|
266
|
+
main()
|
|
@@ -0,0 +1,250 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
"""
|
|
3
|
+
Validate Format Script
|
|
4
|
+
Check if document meets venue-specific formatting requirements.
|
|
5
|
+
|
|
6
|
+
Usage:
|
|
7
|
+
python validate_format.py --file my_paper.pdf --venue "Nature" --check-all
|
|
8
|
+
python validate_format.py --file my_paper.pdf --venue "NeurIPS" --check page-count,margins
|
|
9
|
+
python validate_format.py --file my_paper.pdf --venue "PLOS ONE" --report validation_report.txt
|
|
10
|
+
"""
|
|
11
|
+
|
|
12
|
+
import argparse
|
|
13
|
+
import subprocess
|
|
14
|
+
from pathlib import Path
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
# Venue requirements database
|
|
18
|
+
VENUE_REQUIREMENTS = {
|
|
19
|
+
"nature": {
|
|
20
|
+
"page_limit": 5, # Approximate for ~3000 words
|
|
21
|
+
"margins": {"top": 2.5, "bottom": 2.5, "left": 2.5, "right": 2.5}, # cm
|
|
22
|
+
"font_size": 12, # pt
|
|
23
|
+
"font_family": "Times",
|
|
24
|
+
"line_spacing": "double",
|
|
25
|
+
},
|
|
26
|
+
"neurips": {
|
|
27
|
+
"page_limit": 8, # Excluding refs
|
|
28
|
+
"margins": {"top": 2.54, "bottom": 2.54, "left": 2.54, "right": 2.54}, # cm (1 inch)
|
|
29
|
+
"font_size": 10,
|
|
30
|
+
"font_family": "Times",
|
|
31
|
+
"format": "two-column",
|
|
32
|
+
},
|
|
33
|
+
"plos_one": {
|
|
34
|
+
"page_limit": None, # No limit
|
|
35
|
+
"margins": {"top": 2.54, "bottom": 2.54, "left": 2.54, "right": 2.54},
|
|
36
|
+
"font_size": 10,
|
|
37
|
+
"font_family": "Arial",
|
|
38
|
+
"line_spacing": "double",
|
|
39
|
+
},
|
|
40
|
+
"nsf": {
|
|
41
|
+
"page_limit": 15, # Project description
|
|
42
|
+
"margins": {"top": 2.54, "bottom": 2.54, "left": 2.54, "right": 2.54}, # 1 inch required
|
|
43
|
+
"font_size": 11, # Minimum
|
|
44
|
+
"font_family": "Times Roman",
|
|
45
|
+
"line_spacing": "single or double",
|
|
46
|
+
},
|
|
47
|
+
"nih": {
|
|
48
|
+
"page_limit": 12, # Research strategy
|
|
49
|
+
"margins": {"top": 1.27, "bottom": 1.27, "left": 1.27, "right": 1.27}, # 0.5 inch minimum
|
|
50
|
+
"font_size": 11, # Arial 11pt minimum
|
|
51
|
+
"font_family": "Arial",
|
|
52
|
+
"line_spacing": "any",
|
|
53
|
+
},
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
|
|
57
|
+
def get_pdf_info(pdf_path):
|
|
58
|
+
"""Extract information from PDF using pdfinfo."""
|
|
59
|
+
try:
|
|
60
|
+
result = subprocess.run(['pdfinfo', str(pdf_path)], capture_output=True, text=True, check=True)
|
|
61
|
+
|
|
62
|
+
info = {}
|
|
63
|
+
for line in result.stdout.split('\n'):
|
|
64
|
+
if ':' in line:
|
|
65
|
+
key, value = line.split(':', 1)
|
|
66
|
+
info[key.strip()] = value.strip()
|
|
67
|
+
|
|
68
|
+
return info
|
|
69
|
+
except FileNotFoundError:
|
|
70
|
+
print("⚠️ pdfinfo not found. Install poppler-utils for full PDF analysis.")
|
|
71
|
+
print(" macOS: brew install poppler")
|
|
72
|
+
print(" Linux: sudo apt-get install poppler-utils")
|
|
73
|
+
return None
|
|
74
|
+
except subprocess.CalledProcessError as e:
|
|
75
|
+
print(f"Error running pdfinfo: {e}")
|
|
76
|
+
return None
|
|
77
|
+
|
|
78
|
+
|
|
79
|
+
def check_page_count(pdf_path, venue_reqs):
|
|
80
|
+
"""Check if page count is within limit."""
|
|
81
|
+
pdf_info = get_pdf_info(pdf_path)
|
|
82
|
+
|
|
83
|
+
if not pdf_info:
|
|
84
|
+
return {"status": "skip", "message": "Could not determine page count"}
|
|
85
|
+
|
|
86
|
+
pages = int(pdf_info.get('Pages', 0))
|
|
87
|
+
limit = venue_reqs.get('page_limit')
|
|
88
|
+
|
|
89
|
+
if limit is None:
|
|
90
|
+
return {"status": "pass", "message": f"No page limit. Document has {pages} pages."}
|
|
91
|
+
|
|
92
|
+
if pages <= limit:
|
|
93
|
+
return {"status": "pass", "message": f"✓ Page count OK: {pages}/{limit} pages"}
|
|
94
|
+
else:
|
|
95
|
+
return {"status": "fail", "message": f"✗ Page count exceeded: {pages}/{limit} pages"}
|
|
96
|
+
|
|
97
|
+
|
|
98
|
+
def check_margins(pdf_path, venue_reqs):
|
|
99
|
+
"""Check if margins meet requirements."""
|
|
100
|
+
# Note: This is a simplified check. Full margin analysis requires more sophisticated tools.
|
|
101
|
+
req_margins = venue_reqs.get('margins', {})
|
|
102
|
+
|
|
103
|
+
if not req_margins:
|
|
104
|
+
return {"status": "skip", "message": "No margin requirements specified"}
|
|
105
|
+
|
|
106
|
+
# This is a placeholder - accurate margin checking requires parsing PDF content
|
|
107
|
+
return {"status": "info", "message": f"ℹ️ Required margins: {req_margins} cm (manual verification recommended)"}
|
|
108
|
+
|
|
109
|
+
|
|
110
|
+
def check_fonts(pdf_path, venue_reqs):
|
|
111
|
+
"""Check fonts in PDF."""
|
|
112
|
+
try:
|
|
113
|
+
result = subprocess.run(['pdffonts', str(pdf_path)], capture_output=True, text=True, check=True)
|
|
114
|
+
|
|
115
|
+
fonts_found = []
|
|
116
|
+
for line in result.stdout.split('\n')[2:]: # Skip header
|
|
117
|
+
if line.strip():
|
|
118
|
+
parts = line.split()
|
|
119
|
+
if parts:
|
|
120
|
+
fonts_found.append(parts[0])
|
|
121
|
+
|
|
122
|
+
req_font = venue_reqs.get('font_family', '')
|
|
123
|
+
req_size = venue_reqs.get('font_size')
|
|
124
|
+
|
|
125
|
+
message = f"ℹ️ Fonts found: {', '.join(set(fonts_found))}\n"
|
|
126
|
+
message += f" Required: {req_font}"
|
|
127
|
+
if req_size:
|
|
128
|
+
message += f" {req_size}pt minimum"
|
|
129
|
+
|
|
130
|
+
return {"status": "info", "message": message}
|
|
131
|
+
|
|
132
|
+
except FileNotFoundError:
|
|
133
|
+
return {"status": "skip", "message": "pdffonts not available"}
|
|
134
|
+
except subprocess.CalledProcessError:
|
|
135
|
+
return {"status": "skip", "message": "Could not extract font information"}
|
|
136
|
+
|
|
137
|
+
|
|
138
|
+
def validate_document(pdf_path, venue, checks):
|
|
139
|
+
"""Validate document against venue requirements."""
|
|
140
|
+
|
|
141
|
+
venue_key = venue.lower().replace(" ", "_")
|
|
142
|
+
|
|
143
|
+
if venue_key not in VENUE_REQUIREMENTS:
|
|
144
|
+
print(f"❌ Unknown venue: {venue}")
|
|
145
|
+
print(f"Available venues: {', '.join(VENUE_REQUIREMENTS.keys())}")
|
|
146
|
+
return
|
|
147
|
+
|
|
148
|
+
venue_reqs = VENUE_REQUIREMENTS[venue_key]
|
|
149
|
+
|
|
150
|
+
print(f"\n{'=' * 60}")
|
|
151
|
+
print(f"VALIDATING: {pdf_path.name}")
|
|
152
|
+
print(f"VENUE: {venue}")
|
|
153
|
+
print(f"{'=' * 60}\n")
|
|
154
|
+
|
|
155
|
+
results = {}
|
|
156
|
+
|
|
157
|
+
# Run requested checks
|
|
158
|
+
if 'page-count' in checks or 'all' in checks:
|
|
159
|
+
results['page-count'] = check_page_count(pdf_path, venue_reqs)
|
|
160
|
+
|
|
161
|
+
if 'margins' in checks or 'all' in checks:
|
|
162
|
+
results['margins'] = check_margins(pdf_path, venue_reqs)
|
|
163
|
+
|
|
164
|
+
if 'fonts' in checks or 'all' in checks:
|
|
165
|
+
results['fonts'] = check_fonts(pdf_path, venue_reqs)
|
|
166
|
+
|
|
167
|
+
# Print results
|
|
168
|
+
for check_name, result in results.items():
|
|
169
|
+
print(f"{check_name.upper()}:")
|
|
170
|
+
print(f" {result['message']}\n")
|
|
171
|
+
|
|
172
|
+
# Summary
|
|
173
|
+
failures = sum(1 for r in results.values() if r['status'] == 'fail')
|
|
174
|
+
passes = sum(1 for r in results.values() if r['status'] == 'pass')
|
|
175
|
+
|
|
176
|
+
print(f"{'=' * 60}")
|
|
177
|
+
if failures == 0:
|
|
178
|
+
print(f"✓ VALIDATION PASSED ({passes} checks)")
|
|
179
|
+
else:
|
|
180
|
+
print(f"✗ VALIDATION FAILED ({failures} issues)")
|
|
181
|
+
print(f"{'=' * 60}\n")
|
|
182
|
+
|
|
183
|
+
return results
|
|
184
|
+
|
|
185
|
+
|
|
186
|
+
def generate_report(pdf_path, venue, results, report_path):
|
|
187
|
+
"""Generate validation report."""
|
|
188
|
+
|
|
189
|
+
with open(report_path, 'w') as f:
|
|
190
|
+
f.write("Validation Report\n")
|
|
191
|
+
f.write(f"{'=' * 60}\n\n")
|
|
192
|
+
f.write(f"File: {pdf_path}\n")
|
|
193
|
+
f.write(f"Venue: {venue}\n")
|
|
194
|
+
f.write(f"Date: {Path.ctime(pdf_path)}\n\n")
|
|
195
|
+
|
|
196
|
+
for check_name, result in results.items():
|
|
197
|
+
f.write(f"{check_name.upper()}:\n")
|
|
198
|
+
f.write(f" Status: {result['status']}\n")
|
|
199
|
+
f.write(f" {result['message']}\n\n")
|
|
200
|
+
|
|
201
|
+
failures = sum(1 for r in results.values() if r['status'] == 'fail')
|
|
202
|
+
f.write(f"\nSummary: {'PASSED' if failures == 0 else 'FAILED'}\n")
|
|
203
|
+
|
|
204
|
+
print(f"Report saved to: {report_path}")
|
|
205
|
+
|
|
206
|
+
|
|
207
|
+
def main():
|
|
208
|
+
parser = argparse.ArgumentParser(
|
|
209
|
+
description="Validate document formatting for venue requirements",
|
|
210
|
+
formatter_class=argparse.RawDescriptionHelpFormatter,
|
|
211
|
+
epilog="""
|
|
212
|
+
Examples:
|
|
213
|
+
%(prog)s --file my_paper.pdf --venue "Nature" --check-all
|
|
214
|
+
%(prog)s --file my_paper.pdf --venue "NeurIPS" --check page-count,fonts
|
|
215
|
+
%(prog)s --file proposal.pdf --venue "NSF" --report validation.txt
|
|
216
|
+
""",
|
|
217
|
+
)
|
|
218
|
+
|
|
219
|
+
parser.add_argument('--file', type=str, required=True, help='PDF file to validate')
|
|
220
|
+
parser.add_argument('--venue', type=str, required=True, help='Target venue')
|
|
221
|
+
parser.add_argument(
|
|
222
|
+
'--check', type=str, default='all', help='Checks to perform: page-count, margins, fonts, all (comma-separated)'
|
|
223
|
+
)
|
|
224
|
+
parser.add_argument('--check-all', action='store_true', help='Perform all checks')
|
|
225
|
+
parser.add_argument('--report', type=str, help='Save report to file')
|
|
226
|
+
|
|
227
|
+
args = parser.parse_args()
|
|
228
|
+
|
|
229
|
+
# Check file exists
|
|
230
|
+
pdf_path = Path(args.file)
|
|
231
|
+
if not pdf_path.exists():
|
|
232
|
+
print(f"Error: File not found: {pdf_path}")
|
|
233
|
+
return
|
|
234
|
+
|
|
235
|
+
# Parse checks
|
|
236
|
+
if args.check_all:
|
|
237
|
+
checks = ['all']
|
|
238
|
+
else:
|
|
239
|
+
checks = [c.strip() for c in args.check.split(',')]
|
|
240
|
+
|
|
241
|
+
# Validate
|
|
242
|
+
results = validate_document(pdf_path, args.venue, checks)
|
|
243
|
+
|
|
244
|
+
# Generate report if requested
|
|
245
|
+
if args.report and results:
|
|
246
|
+
generate_report(pdf_path, args.venue, results, Path(args.report))
|
|
247
|
+
|
|
248
|
+
|
|
249
|
+
if __name__ == "__main__":
|
|
250
|
+
main()
|
package/bin/synsc
CHANGED
|
Binary file
|
package/package.json
CHANGED