42 lines
		
	
	
		
			3.2 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
			
		
		
	
	
			42 lines
		
	
	
		
			3.2 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
| # Input Pipeline Overview
 | ||
| 
 | ||
| The input side of ResumeCustomizer prepares job-specific Markdown resumes by stitching together the base resume, a job-description Markdown file, and the shared instruction prompt, then invoking the Codex CLI inside a containerized watcher.
 | ||
| 
 | ||
| ## Workflow Recap
 | ||
| 1. Ensure `input/resume/` contains exactly one Markdown resume.
 | ||
| 2. Drop a single job-description Markdown into `input/ForCustomizing/inbox/`.
 | ||
| 3. Start the watcher stack (`input/Docker/run-input-processor.sh up -d`).
 | ||
| 4. The watcher combines the resume, job description, and the resolved instruction prompt (defaulting to `templates/ResumeCustomizerPrompt.md.example`) into a prompt, runs the Codex CLI, and writes the generated resume to `ForCustomizing/outbox/YYYY/MM/DD/HHMM/`.
 | ||
| 5. Successful runs archive the job description under `ForCustomizing/processed/` and copy the prompt used into the same outbox folder. Failures move the job description into `ForCustomizing/failed/` for review.
 | ||
| 
 | ||
| The human operator reviews the Codex output Markdown, makes any edits, and then manually hands it off to the output pipeline for document rendering.
 | ||
| 
 | ||
| ## Container Stack
 | ||
| The watcher lives in `input/Docker/`:
 | ||
| - `Dockerfile` – builds a Node/Python base image, installs gosu, and prepares a non-root `codex` user.
 | ||
| - `watch_and_customize.py` – polls the inbox, validates preconditions, resolves the prompt template (`ResumeCustomizerPrompt.md` or its `.example` fallback), constructs prompts, runs Codex, and routes files.
 | ||
| - `entrypoint.sh` – maps the container user to the caller’s UID/GID and ensures shared directories exist.
 | ||
| - `run-input-processor.sh` – wrapper around `docker compose` that mounts your `~/.codex` directory and forwards CLI arguments.
 | ||
| - `docker-compose.yml` – defines the container, volumes, environment variables, and restart policy (`no` so fatal errors halt the stack).
 | ||
| 
 | ||
| ### Templates
 | ||
| - `templates/ResumeCustomizerPrompt.md.example` ships with default Codex instructions.
 | ||
| - To customize, copy the `.example` file to `templates/ResumeCustomizerPrompt.md` (the `.gitignore` keeps your local overrides out of version control).
 | ||
| 
 | ||
| ### Key Environment Variables
 | ||
| - `CODEX_COMMAND_TEMPLATE` – format string for invoking Codex (placeholders: `{prompt}`, `{output}`).
 | ||
| - `POLL_INTERVAL_SECONDS` – watch loop delay (defaults to 5).
 | ||
| - `CODEX_TIMEOUT_SECONDS` – wall-clock timeout for each Codex call (defaults to 600).
 | ||
| - `CODEX_CONFIG_DIR` – host path to mount as `/home/codex/.codex` (defaults to `${HOME}/.codex` via the wrapper).
 | ||
| 
 | ||
| ### Prerequisites
 | ||
| - Docker Engine with the Compose plugin (`docker compose`) or the standalone `docker-compose` binary.
 | ||
| - A working Codex CLI and credentials in `~/.codex`. The Docker build attempts `npm install --location=global codex-cli`; override or update as needed if packages change.
 | ||
| 
 | ||
| ## Failure Modes
 | ||
| - **Multiple resumes or job descriptions** – watcher exits immediately with a fatal configuration error. Fix the files and restart.
 | ||
| - **Codex CLI missing or failing** – job description moves to `ForCustomizing/failed/`; inspect container logs, resolve, and requeue.
 | ||
| - **Timeouts** – treat as failures; adjust `CODEX_TIMEOUT_SECONDS` if Codex regularly needs more time.
 | ||
| 
 | ||
| For day-to-day operating guidelines, see `input/AGENTS.md`.
 |