mirror of
https://github.com/langflow-ai/langflow.git
synced 2026-07-24 05:16:40 +08:00
* docs: record nightly→stable bundle cutover plan (gated on lfx 1.10.0) Add src/bundles/NIGHTLY.md documenting why langflow-nightly currently renames the bundles (lfx and lfx-nightly ship the same lfx/ import, so a stable bundle would co-install both and collide) and the deferred cutover (Approach A: canonical pre-releases; B: lfx as a bundle extra), gated on stable lfx 1.10.0 being published to PyPI. Also expand two docstrings in scripts/ci/update_lfx_version.py to state the deeper install-conflict reason, not just the resolve failure. No behavior change. * feat(ci): nightly Approach A — canonical pre-releases, drop nightly bundles [DRAFT/gated] (#13529) feat(ci): nightly Approach A — canonical pre-releases, drop nightly bundles DRAFT reference implementation of the nightly→stable-bundle cutover documented in src/bundles/NIGHTLY.md. Publishes the nightly under CANONICAL package names as .devN pre-releases instead of separate *-nightly distributions, so the stable lfx-* bundles resolve against a single canonical lfx (no dual-lfx install collision) and no nightly bundle packages are produced. - tag scripts (pypi/lfx/sdk_nightly_tag.py): count .devN against the canonical PyPI histories instead of the *-nightly projects - update scripts: stop renaming to *-nightly; set .devN versions; re-pin inter-package deps to exact canonical dev versions; delete the bundle rename/repin (update_lfx_dep_in_bundles, rename_bundles_for_nightly) - release_nightly.yml: publish canonical pre-releases; remove bundle build, dist-nightly-bundles artifact, publish-nightly-bundles job + its gate; verify canonical names; main wheel glob dist/langflow-*.whl - nightly_build.yml: drop the bundle git-add in the tag commit - NIGHTLY.md: Approach A marked implemented + activation gate + A1/A2 follow-ups Held as DRAFT: do not activate until stable lfx 1.10.0 is published AND the nightly base is the next minor (release-1.11.0). A 1.10.0.devN core sorts below 1.10.0 and would fail the bundles' >=1.10.0 floor. Stacked on #13528. (.secrets.baseline: incidental line-number shifts for the two workflows + prune of pre-existing stale Pokédex Agent.json entries.) * docs(ci): drop internal 'Approach A' label from nightly cutover comments Comment- and docstring-only change across scripts/ci/* and the two nightly workflows; no logic change. The two workflow edits stay single-line so .secrets.baseline line numbers are unaffected. src/bundles/NIGHTLY.md keeps its A/B decision-record framing intentionally. * feat(ci): make nightly consumers work with canonical pre-releases Follow-ups from the nightly cutover that are part of its blast radius (the nightly now publishes canonical `.devN` pre-releases, not `*-nightly` distributions): - version.py: derive the "Nightly" label from the `.dev` version marker, since the canonical `langflow`/`langflow-base` distribution matches first in the lookup. Keeps the startup banner and telemetry `package` field identifying nightlies. Adds a canonical-dev test; updates the base-dev assertion. - ci.yml check-nightly-status: query the canonical `langflow` project and pick the latest `.devN` release date instead of `langflow-nightly`'s `.info.version`. - db-migration-validation.yml: install the nightly as `langflow[postgresql]==<dev>` (pre-release) instead of `langflow-nightly[...]`; verify via version("langflow"). - src/lfx/README.md: nightly install is `uv pip install --pre lfx`. - NIGHTLY.md: rewrite the follow-ups section (these are addressed; Docker image, A2 meta-package, and website docs remain deferred by design). The `langflowai/langflow-nightly` Docker image name is intentionally unchanged. * fix(ci): correct nightly verify uv tree parsing + stale base-dep regex Addresses review of #13528: - release_nightly.yml LFX verify: `uv tree | grep lfx | head -n1` matches the bundle `lfx-ibm` first → 'Name lfx-ibm does not match lfx'. Root the tree with `uv tree --package lfx` so the first line is the lfx package itself. - release_nightly.yml base verify: under canonical naming `langflow-base` prints as a top-level `langflow-base v<ver>` line, so the old $2/$3 field parse read name="v0.10.0" and version="". Use `uv tree --package langflow-base` and $1/$2. - update_lf_base_dependency.py update_base_dep: regex only accepted ~=/==, so its CLI entry point couldn't match the current root dep `langflow-base[complete]>=0.10.0`. Add >= (parity with update_uv_dependency.py). The active nightly path uses update_uv_dependency.py and was unaffected. * docs(nightly): point NIGHTLY.md status at the activation gate, not draft state Per review of #13528: this file ships inside #13528 (#13529 was folded in), so the 'stacked on prep #13528' + 'held as a draft' framing is stale and misleading. Reword the status block to state the real guard is the activation gate (stable lfx 1.10.0 published AND next-minor base), not merge/draft state. Also reword the follow-ups heading 'decide before un-drafting' -> 'decide before activating'.
63 lines
2.5 KiB
Python
Executable File
63 lines
2.5 KiB
Python
Executable File
#!/usr/bin/env python
|
|
# scripts/ci/update_pyproject_combined.py
|
|
import sys
|
|
from pathlib import Path
|
|
|
|
from update_lf_base_dependency import update_lfx_dep_in_base
|
|
from update_pyproject_version import update_pyproject_version
|
|
from update_uv_dependency import update_uv_dep as update_version_uv_dep
|
|
|
|
# Add the current directory to the path so we can import the other scripts
|
|
current_dir = Path(__file__).resolve().parent
|
|
sys.path.append(str(current_dir))
|
|
|
|
|
|
def main():
|
|
"""Universal update script that handles both base and main updates in a single run.
|
|
|
|
The packages keep their CANONICAL names (``langflow``, ``langflow-base``) -- they are NOT
|
|
renamed to ``*-nightly``. This script only sets the nightly ``.devN`` versions and re-pins the
|
|
inter-package dependencies to exact canonical dev versions. See ``src/bundles/NIGHTLY.md``.
|
|
|
|
Usage:
|
|
update_pyproject_combined.py main <main_tag> <base_tag> <lfx_tag>
|
|
"""
|
|
arg_count = 5
|
|
if len(sys.argv) != arg_count:
|
|
print("Usage:")
|
|
print(" update_pyproject_combined.py main <main_tag> <base_tag> <lfx_tag>")
|
|
sys.exit(1)
|
|
|
|
mode = sys.argv[1]
|
|
if mode != "main":
|
|
print("Only 'main' mode is supported")
|
|
print("Usage: update_pyproject_combined.py main <main_tag> <base_tag> <lfx_tag>")
|
|
sys.exit(1)
|
|
|
|
main_tag = sys.argv[2]
|
|
base_tag = sys.argv[3]
|
|
lfx_tag = sys.argv[4]
|
|
|
|
# Lockstep invariant: langflow-base's published dev version (set here from `base_tag`) and
|
|
# langflow's exact `==` pin on it (set below from the same `base_tag`) MUST come from the same
|
|
# value, so the latest nightly `langflow` always pins a base version published in the same run.
|
|
# `pypi_nightly_tag.py` makes the main and base tags identical; keep both writes sourced from
|
|
# `base_tag` or the pin can reference a version that was never published.
|
|
|
|
# First handle base package updates (canonical name kept).
|
|
update_pyproject_version("src/backend/base/pyproject.toml", base_tag)
|
|
|
|
# Update LFX dependency in langflow-base (exact canonical dev pin).
|
|
lfx_version = lfx_tag.lstrip("v")
|
|
update_lfx_dep_in_base("src/backend/base/pyproject.toml", lfx_version)
|
|
|
|
# Then handle main package updates (canonical name kept).
|
|
update_pyproject_version("pyproject.toml", main_tag)
|
|
# Update langflow-base dependency version (strip 'v' prefix if present).
|
|
base_version = base_tag.lstrip("v")
|
|
update_version_uv_dep(base_version)
|
|
|
|
|
|
if __name__ == "__main__":
|
|
main()
|