llmsx
A CLI and an optional Textual TUI over the llms-explorer concept tree and llms-concept-abstractor concept packs, plus a thin invocation layer over the Claude skills SDK.
Scope, precisely. llmsx tree … and llmsx concepts list/show/serve are
read-only and install with zero third-party dependencies. llmsx tui and
llmsx concepts tui need the tui extra; the concept-pack TUI's "edit"
action opens $EDITOR on a pack file, which is a write. llmsx family and
llmsx optimize need the skills extra and make an outbound network call to
a model provider — see "Running a skill" below for exactly what that call
does and does not do.
Install
pip install llmsx # tree + concepts list/show/serve only
pip install 'llmsx[tui]' # + the Textual browsers
pip install 'llmsx[skills]' # + `llmsx family` / `llmsx optimize`
Browsing the concept tree (llmsx tree)
llmsx tree show # indented tree, frontier marked ·
llmsx tree show "LLMs.txt" --depth 2
llmsx tree detail <slug> # one node's fields
llmsx tree search caching # concept + alias substring
llmsx tree frontier [slug] # named but never researched
llmsx tui # the Textual tree browser (pip install 'llmsx[tui]')
Data comes from the site's generated site/src/data/tree.json
(site/tools/gen_tree.py). Override with --data <path> or $LLMSX_TREE.
A future release may add --api <url> serving the same shape from a live
service instead of a checked-out file.
Concept packs (llmsx concepts)
A different data model from the tree above: a concept pack is a directory
<slug>.llms/ built by the llms-concept-abstractor skill (/lca) or
llms-deep-optimizer --family (/ldo), each with its own manifest.json,
concept-graph.json and llms-family markdown files.
llmsx concepts list # catalog every pack — summary, useful_for, related terms
llmsx concepts list --query caching # substring filter over name/summary/related terms
llmsx concepts show <slug> # one pack's summary, facets, related terms, files
llmsx concepts serve <slug> # llms.txt to stdout — pipeable: > out.md
llmsx concepts serve <slug> --file llms-full.txt
llmsx concepts tui # the Textual concept-pack browser (pip install 'llmsx[tui]')
<slug> may be an exact slug or a case-insensitive substring of the slug or
concept name; an ambiguous substring lists its candidates instead of
guessing. serve --file accepts one of llms.txt, llms-full.txt,
llms-small.txt, llms-facts.txt, llms-vocabulary.txt,
concept-graph.json, manifest.json.
Data comes from ~/.global-ai-hub/llms-concepts by default. Override with
--data <path> (under concepts) or $LLMSX_CONCEPTS_PATH — a different
env var from $LLMSX_TREE above, because it is a different data model. Put
--data after concepts (or its subcommand); a top-level --data before
concepts binds to the tree's flag instead and llmsx refuses to run
rather than silently falling back to the default concept-packs directory.
Development
Install for development from a checkout of this monorepo:
cd llmsx && ../hub/.venv/bin/python -m pip install -e '.[dev]'
Prefer the installed llmsx command. python -m llmsx also works, except from
the directory that contains this project folder (the repo root): there the
llmsx/ directory itself shadows the installed package as a namespace package.
llmsx … and pytest llmsx/tests are unaffected — llmsx/pyproject.toml's
[tool.pytest.ini_options] puts this package's own directory on sys.path
regardless of where pytest is invoked from.
Running a skill (llmsx.skills)
llmsx.skills loads a SKILL.md — this repo's skills/<name>/ or
~/.claude/skills/<name>/ — and runs it against a model.
from llmsx.skills import available_skills, load_skill, run_skill
available_skills() # every skill on the search path
skill = load_skill("notes-to-llms-txt") # SkillNotFoundError lists the paths tried
skill.description, skill.model # frontmatter; `model` is the skill's own default
run = run_skill(skill, "…my messy notes…") # needs pip install 'llmsx[skills]'
run = run_skill(skill, "…", client=my_client) # or inject any transport
print(run.text, run.model, run.usage)
Search order: $LLMSX_SKILL_PATH (os.pathsep-joined) first when set, then
every skills/ directory at or above the current working directory —
nearest first, not just the nearest one — then ~/.claude/skills last. That
matters: it means llmsx family / llmsx optimize, run from inside any
directory that happens to contain a skills/<name>/SKILL.md, will run
that file's instructions rather than a global copy. _run_skill_cli
prints the resolved SKILL.md path to stderr before every call for exactly
this reason — a SKILL.md is not automatically trusted input, and this is
the way to notice a shadowed or planted one before it runs. Pass
include_references=True to append the skill's references/*.md to the
system prompt (bounded — see Skill.read_references's docstring).
client is anything with .messages.create(**kwargs) (the Anthropic SDK
shape) or a plain callable taking the same kwargs — the callable form is how
the tests run offline, and how a caller stubs, records or caches a call
without importing the SDK.
What this is not. A thin invocation layer: one model turn, carrying the
skill's instructions verbatim. The skills themselves describe multi-pass
loops, subagent fan-out, filesystem locks and concept-tree writes — behaviour
belonging to an agent harness with tools. run_skill drives none of it; a
caller who needs the loop drives it. The JS sibling (../llmsx-js) has the
same API and the same boundary.
llmsx family <topic> and llmsx optimize <file-or-text> are thin CLI
wrappers over run_skill for concept-family-explorer and
llms-deep-optimizer respectively (needs pip install 'llmsx[skills]').
Both print a one-line disclaimer to stderr before the model's output: this is
one model turn against the skill's instructions, not its full multi-pass
loop.
The two Textual browsers, and which hub screen each one is (or isn't)
Two different things share the name "Concepts" here, deliberately kept apart:
llmsx tui'sConceptBrowserwalks the SEO research tree (tree.json, above) — aTreewidget, a filterInputwidened to aliases, a detailRichLog, frontier concepts drawn dim italic with a(frontier)label. It has no hub counterpart to port: it is a from-scratch, read-only browser over data this package already owns, with no write path (there is nowhere for it to write to — see "Scope, precisely" above).llmsx concepts tui'sConceptPackBrowseris the actual port of~/.global-ai-hub/scripts/hub_manager/app.py'sTabPane("Concepts": aDataTablelisting concept packs, the same filter-by-slug/name/summary behaviour, a detailRichLogwith summary/facets/related terms/files, and an "edit in$EDITOR" action. Indexing is not ported — it depends ondocset_indexer.py, ChromaDB and an Ollama pool, hub-specific heavy dependencies this package does not carry; the Index button says so.
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file llmsx-0.1.0.tar.gz.
File metadata
- Download URL: llmsx-0.1.0.tar.gz
- Upload date:
- Size: 53.3 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via:
uv/0.12.5 {"installer":{"name":"uv","version":"0.12.5","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"macOS","version":null,"id":null,"libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
45191df7509c7e8b432194ac13592d842535922b8f7fa04061731f20445f98d1
|
|
| MD5 |
08de29360070dc24454153e977b61da4
|
|
| BLAKE2b-256 |
8653bdb9aa98f82e58b905202347d34c556e6a61f9926cd54c035f235d0fca28
|
File details
Details for the file llmsx-0.1.0-py3-none-any.whl.
File metadata
- Download URL: llmsx-0.1.0-py3-none-any.whl
- Upload date:
- Size: 41.2 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via:
uv/0.12.5 {"installer":{"name":"uv","version":"0.12.5","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"macOS","version":null,"id":null,"libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
2afd50f923fb3067be0900d22ac5421d628c2c8064d8b04e00e578f2da597e70
|
|
| MD5 |
1f67d90c8c248b5db7ed3775a2550599
|
|
| BLAKE2b-256 |
8f67574ced977abc67c49623e40880dfdf0e623abe9cb6bde448a2a5e0ddeed1
|