Skip to content

feat(cockpit): retire PySide6/PyInstaller — remove the LGPL artifact ahead of the web-app rebuild (#355) - #359

Merged
dngioidev merged 1 commit into
mainfrom
feat/355-retire-pyside6
Aug 3, 2026
Merged

feat(cockpit): retire PySide6/PyInstaller — remove the LGPL artifact ahead of the web-app rebuild (#355)#359
dngioidev merged 1 commit into
mainfrom
feat/355-retire-pyside6

Conversation

@dngioidev

Copy link
Copy Markdown
Owner

Closes #355 — parent epic #350 (Cockpit v2, ADR-0008).

Per the owner's 2026-08-03 decision, remove the PySide6 (LGPLv3) desktop UI and PyInstaller packaging now, ahead of web-app parity, so the license check is clean with zero exceptions before the OSS/MIT flip. The framework-agnostic Python cores are retained; the FastAPI web app (#351) rebuilds the UI on them. No runnable desktop cockpit UI in the interim.

Acceptance criteria

  • AC.1 — PySide6, pywinpty, PyInstaller, pytest-qt removed from pyproject.toml; uv.lock regenerated; forge-cockpit.spec deleted. Cores + psutil (+ pytest) kept. The forge-cockpit entry point (target deleted) was removed; package relicensed MIT.
  • AC.2 — Qt presentation layer deleted (app.py, __main__.py, terminal.py, *_view.py); no remaining module imports PySide6/pywinpty; __init__.py stripped to a cores-only package init. Cores import cleanly; the six core test suites pass.
  • AC.3 — the PySide6 LGPL exception removed from license.mjs (PYTHON_LICENSE_EXCEPTIONS now empty; pyside6/pywinpty/pytest-qt dropped from the SPDX map). #349 tests updated to assert no non-permissive Python license and no lingering exception.
  • AC.4cockpit-python CI job is now cores-only (no Qt/offscreen env); license job green with zero exceptions; pnpm verify green.
  • AC.5 — ADR-0006 Decision 1 + ADR-0008 note PySide6 removed ahead of parity (UI absent until Cockpit v2: localhost backend — serve the Python cores over 127.0.0.1 #351); tools/runner-ui/README + runner-adoption guide + docs route index reflect the cores-only interim; docsync gate green.

Test deviation from the ticket inventory (honest note)

The ticket's KEEP list included tests/test_fleet_control.py, but on inspection it imports FleetTab from fleet_view and LogViewer from log_view (both deleted Qt modules) and uses the qapp/qtbot pytest-qt fixtures. Per the ticket's own "verify each test's imports before deciding" instruction, it is a Qt UI test and was deleted alongside the other Qt suites. The six genuinely framework-agnostic core suites are kept.

Verification (this branch)

  • license gatenode plugin/scripts/gates/license.mjs:
    license: clean — plugin declares MIT; all npm dependency licenses within the allowlist (9 ids); 2 Python dep(s), 0 documented exception(s)exit 0, zero exceptions.
  • pytest (cores-only, fresh venv from the committed uv.lock)uv sync --frozen + uv run --frozen pytest -q: 106 passed (no Qt, no offscreen).
  • pnpm verify — vitest: 58 files / 675 passed.
  • docsync gatedoc-sync: clean (54 docs indexed).
  • Repo-wide grep confirms no remaining PySide6/pywinpty/pytest-qt/forge-cockpit.spec/entry-point references in code, CI, or gitignore (only historical CHANGELOG/spike entries remain, intentionally).

🤖 Generated with Claude Code

…ahead of the web-app rebuild (#355)

Delete the PySide6 (LGPLv3) desktop UI and PyInstaller packaging now, ahead of
web-app parity (ADR-0008), so the license check is clean with ZERO exceptions
before the OSS/MIT flip. The framework-agnostic Python cores are retained; the
FastAPI web app (#351) rebuilds the UI on them. No runnable desktop UI in the
interim.

- pyproject: drop PySide6, pywinpty, pytest-qt (and the forge-cockpit entry
  point); keep psutil + pytest; relicense the package MIT; regenerate uv.lock.
- Delete the Qt presentation layer (app/__main__/terminal/*_view) and
  forge-cockpit.spec; strip __init__.py to a cores-only package init.
- Delete the Qt/pytest-qt + packaging tests and the offscreen conftest; keep the
  six core suites (test_fleet_control removed too — it imported the deleted
  fleet_view/log_view and used qapp/qtbot). 106 cores-only tests pass.
- license gate: remove the PySide6 LGPL exception (added by #349) from
  license.mjs; the Python tree is now fully permissive — `node license.mjs`
  reports zero exceptions, exit 0. Update the #349 tests to assert no
  non-permissive Python license and no lingering exception.
- CI: cockpit-python job runs cores-only pytest (no Qt/offscreen env).
- docs: ADR-0006 Decision 1 + ADR-0008 note PySide6 removed ahead of parity
  (UI absent until #351); runner-ui README + runner-adoption guide + docs route
  index reflect the cores-only interim state.

Closes #355

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01SATRHKa6mDHDuirhP6QuwL
@dngioidev
dngioidev merged commit 2261e30 into main Aug 3, 2026
7 checks passed
@dngioidev
dngioidev deleted the feat/355-retire-pyside6 branch August 3, 2026 09:50
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.

Cockpit v2: launch command + retire PySide6 / PyInstaller (drops the LGPL dep)

1 participant