Local-First Retrieval Setup Implementation Plan

For agentic workers: REQUIRED SUB-SKILL: Use superpowers:subagent-driven-development (recommended) or superpowers:executing-plans to implement this plan task-by-task. Steps use checkbox (- [ ]) syntax for tracking.

Goal: Add a zaxy local-profile command that prints, writes, and validates an offline deterministic retrieval profile.

Architecture: Put pure profile rendering and validation in src/zaxy/local_profile.py, then keep src/zaxy/__main__.py limited to Typer argument handling. Documentation explains the offline baseline and leaves local HTTP model runtime integration for a later slice.

Tech Stack: Python 3.11, Typer, Pydantic settings, pytest, ruff.

---

Task 1: Local Profile Module

Files:

from pathlib import Path

import pytest

from zaxy.local_profile import check_local_profile, render_local_profile, write_local_profile


def test_render_local_profile_outputs_offline_env_without_secrets() -> None:
    text = render_local_profile()

    assert "EMBEDDING_ENABLED=true" in text
    assert "EMBEDDING_PROVIDER=hash" in text
    assert "RERANKER_PROVIDER=lexical" in text
    assert "NEO4J_AUTO_START=true" in text
    assert "OPENAI_API_KEY" not in text


def test_write_local_profile_refuses_to_overwrite_existing_file(tmp_path: Path) -> None:
    target = tmp_path / ".env.local"
    target.write_text("existing=true\n", encoding="utf-8")

    with pytest.raises(FileExistsError):
        write_local_profile(target)


def test_check_local_profile_accepts_deterministic_defaults() -> None:
    report = check_local_profile()

    assert report["embedding_provider"] == "hash"
    assert report["reranker_provider"] == "lexical"
    assert report["status"] == "ok"

Run: pytest --no-cov tests/test_local_profile.py -q

Expected: fail because zaxy.local_profile does not exist.

Create src/zaxy/local_profile.py with render_local_profile(), write_local_profile(), and check_local_profile(). The checker should use Settings(_env_file=None, embedding_provider="hash", reranker_provider="lexical"), build_embedding_provider(), and build_reranker().

Run: pytest --no-cov tests/test_local_profile.py -q

Expected: pass.

Task 2: CLI Command

Files:

Add tests that call CliRunner for:

def test_local_profile_command_prints_offline_env() -> None:
    result = runner.invoke(app, ["local-profile"])
    assert result.exit_code == 0
    assert "EMBEDDING_PROVIDER=hash" in result.output
    assert "RERANKER_PROVIDER=lexical" in result.output


def test_local_profile_command_writes_output_file(tmp_path: Path) -> None:
    target = tmp_path / ".env.local"
    result = runner.invoke(app, ["local-profile", "--output", str(target)])
    assert result.exit_code == 0
    assert "Wrote local profile" in result.output
    assert "RERANKER_PROVIDER=lexical" in target.read_text(encoding="utf-8")


def test_local_profile_check_reports_success() -> None:
    result = runner.invoke(app, ["local-profile", "--check"])
    assert result.exit_code == 0
    assert '"status": "ok"' in result.output

Run: pytest --no-cov tests/test_cli.py -q

Expected: fail because local-profile command does not exist.

Import local profile helpers and add @app.command("local-profile") with --output, --force, and --check.

Run: pytest --no-cov tests/test_cli.py tests/test_local_profile.py -q

Expected: pass.

Task 3: Documentation And Verification

Files:

Add the zaxy local-profile flow to the embedding docs, getting started guide, runbook CLI table, and mark the roadmap item complete in AGENTS.md.

Run:

ruff check src/zaxy/local_profile.py src/zaxy/__main__.py tests/test_local_profile.py tests/test_cli.py
pytest --no-cov tests/test_local_profile.py tests/test_cli.py tests/test_docs_site.py -q

Expected: all checks pass.