Files
browser-cli/justfile
T
daniel156161 9bdd886d18
Build & Publish Package / publish (push) Successful in 58s
Package Extension / package-extension (push) Successful in 1m17s
Testing / test (3.10) (push) Successful in 1m15s
Testing / test (3.12) (push) Successful in 1m8s
Testing / test (3.15) (push) Successful in 9m38s
Testing / remote-protocol-compat (0.15.0) (push) Successful in 9m20s
Testing / remote-protocol-compat (0.16.0) (push) Successful in 8m54s
Testing / test (3.14) (push) Successful in 55s
build: harden just publish with token lookup and dry run
- Move token lookup into scripts/pypi_token.sh, shared by both recipes
- Resolve UV_PUBLISH_TOKEN, then .env, then pass api/packages/pypi
- Fail with a clear hint instead of dropping into an interactive prompt
- Never print the token, only its length
- Gate publish behind version-check so version drift stops the build
- Add publish-dry, same path as publish but with uv publish --dry-run
- Pass --check-url so re-runs skip files already on PyPI
- Hoist dist dir, token entry, and check URL into justfile variables
- Add .env and .env.* to .gitignore

The old recipe sourced .env for credentials, but .env was never ignored, so a token file dropped there would have been committed and shipped inside the sdist.

Verified token precedence for env, .env and password-store, the missing-token exit code, the version-check gate, and a dry run against an unpublished version.
2026-10-20 12:56:24 +02:00

109 lines
4.0 KiB
Makefile

# browser-cli — task runner
# Run `just` or `just --list` to see all recipes.
# Default browser profile for `install` / quick checks
browser := "brave"
# Where `publish` builds, and where it looks up the PyPI token
dist_dir := "/tmp/dist-browser-cli"
pypi_token_entry := "api/packages/pypi"
pypi_check_url := "https://pypi.org/simple/"
# Show available recipes
default:
@just --list
# ── Setup ──────────────────────────────────────────────────────────────
# Install Python deps + Node deps for the extension build
setup:
uv sync
npm ci
# Register the native messaging host for a browser (default: {{browser}})
install browser=browser:
uv run browser-cli install {{browser}}
# ── Python ─────────────────────────────────────────────────────────────
# Run the full Python test suite
test:
uv run pytest -q
# Run tests verbosely
testv:
uv run pytest -v
# Run a single test file or node id, e.g. `just test-one tests/test_api.py`
test-one target:
uv run pytest -v {{target}}
# Run tests with a coverage report
cov:
uv run pytest --cov=browser_cli --cov-report=term-missing
# ── Extension (TypeScript / MV3) ───────────────────────────────────────
# Build the extension bundle (extension/background.js)
build:
npm run build:extension
# Run the JS (node:test) extension tests
test-ext:
npm run test:extension
# Full extension gate: tsc + build + node --check + JS tests
check:
npm run check:extension
# ── Everything ─────────────────────────────────────────────────────────
# Run the complete gate: extension check + Python tests
ci: check test
# ── Release ────────────────────────────────────────────────────────────
# Show the current version
version:
@grep -m1 '^version' pyproject.toml | cut -d'"' -f2
# Bump version in pyproject.toml AND extension/manifest.json, e.g. `just bump 0.10.5`
bump new:
sed -i 's/^version = ".*"/version = "{{new}}"/' pyproject.toml
sed -i 's/"version": ".*"/"version": "{{new}}"/' extension/manifest.json
@echo "bumped to {{new}} — remember to update uv.lock (uv lock) and rebuild the extension"
# Verify both version files agree
version-check:
@py=$(grep -m1 '^version' pyproject.toml | cut -d'"' -f2); \
ext=$(grep -m1 '"version"' extension/manifest.json | cut -d'"' -f4); \
if [ "$py" = "$ext" ]; then echo "ok: $py"; else echo "MISMATCH pyproject=$py manifest=$ext"; exit 1; fi
# Build and upload to PyPI. Token: UV_PUBLISH_TOKEN, else .env, else password-store.
publish: version-check
#!/usr/bin/env bash
set -euo pipefail
source scripts/pypi_token.sh
load_pypi_token "{{pypi_token_entry}}" || exit 1
rm -rf "{{dist_dir}}"
mkdir -p "{{dist_dir}}"
uv build --out-dir "{{dist_dir}}"
uv publish --check-url "{{pypi_check_url}}" "{{dist_dir}}"/*
# Same build and token path as `publish`, but uploads nothing
publish-dry: version-check
#!/usr/bin/env bash
set -euo pipefail
source scripts/pypi_token.sh
load_pypi_token "{{pypi_token_entry}}" || exit 1
rm -rf "{{dist_dir}}"
mkdir -p "{{dist_dir}}"
uv build --out-dir "{{dist_dir}}"
uv publish --dry-run --check-url "{{pypi_check_url}}" "{{dist_dir}}"/*
# ── Demos ──────────────────────────────────────────────────────────────
# Run the Python SDK demo
demo:
uv run python examples/demo.py