Skip to content

Rename Prism → lightcone-cli; executable lc; lightcone.* namespace#70

Merged
EiffL merged 1 commit into
mainfrom
rename
Apr 21, 2026
Merged

Rename Prism → lightcone-cli; executable lc; lightcone.* namespace#70
EiffL merged 1 commit into
mainfrom
rename

Conversation

@EiffL
Copy link
Copy Markdown
Member

@EiffL EiffL commented Apr 21, 2026

Summary

  • Renames the PyPI distribution from lightcone-prism to lightcone-cli and the executable from prism to lc.
  • Reorganises the Python source into PEP 420 namespace packages under lightcone.* so future sibling packages (e.g. lightcone-ui) can contribute to the same namespace without coordination. src/lightcone/ has no __init__.py.
  • Splits execution logic (lightcone.engine) from the Click surface (lightcone.cli) so a future carve-out to a separate lightcone-engine distribution is a packaging change, not a rewrite. Engine imports nothing from cli or eval.

Layout

src/lightcone/             # namespace — NO __init__.py
├── cli/
│   ├── __init__.py        # exposes main() and __version__
│   ├── commands.py        # ← from src/prism/cli.py
│   ├── plugin.py          # NEW leaf module: get_plugin_source_dir()
│   └── claude/            # force-included plugin bundle (wheel only)
├── engine/                # ← from src/prism/container.py + src/prism/dagster/* (flat)
│   ├── assets.py, container.py, io_manager.py, runner.py,
│   └── site_registry.py, status.py, targets.py, tree.py
└── eval/                  # ← from src/prism/eval/

claude/lightcone/          # skills/agent/scripts renamed to lc-*

User-facing changes

Before After
pip install lightcone-prism pip install lightcone-cli
prism executable lc executable
~/.prism/, .prism/ ~/.lightcone/, .lightcone/
prism.yaml project config lightcone.yaml
prism-{name}-{hash} container tags lc-{name}-{hash}
/prism-new, /prism-build, … /lc-new, /lc-build, …
PRISM_EVAL_* env vars LIGHTCONE_EVAL_*

Breaking change with no migration shim — existing users reconfigure via lc setup.

Import-cycle avoidance

lightcone.eval.sandbox needs plugin discovery; lightcone.cli.commands registers eval_group as a subcommand. To keep both import paths acyclic, plugin discovery lives in a standalone leaf module lightcone.cli.plugin that imports nothing from commands.py.

Follow-ups (not in this PR)

  • Rename the GitHub repo from Prism to lightcone-cli. GitHub auto-redirects old URLs, but this PR already updates badges and links.
  • The Langfuse telemetry hostname (prism-telemetry.lightconeresearch.workers.dev) is left unchanged — it's an external deployed service URL. Ops can cut over separately.

Test plan

  • uv sync --all-groups regenerates uv.lock
  • uv run ruff check src/ tests/ — clean
  • uv run pytest tests/312 passed
  • uv run mypy src/ — same 28 pre-existing errors as on main (none introduced by rename)
  • uv run zensical build — docs build succeeds
  • uv build — wheel ships lightcone/{cli,engine,eval}/ with plugin bundle at lightcone/cli/claude/lightcone/ and no lightcone/__init__.py (PEP 420 preserved)
  • uv run lc --version and uv run lc --help — both work
  • import lightcone.engine succeeds without importing lightcone.cli (proves the split is real)

🤖 Generated with Claude Code

Closes LCR-79

Renames the PyPI distribution from lightcone-prism to lightcone-cli
and the executable from `prism` to `lc`. Reorganises the Python source
into PEP 420 namespace packages under `lightcone.*` so future sibling
packages (e.g. lightcone-ui) can contribute to the same namespace
without coordination.

Layout changes:
- src/prism/cli.py → src/lightcone/cli/commands.py
- src/prism/container.py + src/prism/dagster/* → src/lightcone/engine/
  (flat; no nested dagster/ subdir)
- src/prism/eval/ → src/lightcone/eval/ (top-level peer of cli/engine)
- claude/prism/ → claude/lightcone/; skills/agent renamed to lc-*

The engine sub-package has zero imports from cli or eval, so a future
carve-out to a separate lightcone-engine distribution is a packaging
change, not a rewrite. Plugin discovery (`get_plugin_source_dir`) is
extracted to a standalone leaf module `lightcone.cli.plugin` to avoid
a cli↔eval import cycle.

User-facing changes:
- pip install lightcone-cli (was lightcone-prism)
- `lc` executable (was `prism`)
- Config at ~/.lightcone/ (was ~/.prism/); project at .lightcone/
- Project config file lightcone.yaml (was prism.yaml)
- Container image tags lc-{name}-{hash} (was prism-{name}-{hash})
- Skills: /lc-new, /lc-build, /lc-verify, /lc-migrate, /lc-feedback
- Env vars LIGHTCONE_EVAL_* (was PRISM_EVAL_*)

Breaking change with no migration shim: existing users reconfigure via
`lc setup`. The Langfuse telemetry hostname is unchanged — it's an
external deployed service URL.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
@linear
Copy link
Copy Markdown

linear Bot commented Apr 21, 2026

LCR-79 Rename Prism codebase (name conflicts with OpenAI's Prism)

The name "Prism" collides heavily with other projects — most relevantly OpenAI's Prism — which makes search, announcement, and branding all harder. Must be renamed before launch, ideally by end of this week.

Current state

  • PyPI package already published as lightcone-prism (PR Publish as lightcone-prism on PyPI #62 merged, prism run --version reports the new package name).
  • Repo is still LightconeResearch/Prism, CLI binary is still prism, imports are still prism.*, docs/README still say "Prism."

Scope of the rename

  • New name (TBD — needs a decision before we can proceed).
  • GitHub repo rename (LightconeResearch/Prism → new name). Set up redirects so existing clones keep working.
  • CLI binary rename (prism → new). Consider a transitional alias for beta users.
  • Python package/import rename (src/prism/src/<new>/). Update pyproject.toml, entry points.
  • All docs, README, skills (.claude/agents/prism-*, .claude/skills/prism-*), slash commands (/prism-*), telemetry repo reference, Notion references.
  • Cross-repo references: astra-tools docs, astra-spec docs, Prism-UI, Prism-Telemetry.
  • External: PyPI package (lightcone-prism already taken, new name TBD), announcement posts.

Blocker

Need a new name. Quick sync to pick one before this can start.

Why urgent

Launch is May 13. Every day spent on the wrong name compounds rename work and risks leakage of the old name in press/external writeups.

@github-actions
Copy link
Copy Markdown

✅ Eval Results

Metric Value
Score 1.00
Build complete
Cost $0.89
Turns 43
Duration 267s
lightcone-cli 0.1.dev1+g64a910a3b (64a910a3)
Results Download

Graders

✅ spec_valid (1.00)
✅ all_materialized (1.00)

Full output
bd9e-01984ef8f094/files/bulk-upload "HTTP/1.1 200 OK"
15:50:09 httpx HTTP Request: POST https://proxy.app.daytona.io/toolbox/3b792f16-a316-4ab2-bd9e-01984ef8f094/files/bulk-upload "HTTP/1.1 200 OK"
15:50:09 httpx HTTP Request: POST https://proxy.app.daytona.io/toolbox/3b792f16-a316-4ab2-bd9e-01984ef8f094/files/bulk-upload "HTTP/1.1 200 OK"
15:50:10 httpx HTTP Request: POST https://proxy.app.daytona.io/toolbox/3b792f16-a316-4ab2-bd9e-01984ef8f094/files/bulk-upload "HTTP/1.1 200 OK"
15:50:10 httpx HTTP Request: POST https://proxy.app.daytona.io/toolbox/3b792f16-a316-4ab2-bd9e-01984ef8f094/files/bulk-upload "HTTP/1.1 200 OK"
15:50:10 httpx HTTP Request: POST https://proxy.app.daytona.io/toolbox/3b792f16-a316-4ab2-bd9e-01984ef8f094/files/bulk-upload "HTTP/1.1 200 OK"
15:50:10 httpx HTTP Request: POST https://proxy.app.daytona.io/toolbox/3b792f16-a316-4ab2-bd9e-01984ef8f094/files/bulk-upload "HTTP/1.1 200 OK"
15:50:11 httpx HTTP Request: POST https://proxy.app.daytona.io/toolbox/3b792f16-a316-4ab2-bd9e-01984ef8f094/files/bulk-upload "HTTP/1.1 200 OK"
15:50:11 httpx HTTP Request: POST https://proxy.app.daytona.io/toolbox/3b792f16-a316-4ab2-bd9e-01984ef8f094/files/bulk-upload "HTTP/1.1 200 OK"
15:50:12 httpx HTTP Request: POST https://proxy.app.daytona.io/toolbox/3b792f16-a316-4ab2-bd9e-01984ef8f094/files/bulk-upload "HTTP/1.1 200 OK"
15:50:12 httpx HTTP Request: POST https://proxy.app.daytona.io/toolbox/3b792f16-a316-4ab2-bd9e-01984ef8f094/files/bulk-upload "HTTP/1.1 200 OK"
15:50:12 httpx HTTP Request: POST https://proxy.app.daytona.io/toolbox/3b792f16-a316-4ab2-bd9e-01984ef8f094/files/bulk-upload "HTTP/1.1 200 OK"
15:50:12 httpx HTTP Request: POST https://proxy.app.daytona.io/toolbox/3b792f16-a316-4ab2-bd9e-01984ef8f094/files/bulk-upload "HTTP/1.1 200 OK"
15:50:13 httpx HTTP Request: POST https://proxy.app.daytona.io/toolbox/3b792f16-a316-4ab2-bd9e-01984ef8f094/files/bulk-upload "HTTP/1.1 200 OK"
15:50:13 httpx HTTP Request: POST https://proxy.app.daytona.io/toolbox/3b792f16-a316-4ab2-bd9e-01984ef8f094/files/bulk-upload "HTTP/1.1 200 OK"
15:50:13 httpx HTTP Request: POST https://proxy.app.daytona.io/toolbox/3b792f16-a316-4ab2-bd9e-01984ef8f094/files/bulk-upload "HTTP/1.1 200 OK"
15:50:13 httpx HTTP Request: POST https://proxy.app.daytona.io/toolbox/3b792f16-a316-4ab2-bd9e-01984ef8f094/files/bulk-upload "HTTP/1.1 200 OK"
15:54:43 lightcone.eval.sandbox Deleted sandbox for trial build-snae-0
  snae trial 0: score=1.00 complete

lightcone-cli: 0.1.dev1+g64a910a3b (HEAD 64a910a3)

  Eval Results: Scores  
┏━━━━━━┳━━━━━━━━━━━━━━━┓
┃ Task ┃     Score     ┃
┡━━━━━━╇━━━━━━━━━━━━━━━┩
│ snae │ 1.00 +/- 0.00 │
│      │ pass@k: 100%  │
└──────┴───────────────┘

   Eval Results: Cost &   
         Duration         
┏━━━━━━┳━━━━━━━━━━━━━━━━━┓
┃ Task ┃ Cost / Duration ┃
┡━━━━━━╇━━━━━━━━━━━━━━━━━┩
│ snae │      $0.89      │
│      │      266s       │
└──────┴─────────────────┘

Total: 1 trials, $0.89, 266s

Results saved to: eval-results/build-64a910a3/results.json

@EiffL EiffL requested a review from aboucaud April 21, 2026 15:59
@EiffL
Copy link
Copy Markdown
Member Author

EiffL commented Apr 21, 2026

@claude can you review this PR and make sure the documentation and everything was correctly updated to the new structure of the code, and that almost no references to prism are left.

@claude
Copy link
Copy Markdown

claude Bot commented Apr 21, 2026

Claude finished @EiffL's task in 3m 59s —— View job


PR Review: Rename Prism → lightcone-cli

Tasks:

  • Gather context and understand request
  • Scan for remaining "prism" references in source code
  • Check documentation files
  • Check configuration files (pyproject.toml, CI workflows)
  • Check test files
  • Check Claude plugin files (skills, scripts, hooks)
  • Review structural changes (namespace packages, module splits)
  • Summarize findings

Verdict: ✅ Rename is thorough and correct

Running git grep -i "prism" HEAD across all tracked files finds exactly 2 remaining occurrences, both the same intentional URL:

docs/telemetry/index.md:37:    "LANGFUSE_HOST": "https://prism-telemetry.lightconeresearch.workers.dev"
src/lightcone/cli/commands.py:1022:            "LANGFUSE_HOST": "https://prism-telemetry.lightconeresearch.workers.dev",

This matches the PR description exactly — the external Cloudflare Worker relay URL is left unchanged pending an ops cut-over. Everything else has been renamed.


What was checked

Source code (src/lightcone/)

  • All Python imports updated to lightcone.* namespace
  • Config paths updated: ~/.lightcone/, .lightcone/lightcone.yaml
  • Container tag prefix updated to lc-{name}-{hash} (engine/container.py:95)
  • Environment variables updated to LIGHTCONE_EVAL_*
  • Namespace package correctly implemented: src/lightcone/ has no __init__.py (PEP 420 compliant)

Packaging (pyproject.toml)

  • Package name: lightcone-cli
  • Entry point: lc = "lightcone.cli:main"
  • Wheel force-include: "claude/lightcone" = "lightcone/cli/claude/lightcone" ✅ (matches the path plugin.py looks for: package_dir / "claude" / "lightcone")

Claude plugin (claude/lightcone/)

  • Old claude/prism/ completely removed ✅
  • All 5 skills renamed: lc-new, lc-build, lc-verify, lc-migrate, lc-feedback
  • Scripts use lc throughout, reference ~/.lightcone/config.yaml
  • Template CLAUDE.md references .lightcone/, lightcone.yaml, lc run

Documentation

  • zensical.toml: site name, repo URL all updated ✅
  • All docs/**/*.md files updated (CLI reference, API docs, HPC, skills, telemetry) ✅
  • claude/lightcone/guides/lightcone-cli-reference.md replaces deleted prism-reference.md

CI / GitHub workflows

  • pypi-publish.yaml: updated to lightcone-cli
  • eval.yml: references lightcone-cli
  • README badges point to LightconeResearch/lightcone-cli (which will work once the repo is renamed — GitHub redirects old URLs in the meantime) ✅

Minor observations (non-blocking)

  1. plugin.py parent traversal comment (plugin.py:28): The comment says parents[2] == <repo> — this is correct (src/lightcone/clisrc/lightconesrc → repo root), but worth double-checking if the package is ever installed in an unusual layout.

  2. Wheel namespace package: packages = ["src/lightcone"] with no __init__.py relies on hatchling correctly producing a PEP 420 namespace wheel. The PR author confirmed this works via uv build, and the test suite passes, so this is fine.

  3. CLAUDE.md appears modified locally in the working tree (git status shows M CLAUDE.md) — the committed version is correctly updated, so this is a local harness artifact, not a PR issue.


Overall: The rename is complete and consistent. The only "prism" string remaining in committed code is the intentional external service URL, documented as a follow-up ops task. Safe to merge.

@EiffL EiffL merged commit eddce8b into main Apr 21, 2026
5 of 6 checks passed
EiffL added a commit that referenced this pull request Apr 21, 2026
Resolves conflicts from the Prism → lightcone-cli rename (#70):
- Updated remaining `prism.dagster.*` imports to `lightcone.engine.*` in
  QoS/target code brought in from this branch.
- Rewrote user-facing `prism target …` help text and messages to use
  `lc target …`.
- Migrated `~/.prism/cache/` → `~/.lightcone/cache/`.
- Kept HEAD's QoS-per-constraint design (no account-suffix resolution)
  and HEAD's `shlex.quote(project_root)` in the sbatch script, while
  picking up main's lightcone-cli rename of the comment header.
- Moved src/prism/dagster/slurm_info.py → src/lightcone/engine/slurm_info.py.
- Added the missing module-level logger in commands.py that the branch's
  `_discover_qos_suggestions` was already using.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
EiffL added a commit that referenced this pull request Apr 21, 2026
Preserves the branch's original authorship (Kangning's commits remain in
the first-parent history) while discarding its file contents. The feature
work (intent-based targets with dynamic SLURM discovery) is reapplied in
subsequent commits against the new lightcone-cli / lightcone.* namespace
introduced by #70.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
EiffL added a commit that referenced this pull request Apr 21, 2026
Reapplies the target-enhancement work from the original PR on top of the
lightcone-cli/lightcone.* namespace introduced by #70. Tree-content
equivalent to the pre-rename branch at a924114, translated to the new
package layout and executable name (`lc`).

What this adds:

* `lightcone.engine.slurm_info` — queries sacctmgr/scontrol/sinfo to
  discover QoS, resource limits, partitions, and the user's associations.
  Results cached to `~/.lightcone/cache/<target>.cluster.yaml`.
* Targets redesigned: a target now carries `defaults`, a `qos` list of
  `(name, constraint, slurm_qos, use_for)` entries, and `resource_limits`.
  Old flat-schema targets auto-migrate on first load.
* `lc target add-qos | edit-qos | remove-qos | set-default-qos | refresh`
  subcommands for managing a target's queues without editing YAML.
* `lc run` gains `--qos`, `--constraint`, `--time-limit`, `--account`,
  `--partition`, `--strategy {fit,switch}`. `fit` keeps the current QoS
  and reduces resources to stay within its limits; `switch` keeps
  resources and picks a different eligible QoS.
* Runner validates requested resources against the cached QoS limits and
  applies the chosen strategy before sbatch submission. Auto-refreshes
  the cluster cache after target creation.
* `site_registry` switches from node_types/qos_options to
  constraint_guidance/suggested_qos, and drops the
  account_suffixes/resolve_account mechanism (base QoS names are used
  directly with --constraint).
* Setup wizard prompts for default QoS on known clusters and discovers
  QoS on unknown ones.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
@aboucaud aboucaud deleted the rename branch May 8, 2026 10:46
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