De-bundle the Claude Code plugin: skills ship from the agent-skills marketplace (LCR-181)#161
Open
cailmdaley wants to merge 23 commits into
Open
De-bundle the Claude Code plugin: skills ship from the agent-skills marketplace (LCR-181)#161cailmdaley wants to merge 23 commits into
cailmdaley wants to merge 23 commits into
Conversation
Deploying with
|
| Status | Name | Latest Commit | Preview URL | Updated (UTC) |
|---|---|---|---|---|
| ✅ Deployment successful! View logs |
lightcone-cli | a8c1094 | Commit Preview URL Branch Preview URL |
Jul 24 2026, 01:39 PM |
✅ Eval Results
Graders✅ spec_valid (1.00) Full output |
The skills, hooks, and the lc-extractor subagent leave this wheel. They ship from the `lightcone` plugin in the `LightconeResearch/agent-skills` marketplace. `lc init` registers that marketplace and enables the plugin; it copies no skills, hooks, or agents itself. - Delete `claude/lightcone/*` (skills, hooks, scripts, agent, templates) and the `docs/skills/*` pages; drop the force-include from packaging. - `lc init` writes `extraKnownMarketplaces` + `enabledPlugins` into `.claude/settings.json` instead of copying a skill tree. - Point every doc and the scaffolded project CLAUDE.md at the new command names: `/lc-new` -> `/lightcone:new`, `/lc-from-code` -> `/lightcone-experimental:from-code`, `/lc-from-paper` -> `/lightcone-experimental:from-paper`, `/lc-cli` -> `/lightcone:cli`, `/astra` -> `/lightcone:astra`. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_011wWf6Bp7bzZ79vwjkAxsFN
cailmdaley
force-pushed
the
cailmdaley/lcr-181-marketplace-skills
branch
from
July 23, 2026 13:20
e98d640 to
9e57d4b
Compare
`lc init` no longer writes a permission policy. Permissions belong to the harness; the CLI must not impose one. Drop the `--permissions` tier flag and the settings it wrote. Documentation keeps an offered-not-imposed "Recommended permissions for cluster work" section: a starting-point `settings.json`, plus the official mode names — Claude Code "accept edits"/Auto, Codex approval policies `untrusted`/`on-request`/`never`. A future best-practices skill may carry it. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_011wWf6Bp7bzZ79vwjkAxsFN
We do not ship a dormant feature. Claude Code only acts on hints that target the official Anthropic marketplace, and `lightcone` is not listed there, so the hint never fired. The discovery story is the `settings.json` trust-prompt (primary) plus the documented `claude plugin install` command. - Delete `emit_plugin_hint()` and its call in the group callback. - Delete the hint test. - Remove the hint paragraph from `architecture.md` and `api/cli.md`. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_011wWf6Bp7bzZ79vwjkAxsFN
`lc init` now converges an ASTRA project onto the lightcone integration. It is safe to run anywhere, any number of times. There is no separate adopt path. - A fresh directory gets the full scaffold: `astra init`, `Containerfile`, `requirements.txt`, `CLAUDE.md`, optional git and venv, plus the integration files. - An existing ASTRA project keeps its spec and scaffold untouched. `lc init` layers on only the missing integration files. The integration files are written idempotently in both cases: `.lightcone/` state, `results/`, the `.claude/settings.json` marketplace registration (merged non-destructively via `_merge_claude_settings`), and the MyST report. `lc init` reports what it added versus skipped. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_011wWf6Bp7bzZ79vwjkAxsFN
cailmdaley
force-pushed
the
cailmdaley/lcr-181-marketplace-skills
branch
2 times, most recently
from
July 23, 2026 13:31
266d61d to
dba04cf
Compare
`astra` is a project-scoped command, not a global export of this wheel. astra- tools stays a library dependency of lightcone-cli (`lc init` imports `astra.cli`), but the `astra` executable belongs to the project's venv. `lc init`'s venv step now also installs astra-tools (the new `ASTRA_TOOLS_REQUIREMENT` constant) into the project `.venv`, so `.venv/bin/astra` exists. The plugin's activate-venv SessionStart hook prepends `.venv/bin` to PATH, so an `astra` invoked inside the project resolves to that copy. The install is best-effort: on failure `lc init` warns and continues rather than failing the scaffold. The install happens only in the venv-creation path, which runs for fresh scaffolds. `lc init` does not create a venv it did not create, so converging an existing project that already has a `.venv` without astra-tools does not retrofit it — install by hand there. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_011wWf6Bp7bzZ79vwjkAxsFN
cailmdaley
force-pushed
the
cailmdaley/lcr-181-marketplace-skills
branch
3 times, most recently
from
July 23, 2026 14:37
9036131 to
80e9e03
Compare
`lc init` now registers the `lightcone` plugin with Codex too, so both harnesses reach parity. The two mechanisms differ because the harnesses differ: - Claude Code — per-project and declarative. `lc init` merges the marketplace registration into `.claude/settings.json`; Claude Code offers the plugin on folder trust. - Codex — global and imperative. Codex has no project-scoped plugin config yet (openai/codex#18115), so `_register_codex_plugin` shells out to `codex plugin marketplace add` then `codex plugin add`. The registration is user-scoped (applies to every project). Both commands are idempotent, so a convergent re-run of `lc init` is a no-op. Codex wiring is best-effort and harness-optional: absent `codex` skips silently; a failed command warns and continues rather than failing init. A project-scoped Codex config file is deliberately not written — none is honored today, and dead machinery is what this redesign removes. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_011wWf6Bp7bzZ79vwjkAxsFN
Document how a new user installs the toolchain and how the parts upgrade. - Add `docs/user/upgrading.md`. Two artifacts, two versions: the marketplace ships the plugin, uv ships the CLI. Compatibility is carried by versioning — a CLI change that alters the plugin contract bumps the plugin version; there is no runtime handshake. A section notes the project-scoped `astra` (pinned per-project in the venv). An "Open questions" note records what is still unsettled, including the version scheme. - `install.md`: one global command, `lc`. `astra` is project-scoped — `lc init` installs astra-tools into the project venv, resolved via the activation hook; a bare terminal outside a project can `uv tool install astra-tools`. - `troubleshooting.md`: `lc init` is convergent, so the deleted-settings and outside-a-project notes point at re-running it. - Wire the upgrade page into the User Guide nav. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_011wWf6Bp7bzZ79vwjkAxsFN
The docs read as Claude-Code-only. lightcone-cli supports any agent harness (Claude Code, Codex, opencode), so generic prose now says "the agent" / "your harness" / "agent skills" / "the plugin". Harness-specific mechanics stay, but only in clearly-labeled blocks — ideally paired across harnesses. - Generic vocabulary across CLAUDE.md, README, architecture.md, cli/index.md, cli/init.md, maintainer.md, agent-workflow.md, getting-started.md, glossary.md, index.md, install.md, troubleshooting.md, upgrading.md. - Rename architecture.md "Claude Code plugin" -> "The agent plugin"; label the settings.json block as the Claude example. - getting-started.md follows install.md's shape: generic headings, Claude specifics in labeled blocks. - Fix stale claims: install.md "currently supporting Claude Code" -> "Claude Code, Codex, and opencode"; index.md "Claude Code for now" -> "Claude Code and Codex". `lc init` wires both harnesses (see the Codex commit), and the docs say so: Claude registration is per-project and declarative (`.claude/settings.json`, offer-on-trust); Codex registration is global and imperative (the `codex plugin` CLI), because Codex has no project-scoped plugin config yet (openai/codex#18115). The by-hand commands stay documented as a fallback. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_011wWf6Bp7bzZ79vwjkAxsFN
cailmdaley
force-pushed
the
cailmdaley/lcr-181-marketplace-skills
branch
from
July 23, 2026 14:39
80e9e03 to
c33648f
Compare
The CLI and plugin install globally, once — not per project. `lc init` no longer writes the marketplace source into a project's `.claude/settings.json`. Instead it registers the agent-skills marketplace globally with each harness on PATH, mirroring the Codex path: - Claude Code: `_register_claude_marketplace` shells out to `claude plugin marketplace add` (best-effort; skip when `claude` is absent, warn-and-continue on failure). Marketplaces are user-scoped, so this registers once for every project. The plugin is NOT installed at user scope. - Per project, `_merge_claude_settings` writes only `enabledPlugins["lightcone@lightcone-research"] = true` — activation, no source, no version. This is what keeps the plugin active only in lc-init'd folders the harness trusts. - Codex is unchanged (openai/codex#18115 keeps project scoping impossible); both harnesses now share `_marketplace_arg`. Tests: settings.json carries only `enabledPlugins`; add a Claude registration pair mirroring the Codex tests; the autouse fixture now stubs both `claude` and `codex` off PATH so the suite never mutates real harness config. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01BQsFRKkQYqWRsJRh7TNMaT
Describe the install as it now works: the CLI and plugin install globally,
once. `lc init` registers the agent-skills marketplace globally with each
harness on PATH, then activates the plugin per project. For Claude Code that is
a global `claude plugin marketplace add` plus `enabledPlugins` in the project's
`.claude/settings.json` (activation only — no marketplace source, no version).
- README, CLAUDE.md, docs/architecture.md (settings.json JSON block + scope
table), docs/api/cli.md, docs/user/{install,getting-started,troubleshooting},
docs/cli/init.md, docs/skills/index.md, docs/maintainer.md — harness-agnostic
tone, Claude/Codex specifics only where the mechanics differ.
- docs/user/upgrading.md — retract the per-project "pin at lc init" option from
the version-scheme open question: the plugin installs globally, so a project
cannot pin its own plugin version. The scheme question stays open otherwise.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01BQsFRKkQYqWRsJRh7TNMaT
cailmdaley
force-pushed
the
cailmdaley/lcr-181-marketplace-skills
branch
from
July 23, 2026 20:04
c33648f to
1898b26
Compare
`lc` installs globally, once per machine (`uv tool install lightcone-cli`), never into the project venv. This kills the global-vs-venv-vs-container version skew. The project venv now carries only `astra` (astra-tools); the plugin's activate-venv hook prepends `.venv/bin` so `astra` resolves project-locally while `lc` stays global. - `_init_git_and_venv`: create the venv, install astra-tools, no lightcone-cli. - Tests assert the venv install list excludes lightcone-cli, includes astra-tools. - Docs: state the global-lc / project-astra model plainly (cluster, skills). Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01BQsFRKkQYqWRsJRh7TNMaT
cailmdaley
force-pushed
the
cailmdaley/lcr-181-marketplace-skills
branch
from
July 23, 2026 22:57
1898b26 to
f26d85b
Compare
`astra` follows `lc`: both install globally from the one lightcone-cli wheel (astra-tools is a dependency), so a single `uv tool install` exposes both entry points with no version skew. `lc init` therefore stops creating a project `.venv` and stops installing astra-tools into it. - Remove venv creation, `_install_astra_tools`, the `--no-venv` flag, and the now-unused `ASTRA_TOOLS_REQUIREMENT` from `lc init`; `_init_git_and_venv` becomes `_init_git`. Rewrite the header design comment to the global model: lc + astra global from the wheel, analysis deps flow requirements.txt → container, no project venv. Per-project spec-exact astra is a per-call `uvx --from astra-tools==X --with astra-spec==Y astra`. - eval sandbox: drop `--no-venv` from its `lc init` invocation. - Tests: assert `lc init` creates no `.venv` and pip-installs nothing, and that the `--no-venv` flag is gone. - Docs sweep: install, upgrading, cluster, getting-started, cli/init, cli/index, skills/index, architecture, contributing/testing updated to the global model; drop the obsolete "activation hook prepends .venv/bin to PATH" claim. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01BQsFRKkQYqWRsJRh7TNMaT
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01BQsFRKkQYqWRsJRh7TNMaT
cailmdaley
force-pushed
the
cailmdaley/lcr-181-marketplace-skills
branch
from
July 23, 2026 23:46
f26d85b to
ab2227f
Compare
…-181) Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01BQsFRKkQYqWRsJRh7TNMaT
lc init still creates the project .venv (uv venv, falling back to python -m venv) but installs nothing into it — it's the analysis environment the agent populates later, not a copy of lc/astra. Both tools remain global-only installs. Brings back --no-venv to skip venv creation for fresh scaffolds. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01TvoFZAuwRchz4vW6u7TGob
lc init creates the project .venv (uv venv, falling back to python -m venv) but installs nothing into it -- lc and astra stay global-only, and requirements.txt only feeds the container build. Several docs still claimed lc init creates no venv at all, an intermediate state that predates 9592432. Fixes docs/cli/init.md, docs/user/install.md, docs/user/upgrading.md, docs/user/getting-started.md. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01TvoFZAuwRchz4vW6u7TGob
_init_git_and_venv already skipped git init when .git existed but ran venv creation unconditionally, silently overwriting a .venv a caller had already populated. Mirror the git guard: skip and report when .venv exists, and add a test pinning the behavior. Also fixes a typo in the astra-tools DOGFOOD PIN comment (restore target was >0.2.11, should be >0.2.10 -- matches the pre-pin version). Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01TvoFZAuwRchz4vW6u7TGob
…nch as interim The DOGFOOD commit (ab2227f) conflated two pins with different lifetimes. astra-tools 0.2.11 released to PyPI 2026-07-23, so the git direct reference and its allow-direct-references escape hatch go; the dependency is now a plain >=0.2.11. The marketplace branch ref is not dogfood debris — it correctly tracks agent-skills#15 until that PR merges — so it stays, relabeled INTERIM, with one flip-to-default commit owed at merge time. Also: registration messages now say 'registration ensured (idempotent)' instead of 'Registered', so convergent re-runs read as what they are. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01TvoFZAuwRchz4vW6u7TGob
…es on both paths A cloned lc project converged with lc init previously got no venv (venv creation was fresh-scaffold-only), leaving the plugin's activate-venv hook a silent no-op on that checkout. The venv is per-checkout state every checkout needs, so it now runs on both init paths, still guarded on .venv existing. git stays fresh-only: a clone brings its own .git, and an adopted project's git status is its owner's business. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01TvoFZAuwRchz4vW6u7TGob
…ing (LCR-181) Replaces the fresh/existing split (_scaffold_fresh_project vs _layer_integration) with a single rule applied to every artifact: present, skip; missing, add. Only astra.yaml keeps special handling — astra init scaffolds it once and the container repoint happens only on that write; everything else (Containerfile, requirements.txt, CLAUDE.md, .gitignore lightcone block, git init) now converges on both a from-scratch run and adoption of an existing ASTRA project. .gitignore append is now idempotent by content (checks for a marker line) instead of a fragile full-string match. Reverts the "registration ensured (idempotent)" wording from 8bda862 back to the plain "Registered..." messages. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01TvoFZAuwRchz4vW6u7TGob
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01TvoFZAuwRchz4vW6u7TGob
The lightcone CLI-compat hooks (venv activation, lc version range, .lightcone gate) were split out of agent-skills#15 into the stacked agent-skills#17. The marketplace default branch carries the content this CLI pairs with only when #17 merges, so the flip-to-default commit waits for #17. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01TvoFZAuwRchz4vW6u7TGob
astra init hard-fails on any non-empty directory (dogfood-confirmed), so the convergence design lc init previously implemented — re-running init on an existing directory to add whatever was missing — never actually worked. Rather than work around it or fix it upstream, lc init's scope is cut to new-project scaffolding: it now pre-checks that the target directory is empty, then writes the full scaffold in one linear pass with no exists/skip bookkeeping. Re-run/adoption support is deferred as an open question rather than solved here. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01TvoFZAuwRchz4vW6u7TGob
cailmdaley
force-pushed
the
cailmdaley/lcr-181-marketplace-skills
branch
from
July 24, 2026 13:38
e3eb405 to
a8c1094
Compare
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Linear: LCR-181 · Design: de-bundling design doc
This PR de-bundles the Claude Code plugin from the wheel. Skills, hooks, and the
lc-extractoragent now ship from theagent-skillsmarketplace. The CLI keeps the commands, the scaffold, and the compatibility surface the plugin talks to.The install path
The CLI and the plugin are installed globally, once. Projects only activate.
uv tool install lightcone-cliinstalls one global command:lc.lc initregisters the agent-skills marketplace globally with each harness on the PATH:claude plugin marketplace addfor Claude Code,codex plugin marketplace add+codex plugin addfor Codex. Registration is idempotent and best-effort; a missing harness is skipped silently.Activation is per project.
lc initwrites one key into.claude/settings.json:enabledPlugins. The plugin loads only inlc initdirectories, on folder trust. The key carries no version and no marketplace source. Codex has no project-scoped plugin config yet (openai/codex#18115), so its plugin stays globally active.astrais global too. The lightcone-cli wheel exposes both commands, so oneuv tool installyields onelcand oneastraper machine — no version skew between them.lc initstill creates the project venv, but empty — it installs nothing into it. The venv is the project's analysis environment: the plugin's session-start hook activates it, so packages the agent installs land there. Containerized analysis dependencies flow throughrequirements.txtinto the container. When an analysis needs validation against its exact declared spec version,uvx --from astra-tools==X --with astra-spec==Y astragives a spec-matched toolchain per invocation.lc initscaffolds new projects only: the target directory must be empty or nonexistent, checked before any file is written. Re-running init and adopting an existing ASTRA project are unsupported —astra inithard-fails on non-empty directories, so a convergent init needs an upstream astra-tools change first (design doc, Open Questions).The upgrade model
Two artifacts carry two versions:
There is one plugin install per machine, so there is one plugin version per machine. When a CLI change alters the plugin contract, the plugin version bumps with it.
Compatibility enforcement lives on the plugin side, not in this PR. The plugin manifest will declare a compatible
lcversion range. A harness-agnostic session-start hook will check it againstlc version. That work ships from the agent-skills repo (astra plugin: agent-skills#15; the lc-paired compat hooks: stacked agent-skills#17 / LCR-189). Until it lands, the version numbers alone carry the contract. There is no handshake command in the CLI.Permissions
lc initno longer writes a permission policy. The permission-tier mechanism is removed; the harness owns the trust level. The docs now recommend the harness-native modes: Claude Code's accept-edits and Auto modes, Codex's "Approve for me" (a.k.a. Auto-review). A future best-practices skill could carry this guidance.Open questions
extraKnownMarketplaceskey in its.claude/settings.json; leaving it is intentional — cleanup belongs to the migration PR.lcversion range (minimum, possibly maximum), checked by a session-start hook. The exact scheme is still open. Opinions welcome.Testing
Full test suite green (344 tests, ruff, mypy).
Merge checklist
astra-tools pin— astra-tools 0.2.11 is on PyPI (released 2026-07-23); the git direct reference is gone and the dependency is a plain>=0.2.11(8bda862).MARKETPLACE_BRANCHincli/commands.pyand the@astra-plugin-reworksuffix ineval/sandbox.pytrack the agent-skills PR branch on purpose (INTERIM comments mark both). One small commit drops them at merge time.v0.4.0. The agent-skills plugin declares0.4.0 ≤ lc < 0.5.0with 0.4.0 = first de-bundled release. Version is VCS-derived; without the tag every session warns on version skew.