Stats
Actions
Tags
From easypaper
Run the EasyPaper end-to-end paper generation workflow with guided setup and metadata collection.
How this command is triggered — by the user, by Claude, or both
Slash command
/easypaper:easypaperThe summary Claude sees in its command listing — used to decide when to auto-load this command
Run the EasyPaper end-to-end paper generation workflow with guided setup and metadata collection.
## Execution contract
### Phase 1: Environment Setup (First-time only)
1. **Check if environment is set up**:
- Check if `.easypaper-env` directory exists
- Check if `easypaper` package is importable: `python -c "import easypaper"`
- Check if `pdflatex` command is available
2. **If environment is not ready**:
- Use the `setup-environment` skill to automatically:
- Create isolated virtual environment (prefer `uv`, fallback to `venv`)
- Install easypaper package
- C...Run the EasyPaper end-to-end paper generation workflow with guided setup and metadata collection.
Check if environment is set up:
.easypaper-env directory existseasypaper package is importable: python -c "import easypaper"pdflatex command is availableIf environment is not ready:
setup-environment skill to automatically:
uv, fallback to venv)Determine metadata source — ask user which applies:
generate_metadata_from_folder first:
metadata = await ep.generate_metadata_from_folder(
str(Path("path/to/materials").resolve()),
max_figures=12, max_tables=12,
vision_enrich_figures=True,
)
result = await ep.generate(metadata, compile_pdf=True)
Key options: max_figures, max_tables, vision_enrich_figures (default True),
vision_model, max_vision_figures.
See skills/paper-from-metadata/SKILL.md § "Alternative: Generate Metadata from a Materials Folder" for full parameter table and cost-control guidance./easypaper-metadata-build (or invoke the interactive-metadata-build skill directly). Claude walks the folder with its own Read/Glob/Grep tools, asks the user to confirm each field, and saves a PaperMetaData JSON that this command can then consume in path (A). Use this when the folder is non-typical, when the user wants to be in the loop, or when other skills (paperhub-*, pdf, exa-search, sequential-thinking) should help interpret the materials.Use the paper-from-metadata skill which handles:
title, idea_hypothesis, method, data, experiments, referencesstyle_guide, target_pages, template_path (absolute path), compile_pdf, enable_review, max_review_iterationsfigures (with absolute file_path), tables, code_repository (with absolute path if local_dir), output_dir (absolute path)pathlib.Path.resolve()PaperGenerationRequest, then convert with to_metadata() + to_generate_options().
from easypaper import EasyPaper, PaperGenerationRequest
from pathlib import Path
# Config path should be absolute
config_path = Path("configs/openrouter.yaml").resolve()
ep = EasyPaper(config_path=str(config_path))
# If user has metadata.json (e.g. examples/meta.json)
request = PaperGenerationRequest.model_validate_json_file("metadata.json")
metadata = request.to_metadata()
options = request.to_generate_options()
result = await ep.generate(metadata, **options)
result.pdf_path first.result.output_path in order:
iteration_*_final/**/*.pdfiteration_* directory PDFpaper.pdfIMPORTANT: All paths in metadata must be absolute paths:
template_path: Absolute path to LaTeX template file/directoryfigures[].file_path: Absolute paths to figure image filescode_repository.path: Absolute path (if type is local_dir)output_dir: Absolute path to output directoryconfig_path: Absolute path to EasyPaper config fileThe skill will automatically convert relative paths to absolute paths, but users should be encouraged to provide absolute paths.
examples/meta.json as the template (note: paths should be absolute)$ARGUMENTS
npx claudepluginhub pinkgranite/easypaper --plugin easypaper