Repository navigation
feat(fox-overlay): scaffold packages/fox-overlay/ for v0.6.0 migration (Phase 1) - #219
Merged
Merged
Conversation
11 of 23 tasks
Sibling overlay package that will hold all Fox-in-the-Box-specific code
so the forks/hermes-{agent,webui} submodules can pin virgin upstream tags
(Phase 8). This commit ships only the scaffold; subsequent phases (2-10)
populate it.
Tree shape:
packages/fox-overlay/
├── pyproject.toml entry-point commented until Phase 3
├── MANIFEST.toml empty inventory placeholder
├── README.md
├── .fox-removals empty manifest (Phase 2/7 fill)
├── .gitignore *.egg-info/
├── fox_overlay/
│ ├── bootstrap.py FOX_OVERLAY_AUTOINSTALL-gated install()
│ ├── webui_modules/ Phase 5 target
│ ├── webui_patches/ Phase 6 target
│ └── agent_plugins/ Phase 3 target
├── webui_static/.gitkeep Phase 2 target
├── patches/{webui,agent}/series Phase 4 target
└── scripts/check-overlay-basis.sh no-op stub; Phase 8 makes it real
Anti-regression Rule 4 honored: bootstrap.install() is gated by
FOX_OVERLAY_AUTOINSTALL (default on; set =0 to opt out for tests, REPL,
hot-reloaders, IDE indexers). Without the gate, any Phase 4-6 monkey-patch
that install() registers would fire from any unintended import path.
No behavior change in this commit: Dockerfile is untouched, the overlay
isn't pip install'd in the image yet, no entry-points wired, no patches
populated.
Validated locally:
- pip install -e packages/fox-overlay/ from a fresh venv builds an
editable wheel cleanly
- python -c "import fox_overlay.bootstrap" prints the install log line
- FOX_OVERLAY_AUTOINSTALL=0 leaves _INSTALLED=False until install() is
called explicitly
Refs #165 (sub-issue of #164 — Phase 1 of v0.6.0 epic #155).
Phase 1 introduces packages/fox-overlay/. Updating AGENTS.md (the repo-tracked agent-facing layout doc — CLAUDE.md is gitignored per repo policy "keep CLAUDE.md local only") so the on-disk tree and the doc stay aligned. Refs #165.
Plan §Phase 1 risk #1: "verify pnpm-workspace.yaml only enumerates JS packages." packages/* glob tolerates Python-only sibling directories today (pnpm ignores dirs without package.json) but explicit enumeration is the recommended mitigation, and prevents future contributors who add a package.json under a Python package directory from accidentally joining the JS workspace. packages/integration/ and packages/scripts/ never had package.json so this change does not affect today's pnpm graph; verified with `pnpm install --frozen-lockfile` (clean). Refs #165.
… tests
Three pytest cases covering the bootstrap.install() contract:
- test_install_is_idempotent — second install() returns cleanly
- test_autoinstall_default_on — without env var, import triggers install
- test_autoinstall_opt_out — FOX_OVERLAY_AUTOINSTALL=0 leaves _INSTALLED
False until install() is called explicitly
Seeds packages/fox-overlay/tests/ for Phases 3-6 to extend per
anti-regression Rule 3 ("regression test suite grows with every phase").
Refs #165.
roadhero
force-pushed
the
feat/v0.6.0-p1-scaffold-fox-overlay
branch
from
May 16, 2026 10:24
65a2f55 to
3927caa
Compare
xenia15
approved these changes
May 16, 2026
1 task
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Phase 1 of the v0.6.0 upstream-separation migration (epic #155). Closes #165 (sub-issue of phase tracker #164).
What this does
Introduces
packages/fox-overlay/— a sibling overlay package that will hold all Fox-in-the-Box-specific code so theforks/hermes-{agent,webui}submodules can pin virgin upstream tags (Phase 8). Phase 1 ships only the scaffold; subsequent phases (2-10) populate it.Plus a one-line
AGENTS.mdRepository-Layout addition and apnpm-workspace.yamlnarrowing.No behavior change — Dockerfile is untouched, the overlay isn't
pip installed in the image yet, no entry-points wired, no patches populated. The container builds bit-identically to today.Validation gates (per plan §Phase 1)
pip install -e packages/fox-overlay/from a fresh venv: clean editable wheelpython -c "import fox_overlay.bootstrap": prints[fox-overlay] bootstrap installed (no-op skeleton)FOX_OVERLAY_AUTOINSTALL=0opt-out: leaves_INSTALLED=Falseuntil manualinstall()call:8788(existing v0.5.4 baseline image): all greengit diff main...HEAD: only adds files underpackages/fox-overlay/plus 1-lineAGENTS.md+ 5-linepnpm-workspace.yamlnarrowingpnpm install --frozen-lockfile: clean5-hat process
Reviewer findings — ALL actioned (per Dennis "don't leave anything behind" 2026-05-16)
bootstrap.install()auto-fires at import — load-bearing footgun for Phase 4-6 (DevOps + Adversarial)FOX_OVERLAY_AUTOINSTALLenv gate (default on; set =0 to opt out) + module docstring warningpnpm-workspace.yamlglobspackages/*(Backend + Adversarial)packages/electronexplicitlytests/test_bootstrap.pywith 3 casespyproject.toml[tool.setuptools.packages.find]missingwhere(Backend)where = ["."]check-overlay-basis.shshebang/bin/sh(Adversarial)/bin/bashfor Phase 8 future bash features.fox-removalscomment-safety — risk of#lines being treated as filenames (Adversarial)grep -v '^\s*$|^\s*#'strip patternAGENTS.md"phases 2-7" (Adversarial)Zero open reviewer comments. All 9 findings either resolved in code or rebuilt out of history.
Out of scope (deferred to subsequent phases)
pip install -eof overlay in the image (Phase 3)## [0.6.0]entry (Phase 10)Authorship invariant
All 4 commits authored by
roadheroper the migration policy. NoCo-authored-byorGenerated with Claude Codelines.Closes #165 (Phase 1 sub-issue under #164).