Skip to content

feat(lucebox): hub CLI — install, serve, config, models - #335

Open
easel wants to merge 7 commits into
Luce-Org:mainfrom
easel:feat/lucebox-cli
Open

feat(lucebox): hub CLI — install, serve, config, models#335
easel wants to merge 7 commits into
Luce-Org:mainfrom
easel:feat/lucebox-cli

Conversation

@easel

@easel easel commented Jun 3, 2026

Copy link
Copy Markdown
Collaborator

Summary

Single-commit follow-up to docker-stack (#334): ship the host wrapper and in-container Python CLI so prebuilt images can actually be installed, configured, and served without hand-rolling docker run / DFLASH_* env.

This is the core launch surface only. Autotune sweep/profiles, profile/smoke, and agent-client harness adapters are deferred to stacked follow-ups.

Host

  • install.sh — curl bootstrap into ~/.local/bin/lucebox (channel-aware via LUCEBOX_INSTALLED_FROM)
  • lucebox.sh — host probe (GPU/driver/docker/WSL), systemd unit, serve / pull / update / check / logs

In-container (lucebox/ package)

  • check, pull, print-run, print-serve-argv
  • config {get,set,unset}~/.lucebox/config.toml
  • models {list,download} + VRAM-tier recommend_preset
  • VRAM-tier DFLASH_* heuristic (runtime_from_host); seeds config on first models download --activate so 24 GB hosts get 98k / tq3_0 / budget 16 instead of the 16k class default
  • Prefix cache stays off by default (agent tool-prompt regression on bragi)

Image / workspace

  • Dockerfile + Dockerfile.rocm: COPY lucebox into builder + runtime (uv workspace member)
  • Root pyproject.toml / uv.lock wire-up
  • Small entrypoint.sh fixes (HOST_INFO missing-dir guard, pure-bash trim)

Tests / CI

  • lucebox/tests/ (89 unit tests)
  • Wrapper sandbox scripts (scripts/test_lucebox_sh.sh, check_lucebox_wrapper_sandbox.sh)
  • CI pytest for lucebox/; lefthook.yml

Diff

  • 33 files, +6474 / −17
  • 1 commit on current main (62880e20)

Test plan

  • cd lucebox && uv run pytest — 89 passed
  • docker buildx bake cuda12-local --load includes /opt/lucebox-hub/lucebox and python -m lucebox --help works
  • ./install.shlucebox checklucebox installlucebox start on a 24 GB host serves n_ctx=98304
  • lucebox config get / models list via docker exec against a running container

Deferred (not in this PR)

  • Autotune sweep / profiles / lucebox autotune
  • profile / smoke commands
  • Agent-client harness adapters + bench

@easel
easel force-pushed the feat/lucebox-cli branch 2 times, most recently from 91276a7 to 62b21f0 Compare June 4, 2026 02:50
easel added a commit to easel/lucebox-hub that referenced this pull request Jun 4, 2026
## What

Containerization stack for lucebox-hub. Dockerfile + docker-bake.hcl
build the lucebox-hub image (build-env and runtime stages);
scripts/build_image.sh drives local builds; server/scripts/entrypoint.sh
emits IMAGE_INFO / HOST_INFO sidecars consumed by /props. GitHub Actions
add .github/workflows/docker.yml (build & publish), update ci.yml, and
add release-luce-bench.yml for tagging. Workspace-root files
(pyproject.toml, uv.lock, Makefile, lefthook.yml, .gitignore, README)
live here because the Dockerfile uv-syncs the workspace at build time.

## Why

Provides the reproducible image and CI pipeline every other split PR
deploys into. Centralizing build/publish here keeps Dockerfile,
entrypoint, and workspace-root pinning in one reviewable change.

## Dependencies

- Luce-Org#335 (lucebox-cli): Dockerfile COPYs lucebox/ into the image
- Luce-Org#337 (lucebench-harness): Dockerfile COPYs luce-bench/ into the image
@easel
easel force-pushed the feat/lucebox-cli branch from 62b21f0 to 8732b35 Compare June 4, 2026 05:02
easel added a commit to easel/lucebox-hub that referenced this pull request Jun 4, 2026
## What

Containerization stack for lucebox-hub. Dockerfile + docker-bake.hcl
build the lucebox-hub image (build-env and runtime stages);
scripts/build_image.sh drives local builds; server/scripts/entrypoint.sh
emits IMAGE_INFO / HOST_INFO sidecars consumed by /props. GitHub Actions
add .github/workflows/docker.yml (build & publish), update ci.yml, and
add release-luce-bench.yml for tagging. Workspace-root files
(pyproject.toml, uv.lock, Makefile, lefthook.yml, .gitignore, README)
live here because the Dockerfile uv-syncs the workspace at build time.

## Why

Provides the reproducible image and CI pipeline every other split PR
deploys into. Centralizing build/publish here keeps Dockerfile,
entrypoint, and workspace-root pinning in one reviewable change.

## Dependencies

- Luce-Org#335 (lucebox-cli): Dockerfile COPYs lucebox/ into the image
- Luce-Org#337 (lucebench-harness): Dockerfile COPYs luce-bench/ into the image
@easel
easel force-pushed the feat/lucebox-cli branch 2 times, most recently from 6c9078b to 360d332 Compare June 4, 2026 17:17
easel added a commit to easel/lucebox-hub that referenced this pull request Jun 4, 2026
## What

Containerization stack for lucebox-hub. Dockerfile + docker-bake.hcl
build the lucebox-hub image (build-env and runtime stages);
scripts/build_image.sh drives local builds; server/scripts/entrypoint.sh
emits IMAGE_INFO / HOST_INFO sidecars consumed by /props. GitHub Actions
add .github/workflows/docker.yml (build & publish), update ci.yml, and
add release-luce-bench.yml for tagging. Workspace-root files
(pyproject.toml, uv.lock, Makefile, lefthook.yml, .gitignore, README)
live here because the Dockerfile uv-syncs the workspace at build time.

## Why

Provides the reproducible image and CI pipeline every other split PR
deploys into. Centralizing build/publish here keeps Dockerfile,
entrypoint, and workspace-root pinning in one reviewable change.

## Dependencies

- Luce-Org#335 (lucebox-cli): Dockerfile COPYs lucebox/ into the image
- Luce-Org#337 (lucebench-harness): Dockerfile COPYs luce-bench/ into the image
@easel
easel force-pushed the feat/lucebox-cli branch 2 times, most recently from 1d588db to 0d8e1ff Compare June 4, 2026 18:38
@easel
easel marked this pull request as ready for review June 4, 2026 19:18

@cubic-dev-ai cubic-dev-ai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

All reported issues were addressed across 52 files

Reply with feedback, questions, or to request a fix.

Re-trigger cubic

Comment thread harness/src/harness/clients/opencode.py Outdated
Comment thread lucebox/src/lucebox/autotune.py Outdated
Comment thread harness/src/harness/bench.py Outdated
Comment thread lucebox.sh Outdated
Comment thread lucebox/src/lucebox/sweep.py Outdated
Comment thread lucebox/src/lucebox/sweep.py Outdated
Comment thread harness/clients/run_lucebench.sh Outdated
Comment thread lucebox.sh Outdated
Comment thread lefthook.yml Outdated
Comment thread lucebox/src/lucebox/docker_run.py Outdated
@easel
easel force-pushed the feat/lucebox-cli branch from 0d8e1ff to 73f04f4 Compare June 4, 2026 23:30
easel pushed a commit to easel/lucebox-hub that referenced this pull request Jun 5, 2026
@easel
easel force-pushed the feat/lucebox-cli branch 2 times, most recently from bb7bb11 to a56b51b Compare June 8, 2026 22:08
easel added a commit to easel/lucebox-hub that referenced this pull request Jun 8, 2026
Containerization stack for lucebox-hub. Dockerfile + docker-bake.hcl
build the lucebox-hub image (build-env and runtime stages);
scripts/build_image.sh drives local builds; server/scripts/entrypoint.sh
emits IMAGE_INFO / HOST_INFO sidecars consumed by /props. GitHub Actions
add .github/workflows/docker.yml (build & publish), update ci.yml, and
add release-luce-bench.yml for tagging. Workspace-root files
(pyproject.toml, uv.lock, Makefile, lefthook.yml, .gitignore, README)
live here because the Dockerfile uv-syncs the workspace at build time.

Provides the reproducible image and CI pipeline every other split PR
deploys into. Centralizing build/publish here keeps Dockerfile,
entrypoint, and workspace-root pinning in one reviewable change.

- Luce-Org#335 (lucebox-cli): Dockerfile COPYs lucebox/ into the image
- Luce-Org#337 (lucebench-harness): Dockerfile COPYs luce-bench/ into the image
davide221 added a commit to easel/lucebox-hub that referenced this pull request Jun 9, 2026
…R + personal refs

Strip forward-references to lucebox-cli (Luce-Org#335) and luce-bench (Luce-Org#337) plus the
contributor's personal repos so the docker stack stands alone:

- delete .github/workflows/release-luce-bench.yml (luce-bench PyPI publish;
  fires only on luce-bench-v* tags, needs a luce-bench/ dir not in this repo)
- Makefile: drop test/smoke/bench/profile targets (invoke lucebench/lucebox
  modules absent here) and their now-unused vars
- .gitignore: drop luce-bench/snapshots and external baseline-repo URLs
- pyproject.toml / Dockerfile / docker.yml: de-reference Luce-Org#335/Luce-Org#337/luce-bench
  in comments

No functional change: deps, workspace members, ruff config, and every build
instruction are untouched, so CI stays green. The siblings re-add their own
scaffolding when they land.

Co-Authored-By: WOZCODE <contact@withwoz.com>
@easel
easel force-pushed the feat/lucebox-cli branch 2 times, most recently from 5a7e617 to c46e358 Compare June 11, 2026 15:15

@cubic-dev-ai cubic-dev-ai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

1 issue found across 2 files (changes from recent commits).

Prompt for AI agents (unresolved issues)

Check if these issues are valid — if so, understand the root cause of each and fix them. If appropriate, use sub-agents to investigate and fix each issue separately.


<file name="lucebox/src/lucebox/docker_run.py">

<violation number="1" location="lucebox/src/lucebox/docker_run.py:231">
P3: Several newly added helper functions are dead code (defined but never called anywhere in the codebase).</violation>
</file>

Tip: Review your code locally with the cubic CLI to iterate faster.

Re-trigger cubic

Comment thread scripts/test_lucebox_sh.sh
@easel
easel force-pushed the feat/lucebox-cli branch 3 times, most recently from a731f1d to 71139a5 Compare June 16, 2026 17:22
easel added a commit to easel/lucebox-hub that referenced this pull request Jun 16, 2026
…oad core

Defer second-order features to follow-up PRs so this PR is just the host
wrapper and the CLI needed to install, launch/serve, configure, and
download models. Cuts the PR from ~11.2k to ~6.2k added lines.

Deferred out of this PR (land as stacked follow-ups):
- Agent-client adapters + bench: the entire net-new harness/ package
  (bench.py, the six clients, run_lucebench.sh) and the client launcher
  verbs. harness/ reverts to main's loose-scripts state; the root
  pyproject no longer adds harness as a workspace member/dep.
- Autotune sweep + profiles: candidate_configs, the Profile registry and
  per-arch brackets, sweep.py, and the `autotune` command. The host-derived
  DFLASH_* heuristic (runtime_from_host) STAYS — config.live_config needs it
  to bake serve defaults — slimmed into autotune.py.
- profile + smoke commands and their modules.

Coupling fixes:
- recommend_preset moved autotune.py -> download.py (models sub-app uses it).
- Wrapper: drop the autotune --sweep exec-routing special case and trim
  usage/completion/exec-set to the core verbs.

Tests/CI follow the surface: deferred-feature tests removed; runtime_from_host
heuristic tests kept; new guard asserts the deferred verbs are NOT registered.
CI pytest step scoped to lucebox. lucebox 72 passed, wrapper 53 passed,
ruff + mypy + shellcheck clean.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

@cubic-dev-ai cubic-dev-ai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

1 issue found across 37 files (changes from recent commits).

Prompt for AI agents (unresolved issues)

Check if these issues are valid — if so, understand the root cause of each and fix them. If appropriate, use sub-agents to investigate and fix each issue separately.


<file name="lucebox/src/lucebox/docker_run.py">

<violation number="1" location="lucebox/src/lucebox/docker_run.py:231">
P3: Several newly added helper functions are dead code (defined but never called anywhere in the codebase).</violation>
</file>

Tip: Review your code locally with the cubic CLI to iterate faster.

Re-trigger cubic

Comment thread lucebox.sh
easel added a commit to easel/lucebox-hub that referenced this pull request Jun 16, 2026
Stacked on the core lucebox CLI (Luce-Org#335). Restores the second-order tuning
and diagnostics surface deferred from that PR:

- autotune.py: the empirical sweep machinery — candidate_configs, the
  Profile registry + per-arch coding-agent-loop brackets, get_profile.
  (recommend_preset stays in download.py from the core split.)
- sweep.py: the per-cell config sweep driver (config set -> restart ->
  luce-bench snapshot -> winner pick).
- profile.py / smoke.py + the `autotune`, `profile`, `smoke` CLI commands.
- Wrapper: the `autotune --sweep` exec-routing special case (sweeps must
  stay on docker run, not exec into the container they'd restart) and the
  autotune/profile/smoke entries in usage + completion + the exec set.

Tests: sweep / profile / smoke / autotune-cli / candidate-configs suites
and the Profile/bracket tests restored; test_cli guards that the client
launcher verbs are still deferred while autotune/profile/smoke register.

lucebox 122 passed, wrapper 55 passed, ruff + mypy + shellcheck clean.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
easel added a commit to easel/lucebox-hub that referenced this pull request Jun 16, 2026
Stacked on the tuning PR (which is stacked on core Luce-Org#335). Restores the
last deferred cluster: the agent-client launch surface.

- harness/ becomes an installable package again (bench.py + the six client
  adapters: claude_code, codex, hermes, openclaw, opencode, pi, plus
  _common and run_lucebench.sh) and rejoins the uv workspace.
- cli.py: the claude/codex/opencode/hermes/pi/openclaw verbs, registered
  from one factory, plus _detect_server_url / _exec_client (which reuse
  profile._server_base_urls from the tuning PR — hence this stacks on it).
- CI runs the harness pytest suite alongside lucebox again.

recommend_preset stays in download.py (core's relocation), so the models
sub-app is unaffected.

lucebox + harness 156 passed, wrapper 55 passed, ruff + mypy + shellcheck
clean.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
easel added a commit to easel/lucebox-hub that referenced this pull request Jun 17, 2026
Stacked on the core lucebox CLI (Luce-Org#335). Restores the second-order tuning
and diagnostics surface deferred from that PR:

- autotune.py: the empirical sweep machinery — candidate_configs, the
  Profile registry + per-arch coding-agent-loop brackets, get_profile.
  (recommend_preset stays in download.py from the core split.)
- sweep.py: the per-cell config sweep driver (config set -> restart ->
  luce-bench snapshot -> winner pick).
- profile.py / smoke.py + the `autotune`, `profile`, `smoke` CLI commands.
- Wrapper: the `autotune --sweep` exec-routing special case (sweeps must
  stay on docker run, not exec into the container they'd restart) and the
  autotune/profile/smoke entries in usage + completion + the exec set.

Tests: sweep / profile / smoke / autotune-cli / candidate-configs suites
and the Profile/bracket tests restored; test_cli guards that the client
launcher verbs are still deferred while autotune/profile/smoke register.

lucebox 122 passed, wrapper 55 passed, ruff + mypy + shellcheck clean.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
easel added a commit to easel/lucebox-hub that referenced this pull request Jun 17, 2026
Stacked on the tuning PR (which is stacked on core Luce-Org#335). Restores the
last deferred cluster: the agent-client launch surface.

- harness/ becomes an installable package again (bench.py + the six client
  adapters: claude_code, codex, hermes, openclaw, opencode, pi, plus
  _common and run_lucebench.sh) and rejoins the uv workspace.
- cli.py: the claude/codex/opencode/hermes/pi/openclaw verbs, registered
  from one factory, plus _detect_server_url / _exec_client (which reuse
  profile._server_base_urls from the tuning PR — hence this stacks on it).
- CI runs the harness pytest suite alongside lucebox again.

recommend_preset stays in download.py (core's relocation), so the models
sub-app is unaffected.

lucebox + harness 156 passed, wrapper 55 passed, ruff + mypy + shellcheck
clean.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
easel added a commit to easel/lucebox-hub that referenced this pull request Jun 17, 2026
Stacked on the tuning PR (which is stacked on core Luce-Org#335). Restores the
last deferred cluster: the agent-client launch surface.

- harness/ becomes an installable package again (bench.py + the six client
  adapters: claude_code, codex, hermes, openclaw, opencode, pi, plus
  _common and run_lucebench.sh) and rejoins the uv workspace.
- cli.py: the claude/codex/opencode/hermes/pi/openclaw verbs, registered
  from one factory, plus _detect_server_url / _exec_client (which reuse
  profile._server_base_urls from the tuning PR — hence this stacks on it).
- CI runs the harness pytest suite alongside lucebox again.

recommend_preset stays in download.py (core's relocation), so the models
sub-app is unaffected.

lucebox + harness 156 passed, wrapper 55 passed, ruff + mypy + shellcheck
clean.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@davide221
davide221 requested a review from dusterbloom June 24, 2026 09:47
@easel
easel force-pushed the feat/lucebox-cli branch from aeae314 to 0ae47c5 Compare July 6, 2026 01:32
easel added a commit to easel/lucebox-hub that referenced this pull request Jul 6, 2026
…oad core

Defer second-order features to follow-up PRs so this PR is just the host
wrapper and the CLI needed to install, launch/serve, configure, and
download models. Cuts the PR from ~11.2k to ~6.2k added lines.

Deferred out of this PR (land as stacked follow-ups):
- Agent-client adapters + bench: the entire net-new harness/ package
  (bench.py, the six clients, run_lucebench.sh) and the client launcher
  verbs. harness/ reverts to main's loose-scripts state; the root
  pyproject no longer adds harness as a workspace member/dep.
- Autotune sweep + profiles: candidate_configs, the Profile registry and
  per-arch brackets, sweep.py, and the `autotune` command. The host-derived
  DFLASH_* heuristic (runtime_from_host) STAYS — config.live_config needs it
  to bake serve defaults — slimmed into autotune.py.
- profile + smoke commands and their modules.

Coupling fixes:
- recommend_preset moved autotune.py -> download.py (models sub-app uses it).
- Wrapper: drop the autotune --sweep exec-routing special case and trim
  usage/completion/exec-set to the core verbs.

Tests/CI follow the surface: deferred-feature tests removed; runtime_from_host
heuristic tests kept; new guard asserts the deferred verbs are NOT registered.
CI pytest step scoped to lucebox. lucebox 72 passed, wrapper 53 passed,
ruff + mypy + shellcheck clean.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
easel added a commit to easel/lucebox-hub that referenced this pull request Jul 6, 2026
…oad core

Defer second-order features to follow-up PRs so this PR is just the host
wrapper and the CLI needed to install, launch/serve, configure, and
download models. Cuts the PR from ~11.2k to ~6.2k added lines.

Deferred out of this PR (land as stacked follow-ups):
- Agent-client adapters + bench: the entire net-new harness/ package
  (bench.py, the six clients, run_lucebench.sh) and the client launcher
  verbs. harness/ reverts to main's loose-scripts state; the root
  pyproject no longer adds harness as a workspace member/dep.
- Autotune sweep + profiles: candidate_configs, the Profile registry and
  per-arch brackets, sweep.py, and the `autotune` command. The host-derived
  DFLASH_* heuristic (runtime_from_host) STAYS — config.live_config needs it
  to bake serve defaults — slimmed into autotune.py.
- profile + smoke commands and their modules.

Coupling fixes:
- recommend_preset moved autotune.py -> download.py (models sub-app uses it).
- Wrapper: drop the autotune --sweep exec-routing special case and trim
  usage/completion/exec-set to the core verbs.

Tests/CI follow the surface: deferred-feature tests removed; runtime_from_host
heuristic tests kept; new guard asserts the deferred verbs are NOT registered.
CI pytest step scoped to lucebox. lucebox 72 passed, wrapper 53 passed,
ruff + mypy + shellcheck clean.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@easel
easel force-pushed the feat/lucebox-cli branch from 0ae47c5 to 573570a Compare July 6, 2026 19:05

@cubic-dev-ai cubic-dev-ai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

All reported issues were addressed across 2 files (changes from recent commits).

Tip: Review your code locally with the cubic CLI to iterate faster.

Re-trigger cubic

Comment thread lucebox.sh

@cubic-dev-ai cubic-dev-ai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

All reported issues were addressed across 3 files (changes from recent commits).

Tip: Review your code locally with the cubic CLI to iterate faster.

Re-trigger cubic

Comment thread lucebox/src/lucebox/config.py
davide221 pushed a commit to easel/lucebox-hub that referenced this pull request Jul 21, 2026
…oad core

Defer second-order features to follow-up PRs so this PR is just the host
wrapper and the CLI needed to install, launch/serve, configure, and
download models. Cuts the PR from ~11.2k to ~6.2k added lines.

Deferred out of this PR (land as stacked follow-ups):
- Agent-client adapters + bench: the entire net-new harness/ package
  (bench.py, the six clients, run_lucebench.sh) and the client launcher
  verbs. harness/ reverts to main's loose-scripts state; the root
  pyproject no longer adds harness as a workspace member/dep.
- Autotune sweep + profiles: candidate_configs, the Profile registry and
  per-arch brackets, sweep.py, and the `autotune` command. The host-derived
  DFLASH_* heuristic (runtime_from_host) STAYS — config.live_config needs it
  to bake serve defaults — slimmed into autotune.py.
- profile + smoke commands and their modules.

Coupling fixes:
- recommend_preset moved autotune.py -> download.py (models sub-app uses it).
- Wrapper: drop the autotune --sweep exec-routing special case and trim
  usage/completion/exec-set to the core verbs.

Tests/CI follow the surface: deferred-feature tests removed; runtime_from_host
heuristic tests kept; new guard asserts the deferred verbs are NOT registered.
CI pytest step scoped to lucebox. lucebox 72 passed, wrapper 53 passed,
ruff + mypy + shellcheck clean.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

@cubic-dev-ai cubic-dev-ai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

All reported issues were addressed across 33 files

Reply with feedback, questions, or to request a fix.

Re-trigger cubic

Comment thread scripts/test_lucebox_sh.sh
Comment thread lucebox.sh Outdated
Comment thread lucebox.sh Outdated
Comment thread lucebox/src/lucebox/docker_run.py Outdated
Comment thread .github/workflows/ci.yml
Comment thread lucebox/pyproject.toml Outdated
Comment thread lucebox/src/lucebox/config.py
Comment thread lucebox/src/lucebox/download.py Outdated
Comment thread lucebox/src/lucebox/download.py Outdated
Comment thread lucebox/tests/test_models_cli.py Outdated
User-facing host wrapper + in-container Python CLI for launching and
configuring the lucebox-hub image. Completes the docker-stack (Luce-Org#334)
follow-up that intentionally shipped images without the CLI package.

Host surface:
- install.sh bootstrap + lucebox.sh wrapper (probe host, systemd unit,
  serve/pull/update/check/logs)
- config.toml as system of record (env > file > defaults)

In-container package (lucebox/):
- check, pull, print-run, print-serve-argv
- config {get,set,unset}
- models {list,download} with VRAM-tier recommend_preset
- VRAM-tier DFLASH_* heuristic (runtime_from_host); seeds config.toml
  on first models download --activate so 24 GB hosts get 98k/tq3_0
  instead of the 16k class default
- prefix_cache stays off by default (agent tool-prompt regression)

Image/workspace:
- COPY lucebox into CUDA and ROCm images; uv workspace member
- entrypoint host_info missing-dir guard + pure-bash trim

Tests/CI: lucebox pytest, wrapper sandbox scripts, lefthook.

Deferred to follow-ups: autotune sweep/profiles, profile/smoke,
agent-client harness adapters.
@easel
easel force-pushed the feat/lucebox-cli branch from 32554cc to 7611c28 Compare July 23, 2026 20:15
@easel easel changed the title feat(lucebox): hub CLI + autotune/sweep/profile + harness adapters + shell wrapper feat(lucebox): hub CLI — install, serve, config, models Jul 23, 2026

@cubic-dev-ai cubic-dev-ai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

All reported issues were addressed across 33 files

Reply with feedback, questions, or to request a fix.

Re-trigger cubic

Comment thread lucebox/src/lucebox/docker_run.py
Comment thread lucebox.sh Outdated
Comment thread lucebox.sh
Comment thread server/scripts/entrypoint.sh
Comment thread lucebox/src/lucebox/cli.py
Comment thread lucebox.sh Outdated
Comment thread lucebox/src/lucebox/docker_run.py Outdated
Comment thread lucebox/src/lucebox/cli.py Outdated
Comment thread lucebox/src/lucebox/autotune.py Outdated
Comment thread scripts/test_lucebox_sh.sh Outdated
@davide221

Copy link
Copy Markdown
Contributor

Cross-vendor Lucebox follow-up is in 23a203e.

  • RTX 3090 + Strix: detects both vendors, selects :cuda12, and uses --gpus all.
  • R9700 + Strix: selects :rocm, exposes /dev/kfd + /dev/dri, and chooses the 32 GB R9700 (gfx1201) as the primary tuning device while retaining the Strix (gfx1151) in inventory.
  • Versioned/PR ROCm tags (for example 0.3.0-rocm) also get the ROCm Docker contract.
  • Explicit LUCEBOX_VARIANT / config remains higher priority than auto-selection.

Validation:

  • Python: 95 passed
  • Ruff: pass
  • mypy: pass
  • ShellCheck + wrapper/entrypoint suite on Lucebox5: 57 passed
  • Real Lucebox5 probe: ROCm 7.2.4, R9700 gfx1201 32624 MiB + Strix gfx1151 512 MiB, /dev/kfd and render nodes accessible, :rocm selected

Lucebox5 does not currently have Docker installed, so full image launch there remains untested; no host packages or services were changed. GitHub CUDA/ROCm image builds and the RTX 3090 jobs are running now.

@cubic-dev-ai cubic-dev-ai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

All reported issues were addressed across 11 files (changes from recent commits).

Reply with feedback, questions, or to request a fix.

Re-trigger cubic

Comment thread scripts/test_lucebox_sh.sh
Comment thread lucebox.sh
Comment thread lucebox/src/lucebox/docker_run.py Outdated
@davide221

Copy link
Copy Markdown
Contributor

Final validation for 21206f6:

  • 102 Python tests passed
  • 60 shell/ShellCheck tests passed on Lucebox5
  • Ruff and mypy passed
  • CMake/megakernel build passed
  • Live RTX 3090 GPU test and speed profile passed
  • Live Radeon gfx1151/ROCm GPU test passed
  • CUDA 12 and ROCm images built successfully
  • Cubic automated re-review passed with all reported issues addressed

Heterogeneous appliance behavior:

  • RTX 3090 + Strix selects CUDA and uses the RTX 3090; Strix does not override it.
  • R9700 + Strix selects ROCm, chooses the R9700 as the primary tuning device, and exposes both AMD devices through /dev/kfd and /dev/dri.

Lucebox5 was checked against its real R9700 + Strix hardware and ROCm 7.2.4. Docker is not installed on that host, so a full local container launch was not executed there; real-host detection and launch argument generation were validated, and the ROCm image plus live gfx1151 CI both passed.

All required PR checks are green, and GitHub reports the PR clean and mergeable.

@cubic-dev-ai cubic-dev-ai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

All reported issues were addressed across 20 files (changes from recent commits).

Tip: Review your code locally with the cubic CLI to iterate faster.

Re-trigger cubic

Comment thread lucebox/src/lucebox/docker_run.py Outdated
Comment thread lucebox/src/lucebox/docker_run.py

@cubic-dev-ai cubic-dev-ai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

All reported issues were addressed across 20 files (changes from recent commits).

Tip: Review your code locally with the cubic CLI to iterate faster.

Re-trigger cubic

Comment thread lucebox/tests/test_config_cli.py Outdated
Comment thread install.sh
Comment thread lucebox/src/lucebox/docker_run.py Outdated
Comment thread lucebox/src/lucebox/docker_run.py
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.

2 participants