Skip to content

Design/distributable install#13

Merged
21tmccauley merged 7 commits into
paramify:design/distributable-installfrom
21tmccauley:design/distributable-install
Jul 13, 2026
Merged

Design/distributable install#13
21tmccauley merged 7 commits into
paramify:design/distributable-installfrom
21tmccauley:design/distributable-install

Conversation

@21tmccauley

Copy link
Copy Markdown
Collaborator

No description provided.

Tate McCauley and others added 7 commits July 13, 2026 14:17
…y model

The expected customization is creating fetchers for unsupported platforms,
not editing built-ins — so ship read-only bundled content + a writable user
overlay instead of a materialized workspace reconciled by a sync engine.
The no-clobber guarantee becomes structural: upgrades never write where
users do.

The reviewed workspace-sync design moves to docs/deferred/ with its revival
trigger (evidence of customers editing many built-ins in place). Decision
#243 supersedes #223; #224 (content bundled per release) stands.

Co-Authored-By: Claude Fable 5 <[email protected]>
- framework/roots.py: ordered content roots — $PARAMIFY_FETCHERS_PATH →
  dev checkout → $PARAMIFY_HOME/fetchers (platformdirs) → the installed
  bundle (framework/_bundled, shipped by a later commit).
- Discovery walks all roots: the first root wins a name collision, reported
  as a shadow (never silent); within-root duplicates stay a hard error; a
  broken fetcher.yaml is skipped and reported instead of aborting discovery
  (refuse, don't crash). Category files union per-file across roots, so a
  user dir can define entirely new platforms.
- Schemas and ksis.yaml resolve package-relative; every CLI command
  tolerates a missing checkout (api.locate_root); run manifests fall back
  to the cwd. The dev clone outranks the user dir so in-tree edits win.
- paramify create <category>/<name> scaffolds a user fetcher from the
  shipped template; paramify customize <fetcher> is the copy-on-write
  override, with a .customized.json sidecar (source, tool version,
  per-file hashes); doctor gains a distribution section reporting roots,
  shadows, stale/orphaned overrides, and invalid fetchers.

Co-Authored-By: Claude Fable 5 <[email protected]>
setup.py's build_py hook assembles framework/_bundled/ (fetchers + examples;
logos excluded — README furniture) straight into build_lib, so every build
path produces the bundle and the source tree never grows a stale copy.
Package data covers the schemas, the KSI reference, and the TUI stylesheet;
uploaders/ becomes a proper package so paramify upload works installed
(api falls back to the packaged module outside a checkout). MANIFEST.in
keeps sdists — including the GitHub source tarball — complete.

tests/test_installed.py builds the wheel, installs it into an isolated
target, and drives catalog + a real demo_hello run from an empty cwd with
no checkout on disk — the 'green in dev, broken installed' gap, now gated —
plus the user-dir-shadows-bundle override path.

Co-Authored-By: Claude Fable 5 <[email protected]>
Console scripts installed next to the running interpreter — a pipx venv, an
unactivated .venv — were invisible to fetchers: pipx inject checkov lands
the CLI in a bin/ that pipx never puts on PATH, and _build_env passed
children only the inherited PATH. Prepend Path(sys.executable).parent
(deduped) so venv-installed CLIs resolve under pipx and dev venvs alike.

Co-Authored-By: Claude Fable 5 <[email protected]>
packaging/brew/ holds the tap formula template (virtualenv-based; the
external CLIs the catalog shells out to as deps — the one thing brew can
declare that pipx can't; setuptools/wheel as resources because brew builds
offline and the bundle-assembling build hook needs them) plus the
per-release stamp procedure (shasum + brew update-python-resources).

releasing.md gains build-and-attach-the-wheel and tap-bump steps, and the
Artifacts section drops the wheel/PyPI blocker removed by the overlay
distribution work — PyPI is now a channel decision, not a technical one.

Co-Authored-By: Claude Fable 5 <[email protected]>
…tra hint

The TUI gated the manifest picker, welcome-screen manifest table, and the
run action on root_path — a checkout-era assumption. The api facade now
handles root=None (manifests resolve from the cwd, content from the overlay
roots), so the gates just made those features silently dead under a pipx
install. Removed them.

The missing-textual hint named the wrong package ('paramify') and only the
pip flow; it now gives the pipx and pip commands for paramify-fetchers.

Co-Authored-By: Claude Fable 5 <[email protected]>
Found in dist testing: brew's pipx 1.15 (uv venv backend) exits 1 on
pipx install --force into an existing venv and silently leaves the old
version installed. UV_VENV_CLEAR=1 or uninstall-first works; the upgrade
instructions now say so.

Co-Authored-By: Claude Fable 5 <[email protected]>
@21tmccauley
21tmccauley merged commit b9cdaba into paramify:design/distributable-install Jul 13, 2026
7 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant