crucible.cli
1.6.0
dotnet tool install --global crucible.cli --version 1.6.0
dotnet new tool-manifest
dotnet tool install --local crucible.cli --version 1.6.0
#tool dotnet:?package=crucible.cli&version=1.6.0
nuke :add-package crucible.cli --version 1.6.0
Crucible
Static documentation generator that transforms Markdown into HTML through an XML intermediate representation and XSLT 4.0 transformation.
Packages
| Package | Description | Install |
|---|---|---|
| Crucible.Cli | Command-line tool | dotnet tool install -g Crucible.Cli |
| Crucible.Extensions | Extension library (Mermaid diagrams, plugin API) | Library — reference in your project |
Quick start
# Install the CLI
dotnet tool install -g Crucible.Cli
# Create a new docs project
crucible init
# Build the site
crucible build
Features
- Markdown in, HTML out — write docs in Markdown with YAML frontmatter
- XSLT-powered — transforms via the PhoenixmlDb XSLT 4.0 engine
- Client-side search — Lunr.js with pre-built index
- Dark mode — automatic with manual toggle
- SEO — Open Graph, canonical links, sitemap.xml
- Extensible — plugin model for custom Markdown processing
- LLMs.txt — auto-generated site overview for AI consumption
Documentation
Full documentation at phoenixml.dev
License
Apache 2.0
| Product | Versions Compatible and additional computed target framework versions. |
|---|---|
| .NET | net10.0 is compatible. net10.0-android was computed. net10.0-browser was computed. net10.0-ios was computed. net10.0-maccatalyst was computed. net10.0-macos was computed. net10.0-tvos was computed. net10.0-windows was computed. |
This package has no dependencies.
**In-body links and `llms.txt` now use the same URLs as the rest of the site.**
### Fixed
- **In-body `.md` cross-links resolve to the site's URL form.** `[Upload API](../api/upload.md)`
emitted `../api/upload.html`; it now emits `../api/upload`. A link to a directory's
`index.md` collapses to the directory — `guides/index.md` → `guides/` — exactly as nav
links, `canonical`, `og:url`, sitemap `<loc>` and search results already did.
- **`llms.txt` and `llms-full.txt` carry the same URLs.** Every entry had `.html` appended, so
a site's root was advertised as `<base-url>index.html`. It is now `<base-url>`.
1.1.48 introduced `c:page-url` under the heading "URL construction is defined once", and it
was — for the producers written in XSLT, plus `search.js`, which mirrors the rule in
JavaScript. The two written in C# were never brought in, and kept appending `.html` for the
three months since. `Crucible.Core.Urls.PageUrl` is now the C# half of that rule; both call
it, and `PageUrlTests` pins it to the XSLT by text the same way `LinkFormatTests` already
pinned `search.js`.
On a host that serves clean URLs this meant a redirect on every internal prose link and every
`llms.txt` entry. Nothing broke — a 308 resolves, and the canonical page is the one that
indexes — but it spent crawl budget, put a hop on every internal link, and filled Search
Console's "Page with redirect" bucket with duplicates of pages that were already fine.
### Compatibility
Internal link hrefs change shape in built output. Crucible has emitted extensionless nav,
`canonical` and sitemap URLs since 1.1.48, so a host that does not resolve extensionless paths
already served a site whose navigation and canonical tags pointed at 404s; this finishes
applying that requirement rather than adding it. Cloudflare Pages, Netlify, Vercel, GitHub
Pages and S3-with-rewrites are unaffected apart from no longer issuing the redirects.
### Engine
Takes `PhoenixmlDb.Xslt` from 2.6.0 to 2.9.0. The pin had not moved since 2026-10-05 and
`check-pins.sh` had been failing on it; 2.7.0-2.9.0 are schema-awareness work that Crucible,
which validates nothing, does not reach. phoenixml.dev (125 pages, 138 files) and pixault.dev
(36 pages, 45 files) build byte-identically on both engines.
### Verified
The pixault.dev documentation (36 pages) built from identical sources on 1.5.0 and on this
release:
| measure | 1.5.0 | 1.6.0 |
|---|---|---|
| internal `.html` hrefs across all pages | 36 | 0 |
| `.html` URLs in `llms.txt` / `llms-full.txt` | 36 / 36 | 0 / 0 |
| image and script `src` attributes | — | identical, no change |
| distinct URLs produced, fetched against the live site | — | 37 of 37 answer `200`; none redirects |