Skip to content

Make Franco pip-installable and publish releases to PyPI (0.5.0) - #24

Merged
heminjoshi merged 1 commit into
mainfrom
pip-installable
Oct 17, 2026
Merged

heminjoshi merged 1 commit into
mainfrom
pip-installable

Conversation

@heminjoshi

Copy link
Copy Markdown
Collaborator

Franco assumed a source checkout: config, prompts, skills and data were all
resolved next to the package, so a PyPI install would have lacked its
prompts and written the contacts database into site-packages.

  • franco/paths.py: a home folder ($FRANCO_HOME, else the checkout, else the
    current folder when it has franco.yaml, else ~/.franco); resource() reads
    the home's copy first and the bundled one otherwise. Clones and the
    Docker image keep today's layout.
  • setup.py: build_py bundles prompts/, skills/, franco.yaml and .env.example
    into franco/_bundled from the top-level files (explicit allowlist; never
    product_knowledge.md / competitive_intel.md). MANIFEST.in ships them in
    the sdist.
  • franco init [DIR]: home folder with franco.yaml, private .env, editable
    prompts and skills, data/ and a protective .gitignore; never overwrites.
  • franco install skips pip outside a checkout; train creates skills/; the
    dashboard's venv check accepts any virtualenv and passes FRANCO_HOME to
    the process it starts.
  • release.yml: PyPI job (trusted publishing, PEP 740 attestations) between
    build and the GitHub Release; 'pypi' environment limited to v* tags.
  • Tests: home resolution, bundled fallback, init, install; the
    installed-wheel test now builds exactly what the sdist ships and checks a
    franco init home end to end, including that site-packages is untouched.
  • README, CONTRIBUTING, CLAUDE.md, CHANGELOG; version 0.5.0.

Franco assumed a source checkout: config, prompts, skills and data were all
resolved next to the package, so a PyPI install would have lacked its
prompts and written the contacts database into site-packages.

- franco/paths.py: a home folder ($FRANCO_HOME, else the checkout, else the
  current folder when it has franco.yaml, else ~/.franco); resource() reads
  the home's copy first and the bundled one otherwise. Clones and the
  Docker image keep today's layout.
- setup.py: build_py bundles prompts/, skills/, franco.yaml and .env.example
  into franco/_bundled from the top-level files (explicit allowlist; never
  product_knowledge.md / competitive_intel.md). MANIFEST.in ships them in
  the sdist.
- franco init [DIR]: home folder with franco.yaml, private .env, editable
  prompts and skills, data/ and a protective .gitignore; never overwrites.
- franco install skips pip outside a checkout; train creates skills/; the
  dashboard's venv check accepts any virtualenv and passes FRANCO_HOME to
  the process it starts.
- release.yml: PyPI job (trusted publishing, PEP 740 attestations) between
  build and the GitHub Release; 'pypi' environment limited to v* tags.
- Tests: home resolution, bundled fallback, init, install; the
  installed-wheel test now builds exactly what the sdist ships and checks a
  franco init home end to end, including that site-packages is untouched.
- README, CONTRIBUTING, CLAUDE.md, CHANGELOG; version 0.5.0.
Comment thread tests/test_paths.py


def test_install_outside_a_checkout_only_fetches_the_browser(monkeypatch):
import franco.cli as cli
Comment thread tests/test_paths.py
import sys
from pathlib import Path

import pytest
@heminjoshi
heminjoshi merged commit af0cb15 into main Oct 17, 2026
19 checks passed
@heminjoshi
heminjoshi deleted the pip-installable branch October 17, 2026 05:29
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