Backend - dev-api.py: Q&A suggest endpoint, Log Contact, cf-orch node detection in wizard hardware step, canonical search_profiles format (profiles:[...]), connections settings endpoints, Resume Library endpoints - db_migrate.py: migrations 002/003/004 — ATS columns, resume review, final resume struct - discover.py: _normalize_profiles() for legacy wizard YAML format compat - resume_optimizer.py: section-by-section resume parsing + scoring - task_runner.py: Q&A and contact-log task types - company_research.py: accessibility brief column wiring - generate_cover_letter.py: restore _candidate module-level binding Frontend - InterviewPrepView.vue: Q&A chat tab, Log Contact form, MarkdownView rendering - InterviewCard.vue: new reusable card component for interviews kanban - InterviewsView.vue: rejected analytics section with stage breakdown chips - ResumeProfileView.vue: sync with new resume store shape - SearchPrefsView.vue: cf-orch toggle, profile format migration - SystemSettingsView.vue: connections settings wiring - ConnectionsSettingsView.vue: new view for integration connections - MarkdownView.vue: new component for safe markdown rendering - ApplyWorkspace.vue: a11y — h1→h2 demotion, aria-expanded on Q&A toggle, confirmation dialog on Reject action (#98 #99 #100) - peregrine.css: explicit [data-theme="dark"] token block for light-OS users (#101), :focus-visible outline (#97) - wizard.css: cf-orch hardware step styles - WizardHardwareStep.vue: cf-orch node display, profile selection with orch option - WizardLayout.vue: hardware step wiring Infra - compose.yml / compose.cloud.yml: cf-orch agent sidecar, llm.cloud.yaml mount - Dockerfile.cfcore: cf-core editable install in image build - HANDOFF-xanderland.md: Podman/systemd setup guide for beta tester - podman-standalone.sh: standalone Podman run script Tests - test_dev_api_settings.py: remove stale worktree path bootstrap (credential_store now in main repo); fix job_boards fixture to use non-empty list - test_wizard_api.py: update profiles assertion to superset check (cf-orch added); update step6 assertion to canonical profiles[].titles format
60 lines
2.6 KiB
Text
60 lines
2.6 KiB
Text
# Dockerfile.cfcore — build context must be the PARENT directory of peregrine/
|
||
#
|
||
# Used when circuitforge-core is installed from source (not PyPI).
|
||
# Both repos must be siblings on the build host:
|
||
# /devl/peregrine/ → WORKDIR /app
|
||
# /devl/circuitforge-core/ → installed to /circuitforge-core
|
||
#
|
||
# Build manually:
|
||
# docker build -f peregrine/Dockerfile.cfcore -t peregrine-cfcore ..
|
||
#
|
||
# Via compose (compose.test-cfcore.yml sets context: ..):
|
||
# docker compose -f compose.test-cfcore.yml build
|
||
FROM python:3.11-slim
|
||
|
||
WORKDIR /app
|
||
|
||
# System deps for companyScraper (beautifulsoup4, fake-useragent, lxml) and PDF gen
|
||
# libsqlcipher-dev: required to build pysqlcipher3 (SQLCipher AES-256 encryption for cloud mode)
|
||
RUN apt-get update && apt-get install -y --no-install-recommends \
|
||
gcc libffi-dev curl libsqlcipher-dev \
|
||
&& rm -rf /var/lib/apt/lists/*
|
||
|
||
# Copy circuitforge-core and install it from the local path before requirements.txt.
|
||
# requirements.txt has a git+https:// fallback URL for CI (where circuitforge-core
|
||
# is not a sibling directory), but Docker always has the local copy available here.
|
||
COPY circuitforge-core/ /circuitforge-core/
|
||
RUN pip install --no-cache-dir /circuitforge-core
|
||
|
||
# circuitforge-orch client — needed for LLMRouter cf_orch allocation.
|
||
# Optional: if the directory doesn't exist the COPY will fail at build time; keep
|
||
# cf-orch as a sibling of peregrine in the build context.
|
||
COPY circuitforge-orch/ /circuitforge-orch/
|
||
RUN pip install --no-cache-dir /circuitforge-orch
|
||
|
||
COPY peregrine/requirements.txt .
|
||
# Skip the cfcore line — already installed above from the local copy
|
||
RUN grep -v 'circuitforge-core' requirements.txt | pip install --no-cache-dir -r /dev/stdin
|
||
|
||
# Install Playwright browser (cached separately from Python deps so requirements
|
||
# changes don't bust the ~600–900 MB Chromium layer and vice versa)
|
||
RUN playwright install chromium && playwright install-deps chromium
|
||
|
||
# Bundle companyScraper (company research web scraper)
|
||
COPY peregrine/scrapers/ /app/scrapers/
|
||
|
||
COPY peregrine/ .
|
||
|
||
# Remove per-user config files that are gitignored but may exist locally.
|
||
# Defense-in-depth: the parent .dockerignore should already exclude these,
|
||
# but an explicit rm guarantees they never end up in the cloud image.
|
||
RUN rm -f config/user.yaml config/plain_text_resume.yaml config/notion.yaml \
|
||
config/email.yaml config/tokens.yaml config/craigslist.yaml \
|
||
config/adzuna.yaml .env
|
||
|
||
EXPOSE 8501
|
||
|
||
CMD ["streamlit", "run", "app/app.py", \
|
||
"--server.port=8501", \
|
||
"--server.headless=true", \
|
||
"--server.fileWatcherType=none"]
|