diff --git a/.gitattributes b/.gitattributes
index 8f9bfc8c2..522870b9c 100644
--- a/.gitattributes
+++ b/.gitattributes
@@ -30,6 +30,8 @@ ls/docs/local-context/** export-ignore
ls/logs/ export-ignore
ls/logs/** export-ignore
ls/skills/ls-superpowers/references/upstream/**/UPSTREAM_SKILL.source.md whitespace=-blank-at-eol,-blank-at-eof
+# Preserve the upstream JetBrains SIL OFL file byte-for-byte, including its spaces.
+assets/brand/fonts/OFL.txt whitespace=-blank-at-eol
# Repository release ancestry is not a converted-project policy.
.localsetup-release.json export-ignore
diff --git a/.localsetup-release.json b/.localsetup-release.json
index fa74ecf17..f651105a9 100644
--- a/.localsetup-release.json
+++ b/.localsetup-release.json
@@ -1,9 +1,9 @@
{
"schema_version": 1,
"anchor": {
- "commit": "186ca9ed43e74408f55b3dd5a2b57f6f23a0dc95",
- "version": "4.22.7",
- "tag": "v4.22.7"
+ "commit": "51fbdf7c94f1f6087ecc69a99cf4d037a0c76117",
+ "version": "5.6.2",
+ "tag": "v5.6.2"
},
"overrides": [],
"policy": "sequential-logical-slices"
diff --git a/README.md b/README.md
index b48dd1bfa..91049d427 100644
--- a/README.md
+++ b/README.md
@@ -1,7 +1,11 @@
# LocalSetup
-
+
+
+
+
+
@@ -10,7 +14,7 @@
-**Version:** 5.6.2
+**Version:** 5.7.0
**LocalSetup gives coding agents a repo-local operating layer.**
@@ -21,18 +25,15 @@ LocalSetup provides capability skills, executable workflow packages, explicit ad
Start with the [quickstart](ls/docs/QUICKSTART.md) or browse the [documentation](ls/docs/README.md). The [latest published release](https://github.com/CruxExperts/localsetup/releases/latest) provides release notes and downloads.
-## What's new in 5.6.2
+## What's new in 5.7.0
-LocalSetup 5.6.2 introduces explicit OpenPGP authority and protected key lifecycle operations, authenticated Agent Q transport, and bounded verified file reading in LSCli. The Agent Q registry and SDK file-read response change in this major release; existing identities and historical files require an intentional migration.
+LocalSetup 5.7.0 gives its GitHub documentation a consistent light and dark visual identity. The README hero and current architecture and installation diagrams use the approved LocalSetup palette, mark, and typography while retaining their technical content and accessible descriptions.
-- **OpenPGP identity and recovery:** Inspect and generate profile-bound keys, keep passphrases in ENV or Envman references, create ciphertext-only protected backups, and restore into an isolated private home. Recovery authority is independent of possession of an old operational key.
-- **Authenticated authority transitions:** Candidate and existing owner proofs, publisher rotation, replay protection, scheduled overlap, revocation, and independent recovery use a persistent private authority store. Verification alone does not activate a key.
-- **Sealed Agent Q transport:** File drops and mail carry one opaque signed and encrypted envelope. Inbound processing selects the peer and full fingerprint from private authority before decrypting, records acceptance before queue promotion, and rejects legacy traffic from normal ingest.
-- **Verified file pages:** LSCli and its SDK return bounded JSON pages for granted reads, including sealed ciphertext after verification. Each continuation rechecks source and authority, and disclosure remains an explicit grant.
-- **Installed discovery and workflows:** The runtime reports shipped OpenPGP, reader, Agent Q and workflow contracts from the selected installed release. The lifecycle and compact worker workflows ship as guidance; installation neither generates keys nor enrolls trust.
-- **Release verification:** The signed release path checks committed documentation and version artifacts, runs framework validation, verifies the signed tag and prepares a draft before publication.
+- **Theme-aware graphics:** The README hero, architecture diagram, and installation flow each have light and dark images selected by GitHub's color scheme. Existing light image paths remain valid.
+- **Reproducible brand assets:** The graphics renderer uses approved tokens and pinned JetBrains Mono v2.304 Regular and SemiBold files. The original font license and hashes are recorded with the source.
+- **Asset inventory and brand contract:** Documentation checks recognize images in picture sources, and the brand guide records the visual rules and future AstroSite handoff. Nerd Font glyphs remain an optional site profile.
-See the [5.6.2 release guide](ls/docs/releases/5.6.2.md) for compatibility, updating, and verification.
+See the [5.7.0 release guide](ls/docs/releases/5.7.0.md) for compatibility, updating, and verification.
The [4.4.0 guide](ls/docs/releases/4.4.0.md) remains available as release history.
@@ -56,7 +57,11 @@ That means your agent setup travels with the repo, survives context resets, and
## How it fits together
-
+
+
+
+
+
The registered LocalSetup source checkout is the canonical framework source. The installer resolves configuration, creates the managed package library for skills and workflow packages, attaches only explicitly selected target adapter paths, writes target lock/report metadata under `.localsetup/`, and records an install journal under `.localsetup/install-journal/`. Consuming repos do not receive a copied `ls/` by default.
@@ -79,7 +84,7 @@ Start with the [workflow packages guide](ls/docs/WORKFLOW_PACKAGES.md) for usage
| Fact | Value |
|---|---|
-| Current version | `5.6.2` |
+| Current version | `5.7.0` |
| Supported platforms | `codex, claude-code, cursor, kilo, opencode, openclaw, github-copilot-cli, github-copilot-vscode, cline-cli, cline-vscode, amp-cli, goose-cli, pi-cli, hermes-agent, qwen-code-cli, kimi-cli, factory-droid, antigravity-app, gemini-cli, omp-cli` |
| Shipped skills | `105` |
| Workflow packages | `18` |
@@ -243,7 +248,11 @@ See the generated catalogs for all shipped skills and workflows: [ls/docs/SKILLS
## Install lifecycle
-
+
+
+
+
+
The Bash wrapper stays thin. The Python CLI handles preflight, dependency setup, adapter planning, managed skill installation, verification, generated docs, packaging, and rollback.
diff --git a/VERSION b/VERSION
index d6a86bf43..42cdd0b54 100644
--- a/VERSION
+++ b/VERSION
@@ -1 +1 @@
-5.6.2
+5.7.0
diff --git a/assets/README.md b/assets/README.md
index a274a6492..3d118bc01 100644
--- a/assets/README.md
+++ b/assets/README.md
@@ -4,8 +4,11 @@ This file is maintained by `ls/tools/docs_alignment.py apply --scope assets` and
| Asset | Type | Dimensions | References | Notes |
|---|---|---|---|---|
-| `assets/localsetup-architecture.png` | png | 1536x1024 | `README.md`, `ls/README.md`, `ls/docs/README.md` | Repository license unless otherwise documented |
-| `assets/localsetup-install-lifecycle.png` | png | 1536x1024 | `README.md`, `ls/README.md`, `ls/docs/MULTI_PLATFORM_INSTALL.md` | Repository license unless otherwise documented |
+| `assets/localsetup-architecture-dark.png` | png | 1280x740 | `README.md`, `ls/README.md`, `ls/docs/README.md` | Crux Experts LLC private asset terms; see [visual asset rights](brand/ASSET_LICENSE.md) |
+| `assets/localsetup-architecture.png` | png | 1280x740 | `README.md`, `ls/README.md`, `ls/docs/README.md` | Crux Experts LLC private asset terms; see [visual asset rights](brand/ASSET_LICENSE.md) |
+| `assets/localsetup-install-lifecycle-dark.png` | png | 1280x760 | `README.md`, `ls/README.md`, `ls/docs/MULTI_PLATFORM_INSTALL.md` | Crux Experts LLC private asset terms; see [visual asset rights](brand/ASSET_LICENSE.md) |
+| `assets/localsetup-install-lifecycle.png` | png | 1280x760 | `README.md`, `ls/README.md`, `ls/docs/MULTI_PLATFORM_INSTALL.md` | Crux Experts LLC private asset terms; see [visual asset rights](brand/ASSET_LICENSE.md) |
| `assets/localsetup-logo.png` | png | 1254x1254 | `ls/docs/releases/4.4.0.md` | Repository license unless otherwise documented |
-| `assets/localsetup-readme-hero.png` | png | 1536x1024 | `README.md` | Repository license unless otherwise documented |
+| `assets/localsetup-readme-hero-dark.png` | png | 1280x400 | `README.md` | Crux Experts LLC private asset terms; see [visual asset rights](brand/ASSET_LICENSE.md) |
+| `assets/localsetup-readme-hero.png` | png | 1280x400 | `README.md` | Crux Experts LLC private asset terms; see [visual asset rights](brand/ASSET_LICENSE.md) |
diff --git a/assets/brand/ASSET_LICENSE.md b/assets/brand/ASSET_LICENSE.md
new file mode 100644
index 000000000..005074643
--- /dev/null
+++ b/assets/brand/ASSET_LICENSE.md
@@ -0,0 +1,20 @@
+# Visual asset rights
+
+The six current light and dark README/documentation graphics generated by
+`ls/tools/render_brand_graphics.py` are original LocalSetup visual assets:
+
+Copyright © 2026 Crux Experts LLC
+
+https://www.cruxexperts.com/
+Private asset. Property of Crux Experts LLC. Use, reproduction, modification,
+distribution, or publication without prior written permission is prohibited.
+
+Those terms are embedded in each PNG. The repository's general MIT license does
+not grant rights to these specifically identified visual assets. The historical
+`assets/localsetup-logo.png` retains its existing provenance and treatment.
+
+`assets/brand/fonts/JetBrainsMono-Regular.ttf` and
+`assets/brand/fonts/JetBrainsMono-SemiBold.ttf` are third-party JetBrains Mono
+font software. They retain the JetBrains Mono Project Authors' copyright and
+the [SIL Open Font License 1.1](fonts/OFL.txt). The private visual-asset terms
+above do not apply to these font files.
diff --git a/assets/brand/font-lock.json b/assets/brand/font-lock.json
new file mode 100644
index 000000000..51a2fdefe
--- /dev/null
+++ b/assets/brand/font-lock.json
@@ -0,0 +1,25 @@
+{
+ "schema": "localsetup.brand-font-lock.v1",
+ "family": "JetBrains Mono",
+ "release": "v2.304",
+ "upstream": "https://github.com/JetBrains/JetBrainsMono/releases/tag/v2.304",
+ "release_archive_sha256": "6f6376c6ed2960ea8a963cd7387ec9d76e3f629125bc33d1fdcd7eb7012f7bbf",
+ "files": [
+ {
+ "path": "assets/brand/fonts/JetBrainsMono-Regular.ttf",
+ "weight": 400,
+ "sha256": "a0bf60ef0f83c5ed4d7a75d45838548b1f6873372dfac88f71804491898d138f"
+ },
+ {
+ "path": "assets/brand/fonts/JetBrainsMono-SemiBold.ttf",
+ "weight": 600,
+ "sha256": "1b3bfa1ed5665a4ce3f9feb68d2d4e40e70bf8b4b7d9a3edd418f321b4e166a0"
+ }
+ ],
+ "license": {
+ "path": "assets/brand/fonts/OFL.txt",
+ "sha256": "30f0c136e3c88e422d0791acd97238870f9054a9729bc34cf2ff0d4ed8cac4ad"
+ },
+ "ligatures": false,
+ "third_party_notice": "JetBrains Mono remains subject to the original SIL Open Font License in assets/brand/fonts/OFL.txt."
+}
diff --git a/assets/brand/fonts/JetBrainsMono-Regular.ttf b/assets/brand/fonts/JetBrainsMono-Regular.ttf
new file mode 100644
index 000000000..dff66cc50
Binary files /dev/null and b/assets/brand/fonts/JetBrainsMono-Regular.ttf differ
diff --git a/assets/brand/fonts/JetBrainsMono-SemiBold.ttf b/assets/brand/fonts/JetBrainsMono-SemiBold.ttf
new file mode 100644
index 000000000..a70e69bd2
Binary files /dev/null and b/assets/brand/fonts/JetBrainsMono-SemiBold.ttf differ
diff --git a/assets/brand/fonts/OFL.txt b/assets/brand/fonts/OFL.txt
new file mode 100644
index 000000000..8bee4148c
--- /dev/null
+++ b/assets/brand/fonts/OFL.txt
@@ -0,0 +1,93 @@
+Copyright 2020 The JetBrains Mono Project Authors (https://github.com/JetBrains/JetBrainsMono)
+
+This Font Software is licensed under the SIL Open Font License, Version 1.1.
+This license is copied below, and is also available with a FAQ at:
+https://scripts.sil.org/OFL
+
+
+-----------------------------------------------------------
+SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007
+-----------------------------------------------------------
+
+PREAMBLE
+The goals of the Open Font License (OFL) are to stimulate worldwide
+development of collaborative font projects, to support the font creation
+efforts of academic and linguistic communities, and to provide a free and
+open framework in which fonts may be shared and improved in partnership
+with others.
+
+The OFL allows the licensed fonts to be used, studied, modified and
+redistributed freely as long as they are not sold by themselves. The
+fonts, including any derivative works, can be bundled, embedded,
+redistributed and/or sold with any software provided that any reserved
+names are not used by derivative works. The fonts and derivatives,
+however, cannot be released under any other type of license. The
+requirement for fonts to remain under this license does not apply
+to any document created using the fonts or their derivatives.
+
+DEFINITIONS
+"Font Software" refers to the set of files released by the Copyright
+Holder(s) under this license and clearly marked as such. This may
+include source files, build scripts and documentation.
+
+"Reserved Font Name" refers to any names specified as such after the
+copyright statement(s).
+
+"Original Version" refers to the collection of Font Software components as
+distributed by the Copyright Holder(s).
+
+"Modified Version" refers to any derivative made by adding to, deleting,
+or substituting -- in part or in whole -- any of the components of the
+Original Version, by changing formats or by porting the Font Software to a
+new environment.
+
+"Author" refers to any designer, engineer, programmer, technical
+writer or other person who contributed to the Font Software.
+
+PERMISSION & CONDITIONS
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of the Font Software, to use, study, copy, merge, embed, modify,
+redistribute, and sell modified and unmodified copies of the Font
+Software, subject to the following conditions:
+
+1) Neither the Font Software nor any of its individual components,
+in Original or Modified Versions, may be sold by itself.
+
+2) Original or Modified Versions of the Font Software may be bundled,
+redistributed and/or sold with any software, provided that each copy
+contains the above copyright notice and this license. These can be
+included either as stand-alone text files, human-readable headers or
+in the appropriate machine-readable metadata fields within text or
+binary files as long as those fields can be easily viewed by the user.
+
+3) No Modified Version of the Font Software may use the Reserved Font
+Name(s) unless explicit written permission is granted by the corresponding
+Copyright Holder. This restriction only applies to the primary font name as
+presented to the users.
+
+4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font
+Software shall not be used to promote, endorse or advertise any
+Modified Version, except to acknowledge the contribution(s) of the
+Copyright Holder(s) and the Author(s) or with their explicit written
+permission.
+
+5) The Font Software, modified or unmodified, in part or in whole,
+must be distributed entirely under this license, and must not be
+distributed under any other license. The requirement for fonts to
+remain under this license does not apply to any document created
+using the Font Software.
+
+TERMINATION
+This license becomes null and void if any of the above conditions are
+not met.
+
+DISCLAIMER
+THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT
+OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE
+COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL
+DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM
+OTHER DEALINGS IN THE FONT SOFTWARE.
diff --git a/assets/brand/tokens.json b/assets/brand/tokens.json
new file mode 100644
index 000000000..b464d1fe0
--- /dev/null
+++ b/assets/brand/tokens.json
@@ -0,0 +1,108 @@
+{
+ "name": "LocalSetup UI",
+ "version": "1.0.0",
+ "format": "localsetup.tokens.v1",
+ "copyright": "Copyright © 2026 Crux Experts LLC",
+ "website": "https://www.cruxexperts.com/",
+ "usage_terms": "Private asset. Property of Crux Experts LLC. Use, reproduction, modification, distribution, or publication without prior written permission is prohibited.",
+ "theme": {
+ "light": {
+ "bg": "#FFFFFF",
+ "surface": "#F6F8FC",
+ "raised": "#EDF2F9",
+ "text": "#14213B",
+ "muted": "#4D5E78",
+ "border": "#CDD6E4",
+ "control": "#73849E",
+ "accent": "#173DA6",
+ "accent-hover": "#102D80",
+ "accent-soft": "#EAF0FF",
+ "on-accent": "#FFFFFF",
+ "success": "#126746",
+ "success-soft": "#EAF7EF",
+ "warning": "#825000",
+ "warning-soft": "#FFF5DF",
+ "danger": "#B0253E",
+ "danger-soft": "#FDEDF0",
+ "info": "#205AA4",
+ "info-soft": "#EBF3FE",
+ "focus": "#173DA6"
+ },
+ "dark": {
+ "bg": "#071012",
+ "surface": "#0D191D",
+ "raised": "#14262C",
+ "text": "#E5EEF0",
+ "muted": "#A2B5BD",
+ "border": "#2C424B",
+ "control": "#607D87",
+ "accent": "#36E4C6",
+ "accent-hover": "#85F0DC",
+ "accent-soft": "#103A35",
+ "on-accent": "#051916",
+ "success": "#74DEAF",
+ "success-soft": "#12372A",
+ "warning": "#F2CA73",
+ "warning-soft": "#392C13",
+ "danger": "#FFA0AD",
+ "danger-soft": "#43232B",
+ "info": "#98C8FF",
+ "info-soft": "#19334E",
+ "focus": "#36E4C6"
+ }
+ },
+ "typography": {
+ "font-family": "\"JetBrains Mono\", \"Cascadia Mono\", \"SFMono-Regular\", \"DejaVu Sans Mono\", \"Liberation Mono\", Consolas, monospace",
+ "sizes": {
+ "display": "3.25rem",
+ "h1": "2.5rem",
+ "h2": "1.75rem",
+ "h3": "1.375rem",
+ "h4": "1.125rem",
+ "h5": "1rem",
+ "h6": ".875rem",
+ "body": ".9375rem",
+ "small": ".8125rem",
+ "caption": ".75rem"
+ },
+ "weight": {
+ "regular": 400,
+ "medium": 500,
+ "semibold": 600,
+ "bold": 700
+ },
+ "line-height": {
+ "body": 1.65,
+ "heading": 1.2,
+ "terminal": 1.6
+ }
+ },
+ "space": [
+ 4,
+ 8,
+ 12,
+ 16,
+ 24,
+ 32,
+ 48,
+ 64
+ ],
+ "radii": {
+ "control": "4px",
+ "panel": "6px"
+ },
+ "motion": {
+ "fast": "100ms",
+ "normal": "160ms",
+ "autoplay": false
+ },
+ "branding": {
+ "wordmark": "LocalSetup",
+ "accent_letters": [
+ "L",
+ "S"
+ ],
+ "monogram": "[LS]",
+ "command_casing": "Source-defined; never apply brand capitalization to commands"
+ }
+}
diff --git a/assets/localsetup-architecture-dark.png b/assets/localsetup-architecture-dark.png
new file mode 100644
index 000000000..3ed195408
Binary files /dev/null and b/assets/localsetup-architecture-dark.png differ
diff --git a/assets/localsetup-architecture.png b/assets/localsetup-architecture.png
index 7168ffcc3..99fb26141 100644
Binary files a/assets/localsetup-architecture.png and b/assets/localsetup-architecture.png differ
diff --git a/assets/localsetup-install-lifecycle-dark.png b/assets/localsetup-install-lifecycle-dark.png
new file mode 100644
index 000000000..2cebeed49
Binary files /dev/null and b/assets/localsetup-install-lifecycle-dark.png differ
diff --git a/assets/localsetup-install-lifecycle.png b/assets/localsetup-install-lifecycle.png
index 0cdea1c72..0c0ce67c4 100644
Binary files a/assets/localsetup-install-lifecycle.png and b/assets/localsetup-install-lifecycle.png differ
diff --git a/assets/localsetup-readme-hero-dark.png b/assets/localsetup-readme-hero-dark.png
new file mode 100644
index 000000000..d26d8aa1a
Binary files /dev/null and b/assets/localsetup-readme-hero-dark.png differ
diff --git a/assets/localsetup-readme-hero.png b/assets/localsetup-readme-hero.png
index 5ee3b3cc3..70c8a16a7 100644
Binary files a/assets/localsetup-readme-hero.png and b/assets/localsetup-readme-hero.png differ
diff --git a/ls/README.md b/ls/README.md
index 5951d01c6..5267840c5 100644
--- a/ls/README.md
+++ b/ls/README.md
@@ -1,13 +1,17 @@
# LocalSetup Framework Engine
-**Version:** 5.6.2
+**Version:** 5.7.0
`ls/` is the engine that makes the public LocalSetup promise real. It stores the framework code, shipped skills, workflow packages, platform templates, docs, tests, and install manifests that turn a repository into a portable agent workspace.
For the public product overview, start with the [root README](../README.md). This page is the contributor and maintainer map for the framework internals.
-
+
+
+
+
+
## What this directory owns
@@ -22,13 +26,17 @@ For the public product overview, start with the [root README](../README.md). Thi
LocalSetup-managed entries in consuming repositories are install output. Adapter directories may also contain project-owned skills, files, and symlinks; preserve that content in place. See [adapter ownership](docs/ADAPTER_OWNERSHIP.md).
-Read the [current release guide](docs/releases/5.6.2.md) for LocalSetup 5.6.2, including compatibility, updating, and verification. Find downloads in the [latest published release](https://github.com/CruxExperts/localsetup/releases/latest).
+Read the [current release guide](docs/releases/5.7.0.md) for LocalSetup 5.7.0, including compatibility, updating, and verification. Find downloads in the [latest published release](https://github.com/CruxExperts/localsetup/releases/latest).
## Install flow
-
+
+
+
+
+
The root Bash installer delegates to the Python CLI. The CLI resolves platform intent, creates or refreshes the managed home package library, attaches only explicitly selected repo adapter paths, writes lock/report metadata, and supports rollback for managed paths.
diff --git a/ls/config/branding.json b/ls/config/branding.json
index 2c0bdc543..78d5232df 100644
--- a/ls/config/branding.json
+++ b/ls/config/branding.json
@@ -4836,36 +4836,60 @@
],
"visual_reviews": [
{
- "path": "assets/localsetup-readme-hero.png",
- "sha256": "867d9ca7c124ac03842b6f41f5fc75a42f3b1aad97a3466a91ce8a43c05e5af7",
- "reviewed_text": "LocalSetup; Portable skills. Deliberate workflows.",
- "accessibility_evidence": "README.md hero alt names LocalSetup and describes one package library serving selected agent hosts.",
+ "path": "assets/localsetup-logo.png",
+ "sha256": "d7368d6aba29706d5cfc7a0ed0d1198aa3090b654017d501833abf15337437f3",
+ "reviewed_text": "No text. Package and terminal mark.",
+ "accessibility_evidence": "Only image consumer is immutable ls/docs/releases/4.4.0.md; its historical alt text describes the package and terminal mark. Historical product spelling is preserved as release evidence.",
"reviewer": "Repository visual review",
"reviewed_at": "2026-09-05"
},
+ {
+ "path": "assets/localsetup-readme-hero.png",
+ "sha256": "dc6313070f4f63f58b9a26158e96aed8fb9102f335abb33311ebe6afceb2e77d",
+ "reviewed_text": "[LS] LocalSetup; Own your stack.; A repo-local operating layer for coding agents.; [01] READ, [02] REVIEW, [03] APPLY.",
+ "accessibility_evidence": "README.md picture fallback alt describes product, message and sequence.",
+ "reviewer": "Repository visual review",
+ "reviewed_at": "2026-09-25"
+ },
+ {
+ "path": "assets/localsetup-readme-hero-dark.png",
+ "sha256": "f639760b41c807475586acaff10e483e4ef044c6cdd55f9ebc76e3424512eadc",
+ "reviewed_text": "[LS] LocalSetup; Own your stack.; A repo-local operating layer for coding agents.; [01] READ, [02] REVIEW, [03] APPLY.",
+ "accessibility_evidence": "README.md dark picture source shares the fallback image alt.",
+ "reviewer": "Repository visual review",
+ "reviewed_at": "2026-09-25"
+ },
{
"path": "assets/localsetup-architecture.png",
- "sha256": "641e7303fe10d45161cbbeafa4df9d948f91eec78daadba0bb8f7cc39a8b14af",
- "reviewed_text": "One source. Selected packages.; Keep framework source separate from project adapters.; Source checkout; LocalSetup CLI; Managed library; Project adapters; remaining labels describe selection, dependencies, ownership and verification.",
- "accessibility_evidence": "README.md, ls/README.md and ls/docs/README.md alt text describe the source-to-library-to-adapters flow and metadata; README.md also states custom skills stay in place.",
+ "sha256": "fa808f6124211b7bb316a8af8f0d9031fa5822d75015368a24425bd4c22aef44",
+ "reviewed_text": "[LS] LocalSetup; One source. Selected packages.; Source checkout; LocalSetup CLI; Managed library; Project adapters; verification, lock metadata, rollback records; custom project skills stay in place.",
+ "accessibility_evidence": "README.md, ls/README.md and ls/docs/README.md picture alt describes flow and preserved metadata.",
"reviewer": "Repository visual review",
- "reviewed_at": "2026-09-05"
+ "reviewed_at": "2026-09-25"
+ },
+ {
+ "path": "assets/localsetup-architecture-dark.png",
+ "sha256": "c121541ad9051923447c1f273aa060b0fc23e6a8f96e45442873142bda019d8c",
+ "reviewed_text": "[LS] LocalSetup; One source. Selected packages.; Source checkout; LocalSetup CLI; Managed library; Project adapters; verification, lock metadata, rollback records; custom project skills stay in place.",
+ "accessibility_evidence": "README.md, ls/README.md and ls/docs/README.md dark picture source shares the fallback image alt.",
+ "reviewer": "Repository visual review",
+ "reviewed_at": "2026-09-25"
},
{
"path": "assets/localsetup-install-lifecycle.png",
- "sha256": "b515e7ad386c4ed0188f86c7ce016d3fdfe81ba2b0b2fd2467da268a94f0378f",
- "reviewed_text": "Inspect. Plan. Apply. Verify.; A deliberate install, with a path back.; Confirm scope; Rollback; Restore recorded managed paths; Updates use the same ownership boundaries. No product-name spelling in image.",
- "accessibility_evidence": "README.md, ls/README.md and ls/docs/MULTI_PLATFORM_INSTALL.md alt text describe inspect, plan, confirm, apply, verify and rollback.",
+ "sha256": "f5dbcbef39093e8357842f723f95702679f2a7d1fb07f46202389eb7e2f8c8c2",
+ "reviewed_text": "[LS] LocalSetup; Inspect. Plan. Apply. Verify.; doctor + context; confirm scope before apply; rollback restores recorded managed paths; updates use the same ownership boundaries.",
+ "accessibility_evidence": "README.md, ls/README.md and ls/docs/MULTI_PLATFORM_INSTALL.md picture alt describes all steps and rollback.",
"reviewer": "Repository visual review",
- "reviewed_at": "2026-09-05"
+ "reviewed_at": "2026-09-25"
},
{
- "path": "assets/localsetup-logo.png",
- "sha256": "d7368d6aba29706d5cfc7a0ed0d1198aa3090b654017d501833abf15337437f3",
- "reviewed_text": "No text. Package and terminal mark.",
- "accessibility_evidence": "Only image consumer is immutable ls/docs/releases/4.4.0.md; its historical alt text describes the package and terminal mark. Historical product spelling is preserved as release evidence.",
+ "path": "assets/localsetup-install-lifecycle-dark.png",
+ "sha256": "c8a9157aa808924baeb8ec0bfde754613b39ab290491db0925fdddfd851f538a",
+ "reviewed_text": "[LS] LocalSetup; Inspect. Plan. Apply. Verify.; doctor + context; confirm scope before apply; rollback restores recorded managed paths; updates use the same ownership boundaries.",
+ "accessibility_evidence": "README.md, ls/README.md and ls/docs/MULTI_PLATFORM_INSTALL.md dark picture source shares the fallback image alt.",
"reviewer": "Repository visual review",
- "reviewed_at": "2026-09-05"
+ "reviewed_at": "2026-09-25"
}
],
"binary_reviews": [
@@ -4873,6 +4897,16 @@
"path": "ls/skills/ls-garage/references/upstream-admin-api-v2.json.gz",
"sha256": "006bb13d53429a8c043b0286447c12619ee0a9f9995a26ceec96c4d81b6fb8c3",
"reason": "Nonvisual deterministic gzip archive of the exact licensed Garage Admin OpenAPI JSON source; decompression and source SHA-256 verified by test_storage_admin_schema_source.py."
+ },
+ {
+ "path": "assets/brand/fonts/JetBrainsMono-Regular.ttf",
+ "sha256": "a0bf60ef0f83c5ed4d7a75d45838548b1f6873372dfac88f71804491898d138f",
+ "reason": "Official JetBrains Mono v2.304 font for reproducible documentation graphics; original copyright and SIL Open Font License are retained at assets/brand/fonts/OFL.txt."
+ },
+ {
+ "path": "assets/brand/fonts/JetBrainsMono-SemiBold.ttf",
+ "sha256": "1b3bfa1ed5665a4ce3f9feb68d2d4e40e70bf8b4b7d9a3edd418f321b4e166a0",
+ "reason": "Official JetBrains Mono v2.304 font for reproducible documentation graphics; original copyright and SIL Open Font License are retained at assets/brand/fonts/OFL.txt."
}
]
}
diff --git a/ls/config/sdk-dependency-receipt.json b/ls/config/sdk-dependency-receipt.json
index 4408747ed..630c744e0 100644
--- a/ls/config/sdk-dependency-receipt.json
+++ b/ls/config/sdk-dependency-receipt.json
@@ -4,5 +4,5 @@
"sdk-runtime.lock": "213b7398622e71d52da47677fc7c9da27c17f90a11576ee6b8dd39854f694814"
},
"schema_version": 1,
- "source_sha256": "5b12314a50241cbca49acdde898344701c12003d17427dfb26aac76afb01be1e"
+ "source_sha256": "0562e54bacef640f639961de9fc363f51329c6ee20e4f28df3413304b3c60a1c"
}
diff --git a/ls/core/docs_alignment/assets.py b/ls/core/docs_alignment/assets.py
index dca503843..60b9fc98f 100644
--- a/ls/core/docs_alignment/assets.py
+++ b/ls/core/docs_alignment/assets.py
@@ -8,6 +8,15 @@
from .constants import ASSETS_README, SCHEMA_VERSION
from .io import _markdown_files, _read_text, _rel, _resolve_markdown_target, _markdown_links
+BRAND_GRAPHICS = {
+ "assets/localsetup-readme-hero.png",
+ "assets/localsetup-readme-hero-dark.png",
+ "assets/localsetup-architecture.png",
+ "assets/localsetup-architecture-dark.png",
+ "assets/localsetup-install-lifecycle.png",
+ "assets/localsetup-install-lifecycle-dark.png",
+}
+
def _png_dimensions(path: Path) -> tuple[int, int] | None:
try:
data = path.read_bytes()[:24]
@@ -46,7 +55,7 @@ def collect_asset_manifest(repo_root: Path) -> dict[str, Any]:
for md in _markdown_files(repo_root):
text = _read_text(md)
for kind, target, _, _ in _markdown_links(text):
- resolved = _resolve_markdown_target(repo_root, md, target) if kind == "image" else None
+ resolved = _resolve_markdown_target(repo_root, md, target) if kind in {"image", "source"} else None
if resolved and resolved == path.resolve():
references.append(_rel(repo_root, md))
break
@@ -57,7 +66,10 @@ def collect_asset_manifest(repo_root: Path) -> dict[str, Any]:
"dimensions": {"width": dims[0], "height": dims[1]} if dims else None,
"references": sorted(set(references)),
"provenance": "repository-maintained asset",
- "license": "Repository license unless otherwise documented",
+ "license": (
+ "Crux Experts LLC private asset terms; see [visual asset rights](brand/ASSET_LICENSE.md)"
+ if rel in BRAND_GRAPHICS else "Repository license unless otherwise documented"
+ ),
"alt_text_required": True,
}
)
diff --git a/ls/core/docs_alignment/io.py b/ls/core/docs_alignment/io.py
index 836836ee2..735dc8ad5 100644
--- a/ls/core/docs_alignment/io.py
+++ b/ls/core/docs_alignment/io.py
@@ -141,3 +141,8 @@ def _markdown_links(text: str) -> Iterable[tuple[str, str, int, str]]:
for match in re.finditer(r" ]*\bsrc=[\"']([^\"']+)[\"'][^>]*>", text, flags=re.IGNORECASE):
alt = re.search(r"\balt=[\"']([^\"']*)[\"']", match.group(0), flags=re.IGNORECASE)
yield "image", match.group(1).strip(), match.start(), alt.group(1).strip() if alt else ""
+ for match in re.finditer(r"]*\bsrcset=[\"']([^\"']+)[\"'][^>]*>", text, flags=re.IGNORECASE):
+ for candidate in match.group(1).split(","):
+ parts = candidate.strip().split()
+ if parts:
+ yield "source", parts[0], match.start(), ""
diff --git a/ls/core/versioning_constants.py b/ls/core/versioning_constants.py
index ee058967d..1c391e346 100644
--- a/ls/core/versioning_constants.py
+++ b/ls/core/versioning_constants.py
@@ -22,7 +22,7 @@
"revert",
}
VERSIONED_DOC_GLOBS = ("ls/docs/**/*.md",)
-VERSIONED_DOC_EXCLUDED_PARTS = {"_generated", "local-context", "releases"}
+VERSIONED_DOC_EXCLUDED_PARTS = {"_generated", "audits", "local-context", "releases"}
INTERNAL_PATCH_PATHS = (
".gitignore",
".githooks/",
diff --git a/ls/docs/ADAPTER_OWNERSHIP.md b/ls/docs/ADAPTER_OWNERSHIP.md
index 04fa4ec10..27ace412b 100644
--- a/ls/docs/ADAPTER_OWNERSHIP.md
+++ b/ls/docs/ADAPTER_OWNERSHIP.md
@@ -1,6 +1,6 @@
---
status: ACTIVE
-version: 5.6
+version: 5.7
owner_skill: ls-framework-compliance
---
diff --git a/ls/docs/AGENTIC_AGENT_Q_BIDIRECTIONAL_BUILD_SPEC.md b/ls/docs/AGENTIC_AGENT_Q_BIDIRECTIONAL_BUILD_SPEC.md
index 728de0984..639159955 100644
--- a/ls/docs/AGENTIC_AGENT_Q_BIDIRECTIONAL_BUILD_SPEC.md
+++ b/ls/docs/AGENTIC_AGENT_Q_BIDIRECTIONAL_BUILD_SPEC.md
@@ -1,6 +1,6 @@
---
status: ACTIVE
-version: 5.6
+version: 5.7
owner_skill: ls-agentq-transport
implemented: "shared signed encrypted binary Agent Q envelope; private registry v2 with persistent authority; opaque file-drop and bounded one-attachment mail carrier; exact receipt before queue promotion; versioned lifecycle, reader and workflow contracts"
deferred: "ls/tools/agentq_transport_client/docs/DEFERRED.md"
diff --git a/ls/docs/AGENTIC_AGENT_Q_PATTERN.md b/ls/docs/AGENTIC_AGENT_Q_PATTERN.md
index c590649ae..50acfabad 100644
--- a/ls/docs/AGENTIC_AGENT_Q_PATTERN.md
+++ b/ls/docs/AGENTIC_AGENT_Q_PATTERN.md
@@ -1,6 +1,6 @@
---
status: ACTIVE
-version: 5.6
+version: 5.7
owner_skill: ls-agentq-transport
---
diff --git a/ls/docs/AGENTIC_AGENT_Q_SCENARIOS.md b/ls/docs/AGENTIC_AGENT_Q_SCENARIOS.md
index 611cc8c34..37ec0f2e7 100644
--- a/ls/docs/AGENTIC_AGENT_Q_SCENARIOS.md
+++ b/ls/docs/AGENTIC_AGENT_Q_SCENARIOS.md
@@ -1,6 +1,6 @@
---
status: ACTIVE
-version: 5.6
+version: 5.7
owner_skill: ls-agentq-transport
audience: humans, agents
---
diff --git a/ls/docs/AGENTIC_AGENT_TO_AGENT_PROTOCOL.md b/ls/docs/AGENTIC_AGENT_TO_AGENT_PROTOCOL.md
index d1b8a5fe6..71b1aac22 100644
--- a/ls/docs/AGENTIC_AGENT_TO_AGENT_PROTOCOL.md
+++ b/ls/docs/AGENTIC_AGENT_TO_AGENT_PROTOCOL.md
@@ -1,6 +1,6 @@
---
status: ACTIVE
-version: 5.6
+version: 5.7
owner_skill: ls-agentq-transport
---
diff --git a/ls/docs/AGENTIC_DESIGN_INDEX.md b/ls/docs/AGENTIC_DESIGN_INDEX.md
index eded091a5..d597bd16d 100644
--- a/ls/docs/AGENTIC_DESIGN_INDEX.md
+++ b/ls/docs/AGENTIC_DESIGN_INDEX.md
@@ -1,6 +1,6 @@
---
status: ACTIVE
-version: 5.6
+version: 5.7
owner_skill: ls-docs-organization
---
diff --git a/ls/docs/AGENTIC_UMBRELLA_WORKFLOWS.md b/ls/docs/AGENTIC_UMBRELLA_WORKFLOWS.md
index 7f92513ac..9daa0fc51 100644
--- a/ls/docs/AGENTIC_UMBRELLA_WORKFLOWS.md
+++ b/ls/docs/AGENTIC_UMBRELLA_WORKFLOWS.md
@@ -1,6 +1,6 @@
---
status: ACTIVE
-version: 5.6
+version: 5.7
owner_package: ls-workflow-umbrella-run
---
diff --git a/ls/docs/AGENT_CONTEXT_AND_MCP_CONTRACT.md b/ls/docs/AGENT_CONTEXT_AND_MCP_CONTRACT.md
index 7c9cde5b9..7bdc0884d 100644
--- a/ls/docs/AGENT_CONTEXT_AND_MCP_CONTRACT.md
+++ b/ls/docs/AGENT_CONTEXT_AND_MCP_CONTRACT.md
@@ -1,6 +1,6 @@
---
status: ACTIVE
-version: 5.6
+version: 5.7
owner_skill: ls-context-index
---
diff --git a/ls/docs/AGENT_SKILLS_COMPLIANCE.md b/ls/docs/AGENT_SKILLS_COMPLIANCE.md
index aa691f52e..4145ca09a 100644
--- a/ls/docs/AGENT_SKILLS_COMPLIANCE.md
+++ b/ls/docs/AGENT_SKILLS_COMPLIANCE.md
@@ -1,6 +1,6 @@
---
status: ACTIVE
-version: 5.6
+version: 5.7
owner_skill: ls-skill-creator
---
diff --git a/ls/docs/BRANDING.md b/ls/docs/BRANDING.md
index c2275be0c..968caade9 100644
--- a/ls/docs/BRANDING.md
+++ b/ls/docs/BRANDING.md
@@ -1,6 +1,6 @@
---
status: ACTIVE
-version: 5.6
+version: 5.7
owner_skill: ls-script-and-docs-quality
---
@@ -125,21 +125,70 @@ uv run --locked python ls/tools/localsetup.py --source-root . generate-docs
## Current visual assets
-The four PNG files in `assets/` are the maintained raster sources; this checkout
-contains no editable vector or layered originals. `assets/README.md` is a derived
-inventory maintained by the documentation alignment tools. The acceptance hashes
-and accessibility evidence live in `ls/config/branding.json`.
+The README graphics are generated by `ls/tools/render_brand_graphics.py` from
+`assets/brand/tokens.json` and the fonts recorded in
+`assets/brand/font-lock.json`. The visual package has its own version `1.0.0`;
+that is not the LocalSetup framework release version. `assets/README.md` is a
+derived inventory maintained by the documentation alignment tools. Acceptance
+hashes and accessibility evidence live in `ls/config/branding.json`.
| Asset | Embedded product text | Current use |
|---|---|---|
-| `localsetup-readme-hero.png` | LocalSetup | README introduction |
-| `localsetup-architecture.png` | LocalSetup CLI | README and framework architecture guidance |
-| `localsetup-install-lifecycle.png` | None | Installation and rollback guidance |
+| `localsetup-readme-hero.png` and `localsetup-readme-hero-dark.png` | `[LS]`, accented L/S in LocalSetup | README introduction |
+| `localsetup-architecture.png` and `localsetup-architecture-dark.png` | `[LS]`, accented L/S, LocalSetup CLI | README and framework architecture guidance |
+| `localsetup-install-lifecycle.png` and `localsetup-install-lifecycle-dark.png` | `[LS]`, accented L/S | Installation and rollback guidance |
| `localsetup-logo.png` | None | Historical release mark |
-Keep asset filenames stable. Review a changed raster in full, including small
-labels, and check each current consumer's alt text. The historical release note
-remains immutable; its descriptive alt text is retained with the release record.
+The three light paths remain stable fallbacks. Current consumers use GitHub's
+`` theme sources with a descriptive ` ` fallback. Keep commands in
+selectable text outside the images. Review every changed raster, including small
+labels, and check its consumer's alt text. The historical release image and note
+remain immutable.
+
+## Visual contract for documentation and AstroSite
+
+`assets/brand/tokens.json` owns the approved light and dark palettes and type
+scale. The light background/accent are `#FFFFFF`/`#173DA6`; the dark pair are
+`#071012`/`#36E4C6`. Use semantic foreground, muted, surface, border, and
+status tokens from that file instead of deriving new colors from screenshots.
+The mark is the literal, tightly spaced `[LS]`. The wordmark spells
+`LocalSetup`, with its **L** and **S** in the active accent color. This visual
+treatment does not alter command casing or the technical identifiers above.
+The [visual asset rights](../../assets/brand/ASSET_LICENSE.md) distinguish
+Crux-owned graphics from JetBrains font software and the repository MIT license.
+
+JetBrains Mono v2.304 Regular (400) and SemiBold (600) are pinned for generated
+graphics, with exact hashes and the original SIL Open Font License in the font
+lock. The web type stack starts with JetBrains Mono, then Cascadia Mono,
+SFMono-Regular, DejaVu Sans Mono, Liberation Mono, Consolas, and monospace.
+Disable ligatures for interface and terminal text. Use 400 for body copy and 600
+for display text; retain the token type scale and readable content sizing.
+The handoff's fallback-rendered DejaVu images are superseded by the pinned
+graphics here.
+
+An optional JetBrainsMono Nerd Font glyph profile is suitable for a future
+AstroSite terminal or icon treatment. Nerd Fonts publishes its patched fonts
+under the SIL Open Font License 1.1; retain the exact font package's license and
+upstream attribution when that profile is pinned and distributed. Keep ASCII
+labels as the default and a fallback for each optional glyph. Do not require a
+Nerd Font to read the README, follow install commands, or understand status.
+The upstream [Nerd Fonts license](https://github.com/ryanoasis/nerd-fonts/blob/master/LICENSE)
+and [JetBrainsMono package](https://github.com/ryanoasis/nerd-fonts) are the
+starting points for the future release-specific pin.
+
+AstroSite is a separate source and deployment project. Its implementer should
+consume this token and font contract, use one theme state for all pages, support
+light, dark, and system preference, and preserve readable focus and status text
+without relying on color alone. Use the same `[LS]`/accented wordmark and derive
+social media art from the same visual system. Do not treat the repository's one
+static GitHub social preview as a website theme switch. LocalSetup's current
+README, documentation images, and generated-image script are the reviewable
+GitHub reference; the standalone site has no release or homepage URL here yet.
+
+Render with `uv run --locked python ls/tools/render_brand_graphics.py`; pass
+`--check` to verify exact output. The social image is rendered only to a private
+`--social-output` path for upload to GitHub settings. Graphics use embedded
+copyright and usage metadata; the JetBrains font retains its own license.
## Technical syntax recognition
diff --git a/ls/docs/CLIENT_INTEGRATION_METADATA.md b/ls/docs/CLIENT_INTEGRATION_METADATA.md
index 331848dcc..f283cab03 100644
--- a/ls/docs/CLIENT_INTEGRATION_METADATA.md
+++ b/ls/docs/CLIENT_INTEGRATION_METADATA.md
@@ -1,6 +1,6 @@
---
status: ACTIVE
-version: 5.6
+version: 5.7
owner_skill: ls-framework-compliance
---
diff --git a/ls/docs/CLIENT_STATE.md b/ls/docs/CLIENT_STATE.md
index 5b9b163ed..bce998ec2 100644
--- a/ls/docs/CLIENT_STATE.md
+++ b/ls/docs/CLIENT_STATE.md
@@ -1,6 +1,6 @@
---
status: ACTIVE
-version: 5.6
+version: 5.7
owner_skill: ls-framework-compliance
---
diff --git a/ls/docs/CLI_SKILLS_ENV.md b/ls/docs/CLI_SKILLS_ENV.md
index 5b43d69f8..1c9b57e07 100644
--- a/ls/docs/CLI_SKILLS_ENV.md
+++ b/ls/docs/CLI_SKILLS_ENV.md
@@ -1,6 +1,6 @@
---
status: ACTIVE
-version: 5.6
+version: 5.7
owner_skill: ls-framework-compliance
---
diff --git a/ls/docs/CODEX_GITHUB_ISSUE_GOAL_LOOP.md b/ls/docs/CODEX_GITHUB_ISSUE_GOAL_LOOP.md
index 1974da342..4422295f6 100644
--- a/ls/docs/CODEX_GITHUB_ISSUE_GOAL_LOOP.md
+++ b/ls/docs/CODEX_GITHUB_ISSUE_GOAL_LOOP.md
@@ -1,6 +1,6 @@
---
status: ACTIVE
-version: 5.6
+version: 5.7
owner_package: ls-workflow-codex-github-issue-goal-loop
---
diff --git a/ls/docs/COMMAND_REFERENCE.md b/ls/docs/COMMAND_REFERENCE.md
index 5908760be..e1b3807f7 100644
--- a/ls/docs/COMMAND_REFERENCE.md
+++ b/ls/docs/COMMAND_REFERENCE.md
@@ -1,6 +1,6 @@
---
status: ACTIVE
-version: 5.6
+version: 5.7
owner_skill: ls-framework-compliance
---
diff --git a/ls/docs/DECISION_TREE_WORKFLOW.md b/ls/docs/DECISION_TREE_WORKFLOW.md
index fe982d87f..0bb22e5dc 100644
--- a/ls/docs/DECISION_TREE_WORKFLOW.md
+++ b/ls/docs/DECISION_TREE_WORKFLOW.md
@@ -1,6 +1,6 @@
---
status: ACTIVE
-version: 5.6
+version: 5.7
owner_package: ls-workflow-spec-clarify-reverse
---
diff --git a/ls/docs/DOCUMENT_LIFECYCLE_MANAGEMENT.md b/ls/docs/DOCUMENT_LIFECYCLE_MANAGEMENT.md
index 29105474a..70a26780f 100644
--- a/ls/docs/DOCUMENT_LIFECYCLE_MANAGEMENT.md
+++ b/ls/docs/DOCUMENT_LIFECYCLE_MANAGEMENT.md
@@ -1,6 +1,6 @@
---
status: ACTIVE
-version: 5.6
+version: 5.7
owner_skill: ls-documentation-alignment
---
diff --git a/ls/docs/ENVMAN_INTEGRATION_CONTRACT.md b/ls/docs/ENVMAN_INTEGRATION_CONTRACT.md
index 1f55570cd..ca7c2cf24 100644
--- a/ls/docs/ENVMAN_INTEGRATION_CONTRACT.md
+++ b/ls/docs/ENVMAN_INTEGRATION_CONTRACT.md
@@ -1,6 +1,6 @@
---
status: ACTIVE
-version: 5.6
+version: 5.7
owner_skill: ls-architecture
---
diff --git a/ls/docs/FEATURES.md b/ls/docs/FEATURES.md
index 974e7f02d..4d49db49c 100644
--- a/ls/docs/FEATURES.md
+++ b/ls/docs/FEATURES.md
@@ -1,6 +1,6 @@
---
status: ACTIVE
-version: 5.6
+version: 5.7
owner_skill: ls-docs-organization
---
@@ -11,7 +11,7 @@ This is the full public capability catalog for LocalSetup. The [root README](../
## Generated Facts
-- Current version: `5.6.2`
+- Current version: `5.7.0`
- Supported platforms: `codex, claude-code, cursor, kilo, opencode, openclaw, github-copilot-cli, github-copilot-vscode, cline-cli, cline-vscode, amp-cli, goose-cli, pi-cli, hermes-agent, qwen-code-cli, kimi-cli, factory-droid, antigravity-app, gemini-cli, omp-cli`
- Shipped skills: `105`
- Workflow packages: `18`
diff --git a/ls/docs/FRAMEWORK_LIBRARY_ARCHITECTURE.md b/ls/docs/FRAMEWORK_LIBRARY_ARCHITECTURE.md
index e3613dc01..63c38039f 100644
--- a/ls/docs/FRAMEWORK_LIBRARY_ARCHITECTURE.md
+++ b/ls/docs/FRAMEWORK_LIBRARY_ARCHITECTURE.md
@@ -1,6 +1,6 @@
---
status: ACTIVE
-version: 5.6
+version: 5.7
owner_skill: ls-architecture
---
diff --git a/ls/docs/FRONTEND_WEB_APP_SKILL_ROUTING.md b/ls/docs/FRONTEND_WEB_APP_SKILL_ROUTING.md
index 1d5d7a5d4..384c7f458 100644
--- a/ls/docs/FRONTEND_WEB_APP_SKILL_ROUTING.md
+++ b/ls/docs/FRONTEND_WEB_APP_SKILL_ROUTING.md
@@ -1,6 +1,6 @@
---
status: ACTIVE
-version: 5.6
+version: 5.7
owner_skill: ls-task-skill-matcher
---
diff --git a/ls/docs/GIT_TRACEABILITY.md b/ls/docs/GIT_TRACEABILITY.md
index 1af109371..68c75bc82 100644
--- a/ls/docs/GIT_TRACEABILITY.md
+++ b/ls/docs/GIT_TRACEABILITY.md
@@ -1,6 +1,6 @@
---
status: ACTIVE
-version: 5.6
+version: 5.7
owner_skill: ls-git-workflows
---
diff --git a/ls/docs/GLOBAL_HANDOFF_LEDGER.md b/ls/docs/GLOBAL_HANDOFF_LEDGER.md
index 1508ac674..f11364857 100644
--- a/ls/docs/GLOBAL_HANDOFF_LEDGER.md
+++ b/ls/docs/GLOBAL_HANDOFF_LEDGER.md
@@ -1,6 +1,6 @@
---
status: ACTIVE
-version: 5.6
+version: 5.7
owner_skill: ls-framework-compliance
---
diff --git a/ls/docs/HARNESS_AUTOMATION.md b/ls/docs/HARNESS_AUTOMATION.md
index 733d0ad9e..ab61240c1 100644
--- a/ls/docs/HARNESS_AUTOMATION.md
+++ b/ls/docs/HARNESS_AUTOMATION.md
@@ -1,6 +1,6 @@
---
status: ACTIVE
-version: 5.6
+version: 5.7
owner_skill: ls-codex-heartbeat
---
diff --git a/ls/docs/INPUT_HARDENING_STANDARD.md b/ls/docs/INPUT_HARDENING_STANDARD.md
index 9086ac292..a501b6142 100644
--- a/ls/docs/INPUT_HARDENING_STANDARD.md
+++ b/ls/docs/INPUT_HARDENING_STANDARD.md
@@ -1,6 +1,6 @@
---
status: ACTIVE
-version: 5.6
+version: 5.7
owner_skill: ls-script-and-docs-quality
---
diff --git a/ls/docs/LSCLI.md b/ls/docs/LSCLI.md
index f90b3d477..dbb432c0a 100644
--- a/ls/docs/LSCLI.md
+++ b/ls/docs/LSCLI.md
@@ -1,6 +1,6 @@
---
status: ACTIVE
-version: 5.6
+version: 5.7
owner_skill: ls-architecture
---
diff --git a/ls/docs/LSCLI_QUALIFICATION.md b/ls/docs/LSCLI_QUALIFICATION.md
index 427a5e03e..3e5c5719e 100644
--- a/ls/docs/LSCLI_QUALIFICATION.md
+++ b/ls/docs/LSCLI_QUALIFICATION.md
@@ -1,6 +1,6 @@
---
status: ACTIVE
-version: 5.6
+version: 5.7
owner_skill: ls-architecture
---
diff --git a/ls/docs/LSCLI_RUNTIME.md b/ls/docs/LSCLI_RUNTIME.md
index cf946adc8..4f04633aa 100644
--- a/ls/docs/LSCLI_RUNTIME.md
+++ b/ls/docs/LSCLI_RUNTIME.md
@@ -1,6 +1,6 @@
---
status: ACTIVE
-version: 5.6
+version: 5.7
owner_skill: ls-architecture
---
diff --git a/ls/docs/MULTI_PLATFORM_INSTALL.md b/ls/docs/MULTI_PLATFORM_INSTALL.md
index 05bc27e10..27ad2aad0 100644
--- a/ls/docs/MULTI_PLATFORM_INSTALL.md
+++ b/ls/docs/MULTI_PLATFORM_INSTALL.md
@@ -1,6 +1,6 @@
---
status: ACTIVE
-version: 5.6
+version: 5.7
owner_skill: ls-framework-compliance
---
@@ -9,7 +9,11 @@ owner_skill: ls-framework-compliance
**Purpose:** How to install LocalSetup for each supported AI agent platform. Supported platforms are listed in `ls/config/platforms.yaml` and summarized in [_generated/platform-adapters.md](_generated/platform-adapters.md). Same framework; explicitly selected platform adapter paths point at a shared managed package library. For a copy-paste option table, see [Command reference](COMMAND_REFERENCE.md).
-
+
+
+
+
+
## Platform detection and script selection
diff --git a/ls/docs/NODE_DASHBOARD_CONTROL_BOUNDARY.md b/ls/docs/NODE_DASHBOARD_CONTROL_BOUNDARY.md
index 9e681fdc0..0f09e16c9 100644
--- a/ls/docs/NODE_DASHBOARD_CONTROL_BOUNDARY.md
+++ b/ls/docs/NODE_DASHBOARD_CONTROL_BOUNDARY.md
@@ -1,6 +1,6 @@
---
status: ACTIVE
-version: 5.6
+version: 5.7
owner_skill: ls-system-design
---
diff --git a/ls/docs/OPENPGP_RUNTIME.md b/ls/docs/OPENPGP_RUNTIME.md
index 8a95ec53f..4aac36917 100644
--- a/ls/docs/OPENPGP_RUNTIME.md
+++ b/ls/docs/OPENPGP_RUNTIME.md
@@ -1,6 +1,6 @@
---
status: ACTIVE
-version: 5.6
+version: 5.7
owner_skill: ls-agentq-transport
---
diff --git a/ls/docs/OUTPUT_AND_DOC_GENERATION.md b/ls/docs/OUTPUT_AND_DOC_GENERATION.md
index dc5ff8561..db89fb6fb 100644
--- a/ls/docs/OUTPUT_AND_DOC_GENERATION.md
+++ b/ls/docs/OUTPUT_AND_DOC_GENERATION.md
@@ -1,6 +1,6 @@
---
status: ACTIVE
-version: 5.6
+version: 5.7
owner_skill: ls-script-and-docs-quality
last_updated: "2026-02-20"
---
diff --git a/ls/docs/PLATFORM_REGISTRY.md b/ls/docs/PLATFORM_REGISTRY.md
index 7e4c6a8aa..4fcdb6871 100644
--- a/ls/docs/PLATFORM_REGISTRY.md
+++ b/ls/docs/PLATFORM_REGISTRY.md
@@ -1,6 +1,6 @@
---
status: ACTIVE
-version: 5.6
+version: 5.7
owner_skill: ls-framework-compliance
---
diff --git a/ls/docs/PLUGIN_PACKS.md b/ls/docs/PLUGIN_PACKS.md
index 245e3da0b..a96be835f 100644
--- a/ls/docs/PLUGIN_PACKS.md
+++ b/ls/docs/PLUGIN_PACKS.md
@@ -1,6 +1,6 @@
---
status: ACTIVE
-version: 5.6
+version: 5.7
owner_skill: ls-docs-organization
---
diff --git a/ls/docs/PRD_SCHEMA_EXTERNAL_AGENT_GUIDE.md b/ls/docs/PRD_SCHEMA_EXTERNAL_AGENT_GUIDE.md
index e6c7bb288..a4557baf8 100644
--- a/ls/docs/PRD_SCHEMA_EXTERNAL_AGENT_GUIDE.md
+++ b/ls/docs/PRD_SCHEMA_EXTERNAL_AGENT_GUIDE.md
@@ -1,6 +1,6 @@
---
status: ACTIVE
-version: 5.6
+version: 5.7
owner_skill: ls-agentq-transport
---
diff --git a/ls/docs/PYTHON_ARCHITECTURE_STANDARD.md b/ls/docs/PYTHON_ARCHITECTURE_STANDARD.md
index 84e38e250..a774f57b0 100644
--- a/ls/docs/PYTHON_ARCHITECTURE_STANDARD.md
+++ b/ls/docs/PYTHON_ARCHITECTURE_STANDARD.md
@@ -1,6 +1,6 @@
---
status: ACTIVE
-version: 5.6
+version: 5.7
owner_skill: ls-script-and-docs-quality
---
diff --git a/ls/docs/QUICKSTART.md b/ls/docs/QUICKSTART.md
index 482b161a1..72a419963 100644
--- a/ls/docs/QUICKSTART.md
+++ b/ls/docs/QUICKSTART.md
@@ -1,6 +1,6 @@
---
status: ACTIVE
-version: 5.6
+version: 5.7
owner_skill: ls-framework-compliance
---
diff --git a/ls/docs/README.md b/ls/docs/README.md
index 13683218b..31e4b72e3 100644
--- a/ls/docs/README.md
+++ b/ls/docs/README.md
@@ -1,6 +1,6 @@
---
status: ACTIVE
-version: 5.6
+version: 5.7
owner_skill: ls-docs-organization
---
@@ -9,13 +9,17 @@ owner_skill: ls-docs-organization
This is the public documentation map for LocalSetup. Start here when you want the install path, platform behavior, shipped skills, workflow model, or release/verification rules.
-
+
+
+
+
+
## Generated Facts
-- Current version: `5.6.2`
+- Current version: `5.7.0`
- Supported platforms: `codex, claude-code, cursor, kilo, opencode, openclaw, github-copilot-cli, github-copilot-vscode, cline-cli, cline-vscode, amp-cli, goose-cli, pi-cli, hermes-agent, qwen-code-cli, kimi-cli, factory-droid, antigravity-app, gemini-cli, omp-cli`
- Shipped skills: `105`
- Workflow packages: `18`
@@ -47,7 +51,7 @@ This is the public documentation map for LocalSetup. Start here when you want th
| [Harness automation](HARNESS_AUTOMATION.md) | Opt-in heartbeat activation, typed LSCli profiles, reserved actions/controller accounting, runtime artifacts, cron gating and command-policy boundaries. |
-Read the [current release guide](releases/5.6.2.md) for LocalSetup 5.6.2, including compatibility, updating, and verification. Find downloads in the [latest published release](https://github.com/CruxExperts/localsetup/releases/latest).
+Read the [current release guide](releases/5.7.0.md) for LocalSetup 5.7.0, including compatibility, updating, and verification. Find downloads in the [latest published release](https://github.com/CruxExperts/localsetup/releases/latest).
The [4.4.0 guide](releases/4.4.0.md) covers the earlier context and package consolidation.
diff --git a/ls/docs/REPO_AND_DATA_SEPARATION.md b/ls/docs/REPO_AND_DATA_SEPARATION.md
index f256547a1..afc53827f 100644
--- a/ls/docs/REPO_AND_DATA_SEPARATION.md
+++ b/ls/docs/REPO_AND_DATA_SEPARATION.md
@@ -1,6 +1,6 @@
---
status: ACTIVE
-version: 5.6
+version: 5.7
owner_skill: ls-framework-compliance
---
diff --git a/ls/docs/REPO_CONVERSION.md b/ls/docs/REPO_CONVERSION.md
index 1846d86a2..e080cb6cf 100644
--- a/ls/docs/REPO_CONVERSION.md
+++ b/ls/docs/REPO_CONVERSION.md
@@ -1,6 +1,6 @@
---
status: ACTIVE
-version: 5.6
+version: 5.7
owner_package: ls-workflow-pipeline-repo-convert
---
diff --git a/ls/docs/REPO_MAINTENANCE.md b/ls/docs/REPO_MAINTENANCE.md
index e271ab1d6..648f5923a 100644
--- a/ls/docs/REPO_MAINTENANCE.md
+++ b/ls/docs/REPO_MAINTENANCE.md
@@ -1,6 +1,6 @@
---
status: ACTIVE
-version: 5.6
+version: 5.7
owner_skill: ls-framework-compliance
---
diff --git a/ls/docs/SDK_FORK.md b/ls/docs/SDK_FORK.md
index 2e0f21e15..1326870ab 100644
--- a/ls/docs/SDK_FORK.md
+++ b/ls/docs/SDK_FORK.md
@@ -1,6 +1,6 @@
---
status: ACTIVE
-version: 5.6
+version: 5.7
owner_skill: ls-architecture
---
diff --git a/ls/docs/SKILLS.md b/ls/docs/SKILLS.md
index f7b9f2d59..68784f9e8 100644
--- a/ls/docs/SKILLS.md
+++ b/ls/docs/SKILLS.md
@@ -1,14 +1,14 @@
---
status: ACTIVE
-version: 5.6
+version: 5.7
owner_package: generate-docs
localsetup_provenance:
schema_version: 1
- source_provenance_hash: c54679d3c6f4b49db62d3d2766cbf6be76e8f3ed358215878b9a9d5791e6e91d
+ source_provenance_hash: 0a731df435bdcd861541bd11f986b448155685e4639d890701c34cfe4d196086
emitter: generate-docs
-framework_version: 5.6.2
-source_commit: 121d921de0bc14c99475633986c457cf3d57d5ce
-artifact_sha256: 9df2b8cb629f01daa74ae7ef6f0c55d7a96784e4cba23e50a4f751fa615010d6
+framework_version: 5.7.0
+source_commit: 7aa27482de3a6482c9d7d524dea6f991730a737e
+artifact_sha256: ac1a33dd747cd03e571ea74b209341dc34c3cc90fce60b47c9f2b1f3c7d82a4e
---
# Shipped skills catalog
diff --git a/ls/docs/SKILLS_AND_RULES.md b/ls/docs/SKILLS_AND_RULES.md
index 4c3387828..8488dc242 100644
--- a/ls/docs/SKILLS_AND_RULES.md
+++ b/ls/docs/SKILLS_AND_RULES.md
@@ -1,6 +1,6 @@
---
status: ACTIVE
-version: 5.6
+version: 5.7
owner_skill: ls-task-skill-matcher
---
diff --git a/ls/docs/SKILL_DISCOVERY.md b/ls/docs/SKILL_DISCOVERY.md
index d49ef522d..bc30129df 100644
--- a/ls/docs/SKILL_DISCOVERY.md
+++ b/ls/docs/SKILL_DISCOVERY.md
@@ -1,6 +1,6 @@
---
status: ACTIVE
-version: 5.6
+version: 5.7
owner_skill: ls-skill-discovery
---
diff --git a/ls/docs/SKILL_IMPORTING.md b/ls/docs/SKILL_IMPORTING.md
index 14c7773d2..a543e90c4 100644
--- a/ls/docs/SKILL_IMPORTING.md
+++ b/ls/docs/SKILL_IMPORTING.md
@@ -1,6 +1,6 @@
---
status: ACTIVE
-version: 5.6
+version: 5.7
owner_skill: ls-skill-importer
---
diff --git a/ls/docs/SKILL_INTEROPERABILITY.md b/ls/docs/SKILL_INTEROPERABILITY.md
index 51ef7ecf2..c09e2b047 100644
--- a/ls/docs/SKILL_INTEROPERABILITY.md
+++ b/ls/docs/SKILL_INTEROPERABILITY.md
@@ -1,6 +1,6 @@
---
status: ACTIVE
-version: 5.6
+version: 5.7
owner_skill: ls-skill-creator
---
diff --git a/ls/docs/SKILL_NORMALIZATION.md b/ls/docs/SKILL_NORMALIZATION.md
index 8f3f4d54e..9a2fd33a5 100644
--- a/ls/docs/SKILL_NORMALIZATION.md
+++ b/ls/docs/SKILL_NORMALIZATION.md
@@ -1,6 +1,6 @@
---
status: ACTIVE
-version: 5.6
+version: 5.7
owner_skill: ls-skill-normalizer
---
diff --git a/ls/docs/SKILL_VALIDATION_PATTERNS.md b/ls/docs/SKILL_VALIDATION_PATTERNS.md
index b76c5aeb5..6c3d45e8d 100644
--- a/ls/docs/SKILL_VALIDATION_PATTERNS.md
+++ b/ls/docs/SKILL_VALIDATION_PATTERNS.md
@@ -1,6 +1,6 @@
---
status: ACTIVE
-version: 5.6
+version: 5.7
owner_skill: ls-skill-vetter
---
diff --git a/ls/docs/STORAGE_SKILLS.md b/ls/docs/STORAGE_SKILLS.md
index df883b1a9..7569b1dfc 100644
--- a/ls/docs/STORAGE_SKILLS.md
+++ b/ls/docs/STORAGE_SKILLS.md
@@ -1,6 +1,6 @@
---
status: ACTIVE
-version: 5.6
+version: 5.7
owner_skill: ls-backblaze
---
diff --git a/ls/docs/TASK_SKILL_MATCHING.md b/ls/docs/TASK_SKILL_MATCHING.md
index 7d069b093..436d8a5fa 100644
--- a/ls/docs/TASK_SKILL_MATCHING.md
+++ b/ls/docs/TASK_SKILL_MATCHING.md
@@ -1,6 +1,6 @@
---
status: ACTIVE
-version: 5.6
+version: 5.7
owner_skill: ls-task-skill-matcher
---
diff --git a/ls/docs/TMUX_TERMINAL_MODE.md b/ls/docs/TMUX_TERMINAL_MODE.md
index 1fe88a986..34fc98e51 100644
--- a/ls/docs/TMUX_TERMINAL_MODE.md
+++ b/ls/docs/TMUX_TERMINAL_MODE.md
@@ -1,6 +1,6 @@
---
status: ACTIVE
-version: 5.6
+version: 5.7
owner_package: ls-workflow-tmux-terminal-mode
---
diff --git a/ls/docs/TOOLING_POLICY.md b/ls/docs/TOOLING_POLICY.md
index 5cd8db16f..e2b1b8c79 100644
--- a/ls/docs/TOOLING_POLICY.md
+++ b/ls/docs/TOOLING_POLICY.md
@@ -1,6 +1,6 @@
---
status: ACTIVE
-version: 5.6
+version: 5.7
owner_skill: ls-script-and-docs-quality
---
diff --git a/ls/docs/TRUSTED_WORK_QUEUE.md b/ls/docs/TRUSTED_WORK_QUEUE.md
index 7f9b0f00d..b2e1a828a 100644
--- a/ls/docs/TRUSTED_WORK_QUEUE.md
+++ b/ls/docs/TRUSTED_WORK_QUEUE.md
@@ -1,6 +1,6 @@
---
status: ACTIVE
-version: 5.6
+version: 5.7
owner_skill: ls-architecture
---
diff --git a/ls/docs/VERSIONING.md b/ls/docs/VERSIONING.md
index 5ed46f6ab..50c7f6b7d 100644
--- a/ls/docs/VERSIONING.md
+++ b/ls/docs/VERSIONING.md
@@ -1,6 +1,6 @@
---
status: ACTIVE
-version: 5.6
+version: 5.7
owner_skill: ls-automatic-versioning
---
@@ -11,7 +11,7 @@ LocalSetup uses the root `VERSION` file as the source of truth for the framework
## Current Version
- Source of truth: [`../../VERSION`](../../VERSION)
-- Current value: `5.6.2`
+- Current value: `5.7.0`
- Generated facts: [`_generated/facts.json`](_generated/facts.json)
## Policy
diff --git a/ls/docs/WORKFLOW_PACKAGES.md b/ls/docs/WORKFLOW_PACKAGES.md
index f8ffc212e..6bfcfe4e7 100644
--- a/ls/docs/WORKFLOW_PACKAGES.md
+++ b/ls/docs/WORKFLOW_PACKAGES.md
@@ -1,6 +1,6 @@
---
status: ACTIVE
-version: 5.6
+version: 5.7
owner_skill: ls-docs-organization
---
diff --git a/ls/docs/WORKFLOW_QUICK_REF.md b/ls/docs/WORKFLOW_QUICK_REF.md
index eef244132..eb5edd2ca 100644
--- a/ls/docs/WORKFLOW_QUICK_REF.md
+++ b/ls/docs/WORKFLOW_QUICK_REF.md
@@ -1,14 +1,14 @@
---
status: ACTIVE
-version: 5.6
+version: 5.7
owner_package: generate-docs
localsetup_provenance:
schema_version: 1
- source_provenance_hash: c54679d3c6f4b49db62d3d2766cbf6be76e8f3ed358215878b9a9d5791e6e91d
+ source_provenance_hash: 0a731df435bdcd861541bd11f986b448155685e4639d890701c34cfe4d196086
emitter: generate-docs
-framework_version: 5.6.2
-source_commit: 121d921de0bc14c99475633986c457cf3d57d5ce
-artifact_sha256: cf5a49060109bb314b92fe6e01f530d509c4b8439ef26f0e7dbafe266e199727
+framework_version: 5.7.0
+source_commit: 7aa27482de3a6482c9d7d524dea6f991730a737e
+artifact_sha256: 15a064235264e3c4445ce91fefe76a74ac13ddbaaf6337504a01a4eb35249b49
---
# Workflow quick reference
diff --git a/ls/docs/WORKFLOW_REGISTRY.md b/ls/docs/WORKFLOW_REGISTRY.md
index e621372e5..69c0a76b1 100644
--- a/ls/docs/WORKFLOW_REGISTRY.md
+++ b/ls/docs/WORKFLOW_REGISTRY.md
@@ -1,14 +1,14 @@
---
status: ACTIVE
-version: 5.6
+version: 5.7
owner_package: generate-docs
localsetup_provenance:
schema_version: 1
- source_provenance_hash: c54679d3c6f4b49db62d3d2766cbf6be76e8f3ed358215878b9a9d5791e6e91d
+ source_provenance_hash: 0a731df435bdcd861541bd11f986b448155685e4639d890701c34cfe4d196086
emitter: generate-docs
-framework_version: 5.6.2
-source_commit: 121d921de0bc14c99475633986c457cf3d57d5ce
-artifact_sha256: 35cb3687770a3829fcf0b7ffd6335e21e311319248e2db74bffc5757db0733d2
+framework_version: 5.7.0
+source_commit: 7aa27482de3a6482c9d7d524dea6f991730a737e
+artifact_sha256: 9773a6c75d91df0b5b9e9feb96a7747a1b0ef91c3e8348f575789e8803cbfed1
---
# Workflow and module registry (LocalSetup)
diff --git a/ls/docs/WORKFLOW_SKILLS_REVIEW_BUILD_SPEC.md b/ls/docs/WORKFLOW_SKILLS_REVIEW_BUILD_SPEC.md
index 67da7b6d6..65e325b01 100644
--- a/ls/docs/WORKFLOW_SKILLS_REVIEW_BUILD_SPEC.md
+++ b/ls/docs/WORKFLOW_SKILLS_REVIEW_BUILD_SPEC.md
@@ -1,6 +1,6 @@
---
status: DEPRECATED
-version: 5.6
+version: 5.7
---
# Workflow Skills Review Build Spec
diff --git a/ls/docs/WORKFLOW_STANDARD.md b/ls/docs/WORKFLOW_STANDARD.md
index 6d9117166..e160610bc 100644
--- a/ls/docs/WORKFLOW_STANDARD.md
+++ b/ls/docs/WORKFLOW_STANDARD.md
@@ -1,6 +1,6 @@
---
status: ACTIVE
-version: 5.6
+version: 5.7
owner_skill: ls-framework-compliance
---
diff --git a/ls/docs/_generated/artifact-registry.json b/ls/docs/_generated/artifact-registry.json
index d19994092..976ef877f 100644
--- a/ls/docs/_generated/artifact-registry.json
+++ b/ls/docs/_generated/artifact-registry.json
@@ -1,12 +1,12 @@
{
"artifacts": [
{
- "artifact_sha256": "711e7b5aa4deae0134324afce09bc5fcdeb931ee148295edba86007d1ee80dda",
+ "artifact_sha256": "ab8055bd373816efa87ddeacddbe40a803e028a21df6c96221cd8a97d46b9dfc",
"emitter": "generate-docs",
- "framework_version": "5.6.2",
+ "framework_version": "5.7.0",
"path": "assets/README.md",
- "provenance_hash": "c54679d3c6f4b49db62d3d2766cbf6be76e8f3ed358215878b9a9d5791e6e91d",
- "source_commit": "121d921de0bc14c99475633986c457cf3d57d5ce",
+ "provenance_hash": "0a731df435bdcd861541bd11f986b448155685e4639d890701c34cfe4d196086",
+ "source_commit": "7aa27482de3a6482c9d7d524dea6f991730a737e",
"source_inputs": [
"VERSION",
"ls/skills",
@@ -23,12 +23,12 @@
"type": "markdown"
},
{
- "artifact_sha256": "ec03d647851f591b704e06c52e0680f9dce17d730dcfa746f0cdc8740745ea45",
+ "artifact_sha256": "15d954b409e4c7fefc2c88174b03612ad470065dca816b5e3bb07d76bf7ee0c8",
"emitter": "generate-docs",
- "framework_version": "5.6.2",
+ "framework_version": "5.7.0",
"path": "ls/docs/SKILLS.md",
- "provenance_hash": "c54679d3c6f4b49db62d3d2766cbf6be76e8f3ed358215878b9a9d5791e6e91d",
- "source_commit": "121d921de0bc14c99475633986c457cf3d57d5ce",
+ "provenance_hash": "0a731df435bdcd861541bd11f986b448155685e4639d890701c34cfe4d196086",
+ "source_commit": "7aa27482de3a6482c9d7d524dea6f991730a737e",
"source_inputs": [
"VERSION",
"ls/skills",
@@ -45,12 +45,12 @@
"type": "markdown"
},
{
- "artifact_sha256": "ba2f4aa2cc603b8ddc569a273a655a8b8309336c3171c49ec6aa722a42e00cb5",
+ "artifact_sha256": "3548df259d40eb4dcd8a48f3345d6b6494cf24775a325acf564f0dc22aac9b11",
"emitter": "generate-docs",
- "framework_version": "5.6.2",
+ "framework_version": "5.7.0",
"path": "ls/docs/WORKFLOW_QUICK_REF.md",
- "provenance_hash": "c54679d3c6f4b49db62d3d2766cbf6be76e8f3ed358215878b9a9d5791e6e91d",
- "source_commit": "121d921de0bc14c99475633986c457cf3d57d5ce",
+ "provenance_hash": "0a731df435bdcd861541bd11f986b448155685e4639d890701c34cfe4d196086",
+ "source_commit": "7aa27482de3a6482c9d7d524dea6f991730a737e",
"source_inputs": [
"VERSION",
"ls/skills",
@@ -67,12 +67,12 @@
"type": "markdown"
},
{
- "artifact_sha256": "311f83fafe58266f910d9e73b7a99bab3304f30d33ee063c341d32f535a7e870",
+ "artifact_sha256": "fcd324c7ee7e3c2e28778369d80490cb05b240e5b7ceb0f23bbe8879478df7db",
"emitter": "generate-docs",
- "framework_version": "5.6.2",
+ "framework_version": "5.7.0",
"path": "ls/docs/WORKFLOW_REGISTRY.md",
- "provenance_hash": "c54679d3c6f4b49db62d3d2766cbf6be76e8f3ed358215878b9a9d5791e6e91d",
- "source_commit": "121d921de0bc14c99475633986c457cf3d57d5ce",
+ "provenance_hash": "0a731df435bdcd861541bd11f986b448155685e4639d890701c34cfe4d196086",
+ "source_commit": "7aa27482de3a6482c9d7d524dea6f991730a737e",
"source_inputs": [
"VERSION",
"ls/skills",
@@ -89,12 +89,12 @@
"type": "markdown"
},
{
- "artifact_sha256": "88306fe4f0fe2f8f0bef77bf25751931f0c2b7572ff508ad63e328a6108cdc41",
+ "artifact_sha256": "48ee4b8cf068153b370f4de8013fc2bd9e35173f9317b66d5319ad8e481a5a0c",
"emitter": "generate-docs",
- "framework_version": "5.6.2",
+ "framework_version": "5.7.0",
"path": "ls/docs/_generated/docs-alignment-summary.md",
- "provenance_hash": "c54679d3c6f4b49db62d3d2766cbf6be76e8f3ed358215878b9a9d5791e6e91d",
- "source_commit": "121d921de0bc14c99475633986c457cf3d57d5ce",
+ "provenance_hash": "0a731df435bdcd861541bd11f986b448155685e4639d890701c34cfe4d196086",
+ "source_commit": "7aa27482de3a6482c9d7d524dea6f991730a737e",
"source_inputs": [
"VERSION",
"ls/skills",
@@ -111,12 +111,12 @@
"type": "markdown"
},
{
- "artifact_sha256": "84af109b376bc052bc0e8d27b9aad3a8f709e485419dc90c176eb5536d9a6031",
+ "artifact_sha256": "cde8db1135a0b2f02dfcdc4a278529fddc685831a4dcc214a351629228923a5d",
"emitter": "generate-docs",
- "framework_version": "5.6.2",
+ "framework_version": "5.7.0",
"path": "ls/docs/_generated/docs-asset-manifest.json",
- "provenance_hash": "c54679d3c6f4b49db62d3d2766cbf6be76e8f3ed358215878b9a9d5791e6e91d",
- "source_commit": "121d921de0bc14c99475633986c457cf3d57d5ce",
+ "provenance_hash": "0a731df435bdcd861541bd11f986b448155685e4639d890701c34cfe4d196086",
+ "source_commit": "7aa27482de3a6482c9d7d524dea6f991730a737e",
"source_inputs": [
"VERSION",
"ls/skills",
@@ -133,12 +133,12 @@
"type": "json"
},
{
- "artifact_sha256": "91945ffb6543b0d0c9917db3437ab8b2d804dcaba9d194e03c90749b55a1b9ca",
+ "artifact_sha256": "aabbacf38dfdfa7e33215bc1fd0a02e4380650789bf64c69a913c101e375e1d6",
"emitter": "generate-docs",
- "framework_version": "5.6.2",
+ "framework_version": "5.7.0",
"path": "ls/docs/_generated/docs-audit-result.json",
- "provenance_hash": "c54679d3c6f4b49db62d3d2766cbf6be76e8f3ed358215878b9a9d5791e6e91d",
- "source_commit": "121d921de0bc14c99475633986c457cf3d57d5ce",
+ "provenance_hash": "0a731df435bdcd861541bd11f986b448155685e4639d890701c34cfe4d196086",
+ "source_commit": "7aa27482de3a6482c9d7d524dea6f991730a737e",
"source_inputs": [
"VERSION",
"ls/skills",
@@ -155,12 +155,12 @@
"type": "json"
},
{
- "artifact_sha256": "9ba1a30dd1f31560582fab935afaac0dc09314d807c94abe84693f5a49f21ad3",
+ "artifact_sha256": "8d8c1f349a039da89bd028862139222b89050b54a177e03b72d0b3de1451da64",
"emitter": "generate-docs",
- "framework_version": "5.6.2",
+ "framework_version": "5.7.0",
"path": "ls/docs/_generated/docs-inventory.json",
- "provenance_hash": "c54679d3c6f4b49db62d3d2766cbf6be76e8f3ed358215878b9a9d5791e6e91d",
- "source_commit": "121d921de0bc14c99475633986c457cf3d57d5ce",
+ "provenance_hash": "0a731df435bdcd861541bd11f986b448155685e4639d890701c34cfe4d196086",
+ "source_commit": "7aa27482de3a6482c9d7d524dea6f991730a737e",
"source_inputs": [
"VERSION",
"ls/skills",
@@ -177,12 +177,12 @@
"type": "json"
},
{
- "artifact_sha256": "c241ef534812ffc5568db1b240be45680b0c4501f6ca55d3d63a929e21ba148b",
+ "artifact_sha256": "ca83ace1d8a1ef2b938bc61b410b0b04871ced50fef3cb5620dd91f54023d286",
"emitter": "generate-docs",
- "framework_version": "5.6.2",
+ "framework_version": "5.7.0",
"path": "ls/docs/_generated/docs-truth-map.json",
- "provenance_hash": "c54679d3c6f4b49db62d3d2766cbf6be76e8f3ed358215878b9a9d5791e6e91d",
- "source_commit": "121d921de0bc14c99475633986c457cf3d57d5ce",
+ "provenance_hash": "0a731df435bdcd861541bd11f986b448155685e4639d890701c34cfe4d196086",
+ "source_commit": "7aa27482de3a6482c9d7d524dea6f991730a737e",
"source_inputs": [
"VERSION",
"ls/skills",
@@ -199,12 +199,12 @@
"type": "json"
},
{
- "artifact_sha256": "35213b12c6553cacbd194bec1f1f773862f8b9ca7a36e5c2f5b718bc6733bba2",
+ "artifact_sha256": "62f98bc2eacd848a8b5944143f98df75951612c43f5af575facaa957cfaa914e",
"emitter": "generate-docs",
- "framework_version": "5.6.2",
+ "framework_version": "5.7.0",
"path": "ls/docs/_generated/facts.json",
- "provenance_hash": "c54679d3c6f4b49db62d3d2766cbf6be76e8f3ed358215878b9a9d5791e6e91d",
- "source_commit": "121d921de0bc14c99475633986c457cf3d57d5ce",
+ "provenance_hash": "0a731df435bdcd861541bd11f986b448155685e4639d890701c34cfe4d196086",
+ "source_commit": "7aa27482de3a6482c9d7d524dea6f991730a737e",
"source_inputs": [
"VERSION",
"ls/skills",
@@ -221,12 +221,12 @@
"type": "json"
},
{
- "artifact_sha256": "02d30fbe9707c69a8cadcfe965b43bed11674514a18b30536abe321df0ffdd35",
+ "artifact_sha256": "300b8e8e0a9fc18e72ad251c3dcdc4a7c287a0899ff1e72c805ffcdb061f66e0",
"emitter": "generate-docs",
- "framework_version": "5.6.2",
+ "framework_version": "5.7.0",
"path": "ls/docs/_generated/implementation-file-map.md",
- "provenance_hash": "c54679d3c6f4b49db62d3d2766cbf6be76e8f3ed358215878b9a9d5791e6e91d",
- "source_commit": "121d921de0bc14c99475633986c457cf3d57d5ce",
+ "provenance_hash": "0a731df435bdcd861541bd11f986b448155685e4639d890701c34cfe4d196086",
+ "source_commit": "7aa27482de3a6482c9d7d524dea6f991730a737e",
"source_inputs": [
"VERSION",
"ls/skills",
@@ -243,12 +243,12 @@
"type": "markdown"
},
{
- "artifact_sha256": "6c7feb9e52be79c052eb3ca2e0ec58df20fcdb9225491a6987e3e808c296c8aa",
+ "artifact_sha256": "57d1516308171235ad4f81ccc659051262543f979003f4b030e07e5b2ab577a5",
"emitter": "generate-docs",
- "framework_version": "5.6.2",
+ "framework_version": "5.7.0",
"path": "ls/docs/_generated/platform-adapters.md",
- "provenance_hash": "c54679d3c6f4b49db62d3d2766cbf6be76e8f3ed358215878b9a9d5791e6e91d",
- "source_commit": "121d921de0bc14c99475633986c457cf3d57d5ce",
+ "provenance_hash": "0a731df435bdcd861541bd11f986b448155685e4639d890701c34cfe4d196086",
+ "source_commit": "7aa27482de3a6482c9d7d524dea6f991730a737e",
"source_inputs": [
"VERSION",
"ls/skills",
@@ -265,12 +265,12 @@
"type": "markdown"
},
{
- "artifact_sha256": "49a67b778525e4dcfc0c325e4374c1bfa5a950d6e8e9e9140e6e117a9c5ccb37",
+ "artifact_sha256": "0f949d07d02e7a19ded9234b9325d045cb56ac521ada73c32ed5f237f0c2cdb6",
"emitter": "generate-docs",
- "framework_version": "5.6.2",
+ "framework_version": "5.7.0",
"path": "ls/docs/_generated/plugin-packs.json",
- "provenance_hash": "c54679d3c6f4b49db62d3d2766cbf6be76e8f3ed358215878b9a9d5791e6e91d",
- "source_commit": "121d921de0bc14c99475633986c457cf3d57d5ce",
+ "provenance_hash": "0a731df435bdcd861541bd11f986b448155685e4639d890701c34cfe4d196086",
+ "source_commit": "7aa27482de3a6482c9d7d524dea6f991730a737e",
"source_inputs": [
"VERSION",
"ls/skills",
@@ -287,12 +287,12 @@
"type": "json"
},
{
- "artifact_sha256": "c1422576ac8c69488b342f360467afb09a9e4c408dcf98805b3dd1445ebf2e3e",
+ "artifact_sha256": "ce85d4a55be8b8af81c8a00a29c817c10dc7fd13ca2c0c517320b9ba3b4c7090",
"emitter": "generate-docs",
- "framework_version": "5.6.2",
+ "framework_version": "5.7.0",
"path": "ls/docs/_generated/plugin-packs.md",
- "provenance_hash": "c54679d3c6f4b49db62d3d2766cbf6be76e8f3ed358215878b9a9d5791e6e91d",
- "source_commit": "121d921de0bc14c99475633986c457cf3d57d5ce",
+ "provenance_hash": "0a731df435bdcd861541bd11f986b448155685e4639d890701c34cfe4d196086",
+ "source_commit": "7aa27482de3a6482c9d7d524dea6f991730a737e",
"source_inputs": [
"VERSION",
"ls/skills",
@@ -309,12 +309,12 @@
"type": "markdown"
},
{
- "artifact_sha256": "6edc8c20578eae1b2d01c97b85501261c6738c4472b303b3201f6d422c1c9508",
+ "artifact_sha256": "c94673a95e48f83e01df5ce4958b81e6f625e7f5b1feadde9b11e51f0cd98cb6",
"emitter": "generate-docs",
- "framework_version": "5.6.2",
+ "framework_version": "5.7.0",
"path": "ls/docs/_generated/skill-packs.md",
- "provenance_hash": "c54679d3c6f4b49db62d3d2766cbf6be76e8f3ed358215878b9a9d5791e6e91d",
- "source_commit": "121d921de0bc14c99475633986c457cf3d57d5ce",
+ "provenance_hash": "0a731df435bdcd861541bd11f986b448155685e4639d890701c34cfe4d196086",
+ "source_commit": "7aa27482de3a6482c9d7d524dea6f991730a737e",
"source_inputs": [
"VERSION",
"ls/skills",
@@ -331,12 +331,12 @@
"type": "markdown"
},
{
- "artifact_sha256": "520420fa1e25edd9057b0e77c1eec6ad785f243659455bcbffa8cd769086f7d3",
+ "artifact_sha256": "7a815af765d707bf4211000ca44c4e29a419e6405288e8507eecc5461c516044",
"emitter": "generate-docs",
- "framework_version": "5.6.2",
+ "framework_version": "5.7.0",
"path": "ls/docs/_generated/skill-taxonomy.json",
- "provenance_hash": "c54679d3c6f4b49db62d3d2766cbf6be76e8f3ed358215878b9a9d5791e6e91d",
- "source_commit": "121d921de0bc14c99475633986c457cf3d57d5ce",
+ "provenance_hash": "0a731df435bdcd861541bd11f986b448155685e4639d890701c34cfe4d196086",
+ "source_commit": "7aa27482de3a6482c9d7d524dea6f991730a737e",
"source_inputs": [
"VERSION",
"ls/skills",
@@ -353,12 +353,12 @@
"type": "json"
},
{
- "artifact_sha256": "4c05b0d788770b5c7645311721f4c174b25e3c78ec29978d38a5e92fe118fd61",
+ "artifact_sha256": "2593056b9847b357b479dfd8748c199869f3b9e2b27f37bbaf77a8d3cef37ad1",
"emitter": "generate-docs",
- "framework_version": "5.6.2",
+ "framework_version": "5.7.0",
"path": "ls/docs/_generated/skill_aliases.json",
- "provenance_hash": "c54679d3c6f4b49db62d3d2766cbf6be76e8f3ed358215878b9a9d5791e6e91d",
- "source_commit": "121d921de0bc14c99475633986c457cf3d57d5ce",
+ "provenance_hash": "0a731df435bdcd861541bd11f986b448155685e4639d890701c34cfe4d196086",
+ "source_commit": "7aa27482de3a6482c9d7d524dea6f991730a737e",
"source_inputs": [
"VERSION",
"ls/skills",
@@ -375,12 +375,12 @@
"type": "json"
},
{
- "artifact_sha256": "c8c3bcf8b643e637ba74e3e063f89a418a3b6ecbc6fdb129065c98eeacc86120",
+ "artifact_sha256": "6acf7664c1f4230f4d8368f80da3a5bda80f3f4916e3899f1efe77acbe74d988",
"emitter": "generate-docs",
- "framework_version": "5.6.2",
+ "framework_version": "5.7.0",
"path": "ls/docs/_generated/workflow-catalog.json",
- "provenance_hash": "c54679d3c6f4b49db62d3d2766cbf6be76e8f3ed358215878b9a9d5791e6e91d",
- "source_commit": "121d921de0bc14c99475633986c457cf3d57d5ce",
+ "provenance_hash": "0a731df435bdcd861541bd11f986b448155685e4639d890701c34cfe4d196086",
+ "source_commit": "7aa27482de3a6482c9d7d524dea6f991730a737e",
"source_inputs": [
"VERSION",
"ls/skills",
@@ -397,12 +397,12 @@
"type": "json"
},
{
- "artifact_sha256": "788037d06337ab93a68ccc61028e0fa85f8dc0d983bf6ac9b6e00c7079732fd8",
+ "artifact_sha256": "eb0a100cea6d613a91c49a88c3c77ceaa7cc31e09480c2611a3f634cb93a90a3",
"emitter": "generate-docs",
- "framework_version": "5.6.2",
+ "framework_version": "5.7.0",
"path": "ls/docs/migration/skill-alias-map.md",
- "provenance_hash": "c54679d3c6f4b49db62d3d2766cbf6be76e8f3ed358215878b9a9d5791e6e91d",
- "source_commit": "121d921de0bc14c99475633986c457cf3d57d5ce",
+ "provenance_hash": "0a731df435bdcd861541bd11f986b448155685e4639d890701c34cfe4d196086",
+ "source_commit": "7aa27482de3a6482c9d7d524dea6f991730a737e",
"source_inputs": [
"VERSION",
"ls/skills",
@@ -421,16 +421,16 @@
],
"provenance": {
"artifact_path": "ls/docs/_generated/artifact-registry.json",
- "artifact_sha256": "5a61a8170c7c27c652c620f12548073b9f02a218ca211813895cc63fbc5482c3",
+ "artifact_sha256": "11181184c3438232c5f0b5adc8041b936a9eb74f6b5fb8408ec5b86d6d3d0cc9",
"emitter": "generate-docs",
- "framework_version": "5.6.2",
+ "framework_version": "5.7.0",
"schema_version": 1,
- "source_commit": "121d921de0bc14c99475633986c457cf3d57d5ce",
+ "source_commit": "7aa27482de3a6482c9d7d524dea6f991730a737e",
"source_dirty": false,
- "source_provenance_hash": "c54679d3c6f4b49db62d3d2766cbf6be76e8f3ed358215878b9a9d5791e6e91d",
- "source_root_id": "972e16c4e6fb6bca5611c860994875b9b64aa3ac057956e4185dc374d8e6d2ea",
+ "source_provenance_hash": "0a731df435bdcd861541bd11f986b448155685e4639d890701c34cfe4d196086",
+ "source_root_id": "0c1208a61679eaa48c37bd16d4e2d427e2c53d81bb3d38eb0d4aee23932e382c",
"source_tag": null,
- "source_tree_sha": "ca3f62d207ec2f6e02798c312278224c32c3d0d9"
+ "source_tree_sha": "f3077853769401596e2fc8dade0a34d075525d32"
},
"schema_version": 1
}
diff --git a/ls/docs/_generated/docs-alignment-summary.md b/ls/docs/_generated/docs-alignment-summary.md
index 83001fe57..790c305e6 100644
--- a/ls/docs/_generated/docs-alignment-summary.md
+++ b/ls/docs/_generated/docs-alignment-summary.md
@@ -1,14 +1,14 @@
---
status: ACTIVE
-version: 5.6
+version: 5.7
owner_package: docs-align
localsetup_provenance:
schema_version: 1
- source_provenance_hash: c54679d3c6f4b49db62d3d2766cbf6be76e8f3ed358215878b9a9d5791e6e91d
+ source_provenance_hash: 0a731df435bdcd861541bd11f986b448155685e4639d890701c34cfe4d196086
emitter: docs-align
-framework_version: 5.6.2
-source_commit: 121d921de0bc14c99475633986c457cf3d57d5ce
-artifact_sha256: b640c32e943e37e59236006deb175d862ab632b8a7718a6df40821d6fed05f1a
+framework_version: 5.7.0
+source_commit: 7aa27482de3a6482c9d7d524dea6f991730a737e
+artifact_sha256: 4ef62bae25e4c25d161ef5611be29f098e1adc96e3cbc573a4bf0a8837ea8dbe
---
# Documentation Alignment Summary
@@ -16,8 +16,8 @@ This page is generated from repository inventory, source-truth manifests, asset
| Signal | Value |
|---|---:|
-| Version | `5.6.2` |
-| Documentation files inventoried | 510 |
+| Version | `5.7.0` |
+| Documentation files inventoried | 512 |
| Immutable upstream documents | 64 |
| Shipped skills | 105 |
| Workflow packages | 18 |
diff --git a/ls/docs/_generated/docs-asset-manifest.json b/ls/docs/_generated/docs-asset-manifest.json
index 261119192..2e12325e4 100644
--- a/ls/docs/_generated/docs-asset-manifest.json
+++ b/ls/docs/_generated/docs-asset-manifest.json
@@ -3,10 +3,26 @@
{
"alt_text_required": true,
"dimensions": {
- "height": 1024,
- "width": 1536
+ "height": 740,
+ "width": 1280
},
- "license": "Repository license unless otherwise documented",
+ "license": "Crux Experts LLC private asset terms; see [visual asset rights](brand/ASSET_LICENSE.md)",
+ "path": "assets/localsetup-architecture-dark.png",
+ "provenance": "repository-maintained asset",
+ "references": [
+ "README.md",
+ "ls/README.md",
+ "ls/docs/README.md"
+ ],
+ "type": "png"
+ },
+ {
+ "alt_text_required": true,
+ "dimensions": {
+ "height": 740,
+ "width": 1280
+ },
+ "license": "Crux Experts LLC private asset terms; see [visual asset rights](brand/ASSET_LICENSE.md)",
"path": "assets/localsetup-architecture.png",
"provenance": "repository-maintained asset",
"references": [
@@ -19,10 +35,26 @@
{
"alt_text_required": true,
"dimensions": {
- "height": 1024,
- "width": 1536
+ "height": 760,
+ "width": 1280
},
- "license": "Repository license unless otherwise documented",
+ "license": "Crux Experts LLC private asset terms; see [visual asset rights](brand/ASSET_LICENSE.md)",
+ "path": "assets/localsetup-install-lifecycle-dark.png",
+ "provenance": "repository-maintained asset",
+ "references": [
+ "README.md",
+ "ls/README.md",
+ "ls/docs/MULTI_PLATFORM_INSTALL.md"
+ ],
+ "type": "png"
+ },
+ {
+ "alt_text_required": true,
+ "dimensions": {
+ "height": 760,
+ "width": 1280
+ },
+ "license": "Crux Experts LLC private asset terms; see [visual asset rights](brand/ASSET_LICENSE.md)",
"path": "assets/localsetup-install-lifecycle.png",
"provenance": "repository-maintained asset",
"references": [
@@ -49,10 +81,24 @@
{
"alt_text_required": true,
"dimensions": {
- "height": 1024,
- "width": 1536
+ "height": 400,
+ "width": 1280
},
- "license": "Repository license unless otherwise documented",
+ "license": "Crux Experts LLC private asset terms; see [visual asset rights](brand/ASSET_LICENSE.md)",
+ "path": "assets/localsetup-readme-hero-dark.png",
+ "provenance": "repository-maintained asset",
+ "references": [
+ "README.md"
+ ],
+ "type": "png"
+ },
+ {
+ "alt_text_required": true,
+ "dimensions": {
+ "height": 400,
+ "width": 1280
+ },
+ "license": "Crux Experts LLC private asset terms; see [visual asset rights](brand/ASSET_LICENSE.md)",
"path": "assets/localsetup-readme-hero.png",
"provenance": "repository-maintained asset",
"references": [
@@ -61,19 +107,19 @@
"type": "png"
}
],
- "count": 4,
+ "count": 7,
"provenance": {
"artifact_path": "ls/docs/_generated/docs-asset-manifest.json",
- "artifact_sha256": "ac0d30f46e4711d5fdfeac55bde4e268784918f7ae7f3703942230e59cd90282",
+ "artifact_sha256": "f2228883dbd18ae5996b2e66baff63b8819d7dfe101463396cc354fb8e46083f",
"emitter": "docs-align",
- "framework_version": "5.6.2",
+ "framework_version": "5.7.0",
"schema_version": 1,
- "source_commit": "121d921de0bc14c99475633986c457cf3d57d5ce",
+ "source_commit": "7aa27482de3a6482c9d7d524dea6f991730a737e",
"source_dirty": false,
- "source_provenance_hash": "c54679d3c6f4b49db62d3d2766cbf6be76e8f3ed358215878b9a9d5791e6e91d",
- "source_root_id": "972e16c4e6fb6bca5611c860994875b9b64aa3ac057956e4185dc374d8e6d2ea",
+ "source_provenance_hash": "0a731df435bdcd861541bd11f986b448155685e4639d890701c34cfe4d196086",
+ "source_root_id": "0c1208a61679eaa48c37bd16d4e2d427e2c53d81bb3d38eb0d4aee23932e382c",
"source_tag": null,
- "source_tree_sha": "ca3f62d207ec2f6e02798c312278224c32c3d0d9"
+ "source_tree_sha": "f3077853769401596e2fc8dade0a34d075525d32"
},
"schema_version": "1.0"
}
diff --git a/ls/docs/_generated/docs-audit-result.json b/ls/docs/_generated/docs-audit-result.json
index de89ea843..e99800ed6 100644
--- a/ls/docs/_generated/docs-audit-result.json
+++ b/ls/docs/_generated/docs-audit-result.json
@@ -9,14 +9,14 @@
"artifact_path": "ls/docs/_generated/docs-audit-result.json",
"artifact_sha256": "e82619e42f31266261fa11fa954df7778b2d19b7f12d224a71a85ec1a8cf31a8",
"emitter": "docs-align",
- "framework_version": "5.6.2",
+ "framework_version": "5.7.0",
"schema_version": 1,
- "source_commit": "121d921de0bc14c99475633986c457cf3d57d5ce",
+ "source_commit": "7aa27482de3a6482c9d7d524dea6f991730a737e",
"source_dirty": false,
- "source_provenance_hash": "c54679d3c6f4b49db62d3d2766cbf6be76e8f3ed358215878b9a9d5791e6e91d",
- "source_root_id": "972e16c4e6fb6bca5611c860994875b9b64aa3ac057956e4185dc374d8e6d2ea",
+ "source_provenance_hash": "0a731df435bdcd861541bd11f986b448155685e4639d890701c34cfe4d196086",
+ "source_root_id": "0c1208a61679eaa48c37bd16d4e2d427e2c53d81bb3d38eb0d4aee23932e382c",
"source_tag": null,
- "source_tree_sha": "ca3f62d207ec2f6e02798c312278224c32c3d0d9"
+ "source_tree_sha": "f3077853769401596e2fc8dade0a34d075525d32"
},
"schema_version": "1.0"
}
diff --git a/ls/docs/_generated/docs-inventory.json b/ls/docs/_generated/docs-inventory.json
index 8d1f5fc54..fe721872b 100644
--- a/ls/docs/_generated/docs-inventory.json
+++ b/ls/docs/_generated/docs-inventory.json
@@ -3,10 +3,26 @@
{
"alt_text_required": true,
"dimensions": {
- "height": 1024,
- "width": 1536
+ "height": 740,
+ "width": 1280
},
- "license": "Repository license unless otherwise documented",
+ "license": "Crux Experts LLC private asset terms; see [visual asset rights](brand/ASSET_LICENSE.md)",
+ "path": "assets/localsetup-architecture-dark.png",
+ "provenance": "repository-maintained asset",
+ "references": [
+ "README.md",
+ "ls/README.md",
+ "ls/docs/README.md"
+ ],
+ "type": "png"
+ },
+ {
+ "alt_text_required": true,
+ "dimensions": {
+ "height": 740,
+ "width": 1280
+ },
+ "license": "Crux Experts LLC private asset terms; see [visual asset rights](brand/ASSET_LICENSE.md)",
"path": "assets/localsetup-architecture.png",
"provenance": "repository-maintained asset",
"references": [
@@ -19,10 +35,26 @@
{
"alt_text_required": true,
"dimensions": {
- "height": 1024,
- "width": 1536
+ "height": 760,
+ "width": 1280
},
- "license": "Repository license unless otherwise documented",
+ "license": "Crux Experts LLC private asset terms; see [visual asset rights](brand/ASSET_LICENSE.md)",
+ "path": "assets/localsetup-install-lifecycle-dark.png",
+ "provenance": "repository-maintained asset",
+ "references": [
+ "README.md",
+ "ls/README.md",
+ "ls/docs/MULTI_PLATFORM_INSTALL.md"
+ ],
+ "type": "png"
+ },
+ {
+ "alt_text_required": true,
+ "dimensions": {
+ "height": 760,
+ "width": 1280
+ },
+ "license": "Crux Experts LLC private asset terms; see [visual asset rights](brand/ASSET_LICENSE.md)",
"path": "assets/localsetup-install-lifecycle.png",
"provenance": "repository-maintained asset",
"references": [
@@ -49,10 +81,24 @@
{
"alt_text_required": true,
"dimensions": {
- "height": 1024,
- "width": 1536
+ "height": 400,
+ "width": 1280
},
- "license": "Repository license unless otherwise documented",
+ "license": "Crux Experts LLC private asset terms; see [visual asset rights](brand/ASSET_LICENSE.md)",
+ "path": "assets/localsetup-readme-hero-dark.png",
+ "provenance": "repository-maintained asset",
+ "references": [
+ "README.md"
+ ],
+ "type": "png"
+ },
+ {
+ "alt_text_required": true,
+ "dimensions": {
+ "height": 400,
+ "width": 1280
+ },
+ "license": "Crux Experts LLC private asset terms; see [visual asset rights](brand/ASSET_LICENSE.md)",
"path": "assets/localsetup-readme-hero.png",
"provenance": "repository-maintained asset",
"references": [
@@ -129,8 +175,8 @@
"workflow"
],
"counts": {
- "docs": 510,
- "framework_docs": 85,
+ "docs": 512,
+ "framework_docs": 86,
"generated_docs": 5,
"platforms": 20,
"public_docs": 6,
@@ -303,6 +349,16 @@
"status": "",
"version": ""
},
+ {
+ "class": "other",
+ "has_frontmatter": false,
+ "managed_blocks": [],
+ "owner_package": "",
+ "owner_skill": "",
+ "path": "assets/brand/ASSET_LICENSE.md",
+ "status": "",
+ "version": ""
+ },
{
"class": "public",
"has_frontmatter": false,
@@ -323,7 +379,7 @@
"owner_skill": "ls-framework-compliance",
"path": "ls/docs/ADAPTER_OWNERSHIP.md",
"status": "ACTIVE",
- "version": "5.6"
+ "version": "5.7"
},
{
"class": "framework",
@@ -333,7 +389,7 @@
"owner_skill": "ls-agentq-transport",
"path": "ls/docs/AGENTIC_AGENT_Q_BIDIRECTIONAL_BUILD_SPEC.md",
"status": "ACTIVE",
- "version": "5.6"
+ "version": "5.7"
},
{
"class": "framework",
@@ -343,7 +399,7 @@
"owner_skill": "ls-agentq-transport",
"path": "ls/docs/AGENTIC_AGENT_Q_PATTERN.md",
"status": "ACTIVE",
- "version": "5.6"
+ "version": "5.7"
},
{
"class": "framework",
@@ -353,7 +409,7 @@
"owner_skill": "ls-agentq-transport",
"path": "ls/docs/AGENTIC_AGENT_Q_SCENARIOS.md",
"status": "ACTIVE",
- "version": "5.6"
+ "version": "5.7"
},
{
"class": "framework",
@@ -363,7 +419,7 @@
"owner_skill": "ls-agentq-transport",
"path": "ls/docs/AGENTIC_AGENT_TO_AGENT_PROTOCOL.md",
"status": "ACTIVE",
- "version": "5.6"
+ "version": "5.7"
},
{
"class": "framework",
@@ -373,7 +429,7 @@
"owner_skill": "ls-docs-organization",
"path": "ls/docs/AGENTIC_DESIGN_INDEX.md",
"status": "ACTIVE",
- "version": "5.6"
+ "version": "5.7"
},
{
"class": "framework",
@@ -383,7 +439,7 @@
"owner_skill": "",
"path": "ls/docs/AGENTIC_UMBRELLA_WORKFLOWS.md",
"status": "ACTIVE",
- "version": "5.6"
+ "version": "5.7"
},
{
"class": "framework",
@@ -393,7 +449,7 @@
"owner_skill": "ls-context-index",
"path": "ls/docs/AGENT_CONTEXT_AND_MCP_CONTRACT.md",
"status": "ACTIVE",
- "version": "5.6"
+ "version": "5.7"
},
{
"class": "framework",
@@ -403,7 +459,7 @@
"owner_skill": "ls-skill-creator",
"path": "ls/docs/AGENT_SKILLS_COMPLIANCE.md",
"status": "ACTIVE",
- "version": "5.6"
+ "version": "5.7"
},
{
"class": "framework",
@@ -413,7 +469,7 @@
"owner_skill": "ls-script-and-docs-quality",
"path": "ls/docs/BRANDING.md",
"status": "ACTIVE",
- "version": "5.6"
+ "version": "5.7"
},
{
"class": "framework",
@@ -423,7 +479,7 @@
"owner_skill": "ls-framework-compliance",
"path": "ls/docs/CLIENT_INTEGRATION_METADATA.md",
"status": "ACTIVE",
- "version": "5.6"
+ "version": "5.7"
},
{
"class": "framework",
@@ -433,7 +489,7 @@
"owner_skill": "ls-framework-compliance",
"path": "ls/docs/CLIENT_STATE.md",
"status": "ACTIVE",
- "version": "5.6"
+ "version": "5.7"
},
{
"class": "framework",
@@ -443,7 +499,7 @@
"owner_skill": "ls-framework-compliance",
"path": "ls/docs/CLI_SKILLS_ENV.md",
"status": "ACTIVE",
- "version": "5.6"
+ "version": "5.7"
},
{
"class": "framework",
@@ -453,7 +509,7 @@
"owner_skill": "",
"path": "ls/docs/CODEX_GITHUB_ISSUE_GOAL_LOOP.md",
"status": "ACTIVE",
- "version": "5.6"
+ "version": "5.7"
},
{
"class": "framework",
@@ -463,7 +519,7 @@
"owner_skill": "ls-framework-compliance",
"path": "ls/docs/COMMAND_REFERENCE.md",
"status": "ACTIVE",
- "version": "5.6"
+ "version": "5.7"
},
{
"class": "framework",
@@ -473,7 +529,7 @@
"owner_skill": "",
"path": "ls/docs/DECISION_TREE_WORKFLOW.md",
"status": "ACTIVE",
- "version": "5.6"
+ "version": "5.7"
},
{
"class": "framework",
@@ -483,7 +539,7 @@
"owner_skill": "ls-documentation-alignment",
"path": "ls/docs/DOCUMENT_LIFECYCLE_MANAGEMENT.md",
"status": "ACTIVE",
- "version": "5.6"
+ "version": "5.7"
},
{
"class": "framework",
@@ -493,7 +549,7 @@
"owner_skill": "ls-architecture",
"path": "ls/docs/ENVMAN_INTEGRATION_CONTRACT.md",
"status": "ACTIVE",
- "version": "5.6"
+ "version": "5.7"
},
{
"class": "framework",
@@ -505,7 +561,7 @@
"owner_skill": "ls-docs-organization",
"path": "ls/docs/FEATURES.md",
"status": "ACTIVE",
- "version": "5.6"
+ "version": "5.7"
},
{
"class": "framework",
@@ -515,7 +571,7 @@
"owner_skill": "ls-architecture",
"path": "ls/docs/FRAMEWORK_LIBRARY_ARCHITECTURE.md",
"status": "ACTIVE",
- "version": "5.6"
+ "version": "5.7"
},
{
"class": "framework",
@@ -525,7 +581,7 @@
"owner_skill": "ls-task-skill-matcher",
"path": "ls/docs/FRONTEND_WEB_APP_SKILL_ROUTING.md",
"status": "ACTIVE",
- "version": "5.6"
+ "version": "5.7"
},
{
"class": "framework",
@@ -535,7 +591,7 @@
"owner_skill": "ls-git-workflows",
"path": "ls/docs/GIT_TRACEABILITY.md",
"status": "ACTIVE",
- "version": "5.6"
+ "version": "5.7"
},
{
"class": "framework",
@@ -545,7 +601,7 @@
"owner_skill": "ls-framework-compliance",
"path": "ls/docs/GLOBAL_HANDOFF_LEDGER.md",
"status": "ACTIVE",
- "version": "5.6"
+ "version": "5.7"
},
{
"class": "framework",
@@ -555,7 +611,7 @@
"owner_skill": "ls-codex-heartbeat",
"path": "ls/docs/HARNESS_AUTOMATION.md",
"status": "ACTIVE",
- "version": "5.6"
+ "version": "5.7"
},
{
"class": "framework",
@@ -565,7 +621,7 @@
"owner_skill": "ls-script-and-docs-quality",
"path": "ls/docs/INPUT_HARDENING_STANDARD.md",
"status": "ACTIVE",
- "version": "5.6"
+ "version": "5.7"
},
{
"class": "framework",
@@ -575,7 +631,7 @@
"owner_skill": "ls-architecture",
"path": "ls/docs/LSCLI.md",
"status": "ACTIVE",
- "version": "5.6"
+ "version": "5.7"
},
{
"class": "framework",
@@ -585,7 +641,7 @@
"owner_skill": "ls-architecture",
"path": "ls/docs/LSCLI_QUALIFICATION.md",
"status": "ACTIVE",
- "version": "5.6"
+ "version": "5.7"
},
{
"class": "framework",
@@ -595,7 +651,7 @@
"owner_skill": "ls-architecture",
"path": "ls/docs/LSCLI_RUNTIME.md",
"status": "ACTIVE",
- "version": "5.6"
+ "version": "5.7"
},
{
"class": "framework",
@@ -605,7 +661,7 @@
"owner_skill": "ls-framework-compliance",
"path": "ls/docs/MULTI_PLATFORM_INSTALL.md",
"status": "ACTIVE",
- "version": "5.6"
+ "version": "5.7"
},
{
"class": "framework",
@@ -615,7 +671,7 @@
"owner_skill": "ls-system-design",
"path": "ls/docs/NODE_DASHBOARD_CONTROL_BOUNDARY.md",
"status": "ACTIVE",
- "version": "5.6"
+ "version": "5.7"
},
{
"class": "framework",
@@ -625,7 +681,7 @@
"owner_skill": "ls-agentq-transport",
"path": "ls/docs/OPENPGP_RUNTIME.md",
"status": "ACTIVE",
- "version": "5.6"
+ "version": "5.7"
},
{
"class": "framework",
@@ -635,7 +691,7 @@
"owner_skill": "ls-script-and-docs-quality",
"path": "ls/docs/OUTPUT_AND_DOC_GENERATION.md",
"status": "ACTIVE",
- "version": "5.6"
+ "version": "5.7"
},
{
"class": "framework",
@@ -645,7 +701,7 @@
"owner_skill": "ls-framework-compliance",
"path": "ls/docs/PLATFORM_REGISTRY.md",
"status": "ACTIVE",
- "version": "5.6"
+ "version": "5.7"
},
{
"class": "framework",
@@ -655,7 +711,7 @@
"owner_skill": "ls-docs-organization",
"path": "ls/docs/PLUGIN_PACKS.md",
"status": "ACTIVE",
- "version": "5.6"
+ "version": "5.7"
},
{
"class": "framework",
@@ -665,7 +721,7 @@
"owner_skill": "ls-agentq-transport",
"path": "ls/docs/PRD_SCHEMA_EXTERNAL_AGENT_GUIDE.md",
"status": "ACTIVE",
- "version": "5.6"
+ "version": "5.7"
},
{
"class": "framework",
@@ -675,7 +731,7 @@
"owner_skill": "ls-script-and-docs-quality",
"path": "ls/docs/PYTHON_ARCHITECTURE_STANDARD.md",
"status": "ACTIVE",
- "version": "5.6"
+ "version": "5.7"
},
{
"class": "framework",
@@ -685,7 +741,7 @@
"owner_skill": "ls-framework-compliance",
"path": "ls/docs/QUICKSTART.md",
"status": "ACTIVE",
- "version": "5.6"
+ "version": "5.7"
},
{
"class": "framework",
@@ -698,7 +754,7 @@
"owner_skill": "ls-docs-organization",
"path": "ls/docs/README.md",
"status": "ACTIVE",
- "version": "5.6"
+ "version": "5.7"
},
{
"class": "framework",
@@ -708,7 +764,7 @@
"owner_skill": "ls-framework-compliance",
"path": "ls/docs/REPO_AND_DATA_SEPARATION.md",
"status": "ACTIVE",
- "version": "5.6"
+ "version": "5.7"
},
{
"class": "framework",
@@ -718,7 +774,7 @@
"owner_skill": "",
"path": "ls/docs/REPO_CONVERSION.md",
"status": "ACTIVE",
- "version": "5.6"
+ "version": "5.7"
},
{
"class": "framework",
@@ -728,7 +784,7 @@
"owner_skill": "ls-framework-compliance",
"path": "ls/docs/REPO_MAINTENANCE.md",
"status": "ACTIVE",
- "version": "5.6"
+ "version": "5.7"
},
{
"class": "framework",
@@ -738,7 +794,7 @@
"owner_skill": "ls-architecture",
"path": "ls/docs/SDK_FORK.md",
"status": "ACTIVE",
- "version": "5.6"
+ "version": "5.7"
},
{
"class": "framework",
@@ -748,7 +804,7 @@
"owner_skill": "",
"path": "ls/docs/SKILLS.md",
"status": "ACTIVE",
- "version": "5.6"
+ "version": "5.7"
},
{
"class": "framework",
@@ -758,7 +814,7 @@
"owner_skill": "ls-task-skill-matcher",
"path": "ls/docs/SKILLS_AND_RULES.md",
"status": "ACTIVE",
- "version": "5.6"
+ "version": "5.7"
},
{
"class": "framework",
@@ -768,7 +824,7 @@
"owner_skill": "ls-skill-discovery",
"path": "ls/docs/SKILL_DISCOVERY.md",
"status": "ACTIVE",
- "version": "5.6"
+ "version": "5.7"
},
{
"class": "framework",
@@ -778,7 +834,7 @@
"owner_skill": "ls-skill-importer",
"path": "ls/docs/SKILL_IMPORTING.md",
"status": "ACTIVE",
- "version": "5.6"
+ "version": "5.7"
},
{
"class": "framework",
@@ -788,7 +844,7 @@
"owner_skill": "ls-skill-creator",
"path": "ls/docs/SKILL_INTEROPERABILITY.md",
"status": "ACTIVE",
- "version": "5.6"
+ "version": "5.7"
},
{
"class": "framework",
@@ -798,7 +854,7 @@
"owner_skill": "ls-skill-normalizer",
"path": "ls/docs/SKILL_NORMALIZATION.md",
"status": "ACTIVE",
- "version": "5.6"
+ "version": "5.7"
},
{
"class": "framework",
@@ -808,7 +864,7 @@
"owner_skill": "ls-skill-vetter",
"path": "ls/docs/SKILL_VALIDATION_PATTERNS.md",
"status": "ACTIVE",
- "version": "5.6"
+ "version": "5.7"
},
{
"class": "framework",
@@ -818,7 +874,7 @@
"owner_skill": "ls-backblaze",
"path": "ls/docs/STORAGE_SKILLS.md",
"status": "ACTIVE",
- "version": "5.6"
+ "version": "5.7"
},
{
"class": "framework",
@@ -828,7 +884,7 @@
"owner_skill": "ls-task-skill-matcher",
"path": "ls/docs/TASK_SKILL_MATCHING.md",
"status": "ACTIVE",
- "version": "5.6"
+ "version": "5.7"
},
{
"class": "framework",
@@ -838,7 +894,7 @@
"owner_skill": "",
"path": "ls/docs/TMUX_TERMINAL_MODE.md",
"status": "ACTIVE",
- "version": "5.6"
+ "version": "5.7"
},
{
"class": "framework",
@@ -848,7 +904,7 @@
"owner_skill": "ls-script-and-docs-quality",
"path": "ls/docs/TOOLING_POLICY.md",
"status": "ACTIVE",
- "version": "5.6"
+ "version": "5.7"
},
{
"class": "framework",
@@ -858,7 +914,7 @@
"owner_skill": "ls-architecture",
"path": "ls/docs/TRUSTED_WORK_QUEUE.md",
"status": "ACTIVE",
- "version": "5.6"
+ "version": "5.7"
},
{
"class": "framework",
@@ -868,7 +924,7 @@
"owner_skill": "ls-automatic-versioning",
"path": "ls/docs/VERSIONING.md",
"status": "ACTIVE",
- "version": "5.6"
+ "version": "5.7"
},
{
"class": "framework",
@@ -878,7 +934,7 @@
"owner_skill": "ls-docs-organization",
"path": "ls/docs/WORKFLOW_PACKAGES.md",
"status": "ACTIVE",
- "version": "5.6"
+ "version": "5.7"
},
{
"class": "framework",
@@ -888,7 +944,7 @@
"owner_skill": "",
"path": "ls/docs/WORKFLOW_QUICK_REF.md",
"status": "ACTIVE",
- "version": "5.6"
+ "version": "5.7"
},
{
"class": "framework",
@@ -898,7 +954,7 @@
"owner_skill": "",
"path": "ls/docs/WORKFLOW_REGISTRY.md",
"status": "ACTIVE",
- "version": "5.6"
+ "version": "5.7"
},
{
"class": "framework",
@@ -908,7 +964,7 @@
"owner_skill": "",
"path": "ls/docs/WORKFLOW_SKILLS_REVIEW_BUILD_SPEC.md",
"status": "DEPRECATED",
- "version": "5.6"
+ "version": "5.7"
},
{
"class": "framework",
@@ -918,7 +974,7 @@
"owner_skill": "ls-framework-compliance",
"path": "ls/docs/WORKFLOW_STANDARD.md",
"status": "ACTIVE",
- "version": "5.6"
+ "version": "5.7"
},
{
"class": "generated",
@@ -928,7 +984,7 @@
"owner_skill": "",
"path": "ls/docs/_generated/docs-alignment-summary.md",
"status": "ACTIVE",
- "version": "5.6"
+ "version": "5.7"
},
{
"class": "generated",
@@ -1058,7 +1114,7 @@
"owner_skill": "ls-framework-compliance",
"path": "ls/docs/bootstrap-packs/INDEX.md",
"status": "ACTIVE",
- "version": "5.6"
+ "version": "5.7"
},
{
"class": "framework",
@@ -1068,7 +1124,7 @@
"owner_skill": "ls-framework-compliance",
"path": "ls/docs/bootstrap-packs/codex-agent-team/AUDIT_PROMPT.md",
"status": "ACTIVE",
- "version": "5.6"
+ "version": "5.7"
},
{
"class": "framework",
@@ -1078,7 +1134,7 @@
"owner_skill": "ls-framework-compliance",
"path": "ls/docs/bootstrap-packs/codex-agent-team/README.md",
"status": "ACTIVE",
- "version": "5.6"
+ "version": "5.7"
},
{
"class": "framework",
@@ -1088,7 +1144,7 @@
"owner_skill": "ls-framework-compliance",
"path": "ls/docs/bootstrap-packs/opencode-agent-team/AUDIT_PROMPT.md",
"status": "ACTIVE",
- "version": "5.6"
+ "version": "5.7"
},
{
"class": "framework",
@@ -1098,7 +1154,7 @@
"owner_skill": "ls-framework-compliance",
"path": "ls/docs/bootstrap-packs/opencode-agent-team/MODEL_MAP.md",
"status": "ACTIVE",
- "version": "5.6"
+ "version": "5.7"
},
{
"class": "framework",
@@ -1108,7 +1164,7 @@
"owner_skill": "ls-framework-compliance",
"path": "ls/docs/bootstrap-packs/opencode-agent-team/README.md",
"status": "ACTIVE",
- "version": "5.6"
+ "version": "5.7"
},
{
"class": "framework",
@@ -1128,7 +1184,7 @@
"owner_skill": "ls-framework-compliance",
"path": "ls/docs/migration/overview.md",
"status": "ACTIVE",
- "version": "5.6"
+ "version": "5.7"
},
{
"class": "framework",
@@ -1138,7 +1194,7 @@
"owner_skill": "",
"path": "ls/docs/migration/skill-alias-map.md",
"status": "ACTIVE",
- "version": "5.6"
+ "version": "5.7"
},
{
"class": "framework",
@@ -1148,7 +1204,7 @@
"owner_skill": "",
"path": "ls/docs/ops/tmux-ops-managed.md",
"status": "ACTIVE",
- "version": "5.6"
+ "version": "5.7"
},
{
"class": "framework",
@@ -1158,7 +1214,7 @@
"owner_skill": "",
"path": "ls/docs/ops/tmux-ops-remote.md",
"status": "ACTIVE",
- "version": "5.6"
+ "version": "5.7"
},
{
"class": "framework",
@@ -1210,6 +1266,16 @@
"status": "ACTIVE",
"version": "5.6"
},
+ {
+ "class": "framework",
+ "has_frontmatter": true,
+ "managed_blocks": [],
+ "owner_package": "",
+ "owner_skill": "ls-github-publishing-workflow",
+ "path": "ls/docs/releases/5.7.0.md",
+ "status": "ACTIVE",
+ "version": "5.7"
+ },
{
"class": "framework",
"has_frontmatter": true,
@@ -1218,7 +1284,7 @@
"owner_skill": "ls-scrapling",
"path": "ls/docs/scrapling-cheat-sheet.md",
"status": "ACTIVE",
- "version": "5.6"
+ "version": "5.7"
},
{
"class": "skill",
@@ -5695,16 +5761,16 @@
],
"provenance": {
"artifact_path": "ls/docs/_generated/docs-inventory.json",
- "artifact_sha256": "cf7b1e3eee23c587d6d3d3207fb01e63da10900edff42c947dde3ed3792dbc9f",
+ "artifact_sha256": "1edbbd24f1281f86b08d5f68793d0810d2c11b2e08a98e09918151cd0cd5669d",
"emitter": "docs-align",
- "framework_version": "5.6.2",
+ "framework_version": "5.7.0",
"schema_version": 1,
- "source_commit": "121d921de0bc14c99475633986c457cf3d57d5ce",
+ "source_commit": "7aa27482de3a6482c9d7d524dea6f991730a737e",
"source_dirty": false,
- "source_provenance_hash": "c54679d3c6f4b49db62d3d2766cbf6be76e8f3ed358215878b9a9d5791e6e91d",
- "source_root_id": "972e16c4e6fb6bca5611c860994875b9b64aa3ac057956e4185dc374d8e6d2ea",
+ "source_provenance_hash": "0a731df435bdcd861541bd11f986b448155685e4639d890701c34cfe4d196086",
+ "source_root_id": "0c1208a61679eaa48c37bd16d4e2d427e2c53d81bb3d38eb0d4aee23932e382c",
"source_tag": null,
- "source_tree_sha": "ca3f62d207ec2f6e02798c312278224c32c3d0d9"
+ "source_tree_sha": "f3077853769401596e2fc8dade0a34d075525d32"
},
"repo": ".",
"schema_version": "1.0",
diff --git a/ls/docs/_generated/docs-truth-map.json b/ls/docs/_generated/docs-truth-map.json
index f56800e73..95b18311f 100644
--- a/ls/docs/_generated/docs-truth-map.json
+++ b/ls/docs/_generated/docs-truth-map.json
@@ -1,6 +1,6 @@
{
"generated_facts": {
- "major_minor": "5.6",
+ "major_minor": "5.7",
"platform_count": 20,
"platforms": [
{
@@ -126,16 +126,16 @@
],
"provenance": {
"artifact_path": "ls/docs/_generated/facts.json",
- "artifact_sha256": "e2e7724c95299fe1d0011c818471f63ae39929c837dba9bd6af81e91fba7a7fc",
+ "artifact_sha256": "a9acdb6e5728c8b888857f6b72d4890899497405698d3be71b8420e5babdbe88",
"emitter": "generate-docs",
- "framework_version": "5.6.2",
+ "framework_version": "5.7.0",
"schema_version": 1,
- "source_commit": "121d921de0bc14c99475633986c457cf3d57d5ce",
+ "source_commit": "7aa27482de3a6482c9d7d524dea6f991730a737e",
"source_dirty": false,
- "source_provenance_hash": "c54679d3c6f4b49db62d3d2766cbf6be76e8f3ed358215878b9a9d5791e6e91d",
- "source_root_id": "972e16c4e6fb6bca5611c860994875b9b64aa3ac057956e4185dc374d8e6d2ea",
+ "source_provenance_hash": "0a731df435bdcd861541bd11f986b448155685e4639d890701c34cfe4d196086",
+ "source_root_id": "0c1208a61679eaa48c37bd16d4e2d427e2c53d81bb3d38eb0d4aee23932e382c",
"source_tag": null,
- "source_tree_sha": "ca3f62d207ec2f6e02798c312278224c32c3d0d9"
+ "source_tree_sha": "f3077853769401596e2fc8dade0a34d075525d32"
},
"skill_count": 105,
"skills": [
@@ -1879,7 +1879,7 @@
"version": "1.0"
}
],
- "version": "5.6.2",
+ "version": "5.7.0",
"workflow_count": 18,
"workflows": [
{
@@ -2007,14 +2007,14 @@
"artifact_path": "ls/docs/_generated/skill-taxonomy.json",
"artifact_sha256": "6dbaf28f6a3169d873c87830a966e298aba185cb24fa376de49f7c60d04288a9",
"emitter": "generate-docs",
- "framework_version": "5.6.2",
+ "framework_version": "5.7.0",
"schema_version": 1,
- "source_commit": "121d921de0bc14c99475633986c457cf3d57d5ce",
+ "source_commit": "7aa27482de3a6482c9d7d524dea6f991730a737e",
"source_dirty": false,
- "source_provenance_hash": "c54679d3c6f4b49db62d3d2766cbf6be76e8f3ed358215878b9a9d5791e6e91d",
- "source_root_id": "972e16c4e6fb6bca5611c860994875b9b64aa3ac057956e4185dc374d8e6d2ea",
+ "source_provenance_hash": "0a731df435bdcd861541bd11f986b448155685e4639d890701c34cfe4d196086",
+ "source_root_id": "0c1208a61679eaa48c37bd16d4e2d427e2c53d81bb3d38eb0d4aee23932e382c",
"source_tag": null,
- "source_tree_sha": "ca3f62d207ec2f6e02798c312278224c32c3d0d9"
+ "source_tree_sha": "f3077853769401596e2fc8dade0a34d075525d32"
},
"schema_version": 1,
"skills": [
@@ -3551,16 +3551,16 @@
},
"provenance": {
"artifact_path": "ls/docs/_generated/docs-truth-map.json",
- "artifact_sha256": "f49792a0368b6393d0ecbad6381fa77f33322cdac11385a8f1a5028587770447",
+ "artifact_sha256": "058ea7ad06de9edb4f52891ca754f3e7c02cc2f3b2c85bfc846dbbf044901675",
"emitter": "docs-align",
- "framework_version": "5.6.2",
+ "framework_version": "5.7.0",
"schema_version": 1,
- "source_commit": "121d921de0bc14c99475633986c457cf3d57d5ce",
+ "source_commit": "7aa27482de3a6482c9d7d524dea6f991730a737e",
"source_dirty": false,
- "source_provenance_hash": "c54679d3c6f4b49db62d3d2766cbf6be76e8f3ed358215878b9a9d5791e6e91d",
- "source_root_id": "972e16c4e6fb6bca5611c860994875b9b64aa3ac057956e4185dc374d8e6d2ea",
+ "source_provenance_hash": "0a731df435bdcd861541bd11f986b448155685e4639d890701c34cfe4d196086",
+ "source_root_id": "0c1208a61679eaa48c37bd16d4e2d427e2c53d81bb3d38eb0d4aee23932e382c",
"source_tag": null,
- "source_tree_sha": "ca3f62d207ec2f6e02798c312278224c32c3d0d9"
+ "source_tree_sha": "f3077853769401596e2fc8dade0a34d075525d32"
},
"schema_version": "1.0",
"truths": {
@@ -3979,6 +3979,11 @@
"owner_skill": "ls-github-publishing-workflow",
"path": "ls/docs/releases/5.6.2.md"
},
+ {
+ "owner_package": "",
+ "owner_skill": "ls-github-publishing-workflow",
+ "path": "ls/docs/releases/5.7.0.md"
+ },
{
"owner_package": "",
"owner_skill": "ls-scrapling",
@@ -3990,7 +3995,7 @@
"sources": [
"VERSION"
],
- "value": "5.6"
+ "value": "5.7"
},
"platform_count": {
"sources": [
@@ -5556,14 +5561,14 @@
}
},
"version": {
- "facts_version": "5.6.2",
- "pyproject_version": "5.6.2",
+ "facts_version": "5.7.0",
+ "pyproject_version": "5.7.0",
"sources": [
"VERSION",
"pyproject.toml",
"ls/docs/_generated/facts.json"
],
- "value": "5.6.2"
+ "value": "5.7.0"
},
"workflow_catalog": {
"sources": [
diff --git a/ls/docs/_generated/facts.json b/ls/docs/_generated/facts.json
index 97ec746a8..a48d35217 100644
--- a/ls/docs/_generated/facts.json
+++ b/ls/docs/_generated/facts.json
@@ -1,5 +1,5 @@
{
- "major_minor": "5.6",
+ "major_minor": "5.7",
"platform_count": 20,
"platforms": [
{
@@ -125,16 +125,16 @@
],
"provenance": {
"artifact_path": "ls/docs/_generated/facts.json",
- "artifact_sha256": "e2e7724c95299fe1d0011c818471f63ae39929c837dba9bd6af81e91fba7a7fc",
+ "artifact_sha256": "a9acdb6e5728c8b888857f6b72d4890899497405698d3be71b8420e5babdbe88",
"emitter": "generate-docs",
- "framework_version": "5.6.2",
+ "framework_version": "5.7.0",
"schema_version": 1,
- "source_commit": "121d921de0bc14c99475633986c457cf3d57d5ce",
+ "source_commit": "7aa27482de3a6482c9d7d524dea6f991730a737e",
"source_dirty": false,
- "source_provenance_hash": "c54679d3c6f4b49db62d3d2766cbf6be76e8f3ed358215878b9a9d5791e6e91d",
- "source_root_id": "972e16c4e6fb6bca5611c860994875b9b64aa3ac057956e4185dc374d8e6d2ea",
+ "source_provenance_hash": "0a731df435bdcd861541bd11f986b448155685e4639d890701c34cfe4d196086",
+ "source_root_id": "0c1208a61679eaa48c37bd16d4e2d427e2c53d81bb3d38eb0d4aee23932e382c",
"source_tag": null,
- "source_tree_sha": "ca3f62d207ec2f6e02798c312278224c32c3d0d9"
+ "source_tree_sha": "f3077853769401596e2fc8dade0a34d075525d32"
},
"skill_count": 105,
"skills": [
@@ -1878,7 +1878,7 @@
"version": "1.0"
}
],
- "version": "5.6.2",
+ "version": "5.7.0",
"workflow_count": 18,
"workflows": [
{
diff --git a/ls/docs/_generated/implementation-file-map.md b/ls/docs/_generated/implementation-file-map.md
index a0bc5b9d5..9a3f00f84 100644
--- a/ls/docs/_generated/implementation-file-map.md
+++ b/ls/docs/_generated/implementation-file-map.md
@@ -1,11 +1,11 @@
---
localsetup_provenance:
schema_version: 1
- source_provenance_hash: c54679d3c6f4b49db62d3d2766cbf6be76e8f3ed358215878b9a9d5791e6e91d
+ source_provenance_hash: 0a731df435bdcd861541bd11f986b448155685e4639d890701c34cfe4d196086
emitter: generate-docs
-framework_version: 5.6.2
-source_commit: 121d921de0bc14c99475633986c457cf3d57d5ce
-artifact_sha256: 48c680ab78ace2c66ff43458985c04234269eb82be193b284d0aaf17ad5fd167
+framework_version: 5.7.0
+source_commit: 7aa27482de3a6482c9d7d524dea6f991730a737e
+artifact_sha256: 5e586a1e3ba3ced3bcabcc1981302aa99e2073783394e0c92887899f623224db
---
# Implementation File Map
@@ -65,9 +65,18 @@ artifact_sha256: 48c680ab78ace2c66ff43458985c04234269eb82be193b284d0aaf17ad5fd16
| `keep` | `VERSION` |
| `keep` | `agent-repo-shape.json` |
| `keep` | `assets/README.md` |
+| `keep` | `assets/brand/ASSET_LICENSE.md` |
+| `keep` | `assets/brand/font-lock.json` |
+| `keep` | `assets/brand/fonts/JetBrainsMono-Regular.ttf` |
+| `keep` | `assets/brand/fonts/JetBrainsMono-SemiBold.ttf` |
+| `keep` | `assets/brand/fonts/OFL.txt` |
+| `keep` | `assets/brand/tokens.json` |
+| `keep` | `assets/localsetup-architecture-dark.png` |
| `keep` | `assets/localsetup-architecture.png` |
+| `keep` | `assets/localsetup-install-lifecycle-dark.png` |
| `keep` | `assets/localsetup-install-lifecycle.png` |
| `keep` | `assets/localsetup-logo.png` |
+| `keep` | `assets/localsetup-readme-hero-dark.png` |
| `keep` | `assets/localsetup-readme-hero.png` |
| `keep` | `config/localsetup_finalizer.yaml` |
| `keep` | `docs.config.yaml` |
@@ -582,6 +591,8 @@ artifact_sha256: 48c680ab78ace2c66ff43458985c04234269eb82be193b284d0aaf17ad5fd16
| `keep` | `ls/docs/releases/4.4.0.md` |
| `keep` | `ls/docs/releases/5.6.2.json` |
| `keep` | `ls/docs/releases/5.6.2.md` |
+| `keep` | `ls/docs/releases/5.7.0.json` |
+| `keep` | `ls/docs/releases/5.7.0.md` |
| `keep` | `ls/docs/scrapling-cheat-sheet.md` |
| `keep` | `ls/lib/data_paths.sh` |
| `keep` | `ls/lib/deps.py` |
@@ -1494,6 +1505,7 @@ artifact_sha256: 48c680ab78ace2c66ff43458985c04234269eb82be193b284d0aaf17ad5fd16
| `keep` | `ls/tools/python_architecture_check.py` |
| `keep` | `ls/tools/refresh_public_skill_index.py` |
| `keep` | `ls/tools/release_docs.py` |
+| `keep` | `ls/tools/render_brand_graphics.py` |
| `keep` | `ls/tools/scrapling_helper/__init__.py` |
| `keep` | `ls/tools/scrapling_helper/adapter_parser.py` |
| `keep` | `ls/tools/scrapling_helper/adapter_state.py` |
diff --git a/ls/docs/_generated/platform-adapters.md b/ls/docs/_generated/platform-adapters.md
index 97abdcf47..270258db4 100644
--- a/ls/docs/_generated/platform-adapters.md
+++ b/ls/docs/_generated/platform-adapters.md
@@ -1,10 +1,10 @@
---
localsetup_provenance:
schema_version: 1
- source_provenance_hash: c54679d3c6f4b49db62d3d2766cbf6be76e8f3ed358215878b9a9d5791e6e91d
+ source_provenance_hash: 0a731df435bdcd861541bd11f986b448155685e4639d890701c34cfe4d196086
emitter: generate-docs
-framework_version: 5.6.2
-source_commit: 121d921de0bc14c99475633986c457cf3d57d5ce
+framework_version: 5.7.0
+source_commit: 7aa27482de3a6482c9d7d524dea6f991730a737e
artifact_sha256: 5ce4949227d75f75f72c4ce822e3c0e7958e57a16acf1fdc16a050a35da5d212
---
# Platform Adapters
diff --git a/ls/docs/_generated/plugin-packs.json b/ls/docs/_generated/plugin-packs.json
index 0e2d62ef3..bdba1571c 100644
--- a/ls/docs/_generated/plugin-packs.json
+++ b/ls/docs/_generated/plugin-packs.json
@@ -384,14 +384,14 @@
"artifact_path": "ls/docs/_generated/plugin-packs.json",
"artifact_sha256": "10694f65c9b3a5ec0b56c979b22c85c6ef175b19cb7ae8e109c32047db071763",
"emitter": "generate-docs",
- "framework_version": "5.6.2",
+ "framework_version": "5.7.0",
"schema_version": 1,
- "source_commit": "121d921de0bc14c99475633986c457cf3d57d5ce",
+ "source_commit": "7aa27482de3a6482c9d7d524dea6f991730a737e",
"source_dirty": false,
- "source_provenance_hash": "c54679d3c6f4b49db62d3d2766cbf6be76e8f3ed358215878b9a9d5791e6e91d",
- "source_root_id": "972e16c4e6fb6bca5611c860994875b9b64aa3ac057956e4185dc374d8e6d2ea",
+ "source_provenance_hash": "0a731df435bdcd861541bd11f986b448155685e4639d890701c34cfe4d196086",
+ "source_root_id": "0c1208a61679eaa48c37bd16d4e2d427e2c53d81bb3d38eb0d4aee23932e382c",
"source_tag": null,
- "source_tree_sha": "ca3f62d207ec2f6e02798c312278224c32c3d0d9"
+ "source_tree_sha": "f3077853769401596e2fc8dade0a34d075525d32"
},
"schema_version": 1
}
diff --git a/ls/docs/_generated/plugin-packs.md b/ls/docs/_generated/plugin-packs.md
index 07f1fca08..16712d0da 100644
--- a/ls/docs/_generated/plugin-packs.md
+++ b/ls/docs/_generated/plugin-packs.md
@@ -1,10 +1,10 @@
---
localsetup_provenance:
schema_version: 1
- source_provenance_hash: c54679d3c6f4b49db62d3d2766cbf6be76e8f3ed358215878b9a9d5791e6e91d
+ source_provenance_hash: 0a731df435bdcd861541bd11f986b448155685e4639d890701c34cfe4d196086
emitter: generate-docs
-framework_version: 5.6.2
-source_commit: 121d921de0bc14c99475633986c457cf3d57d5ce
+framework_version: 5.7.0
+source_commit: 7aa27482de3a6482c9d7d524dea6f991730a737e
artifact_sha256: e02a483284c21311b7766cc75341dc0cb10a976eae377fd1ee429ba8c33b7800
---
# Plugin Packs
diff --git a/ls/docs/_generated/skill-packs.md b/ls/docs/_generated/skill-packs.md
index 4c12cadf7..8dab50e61 100644
--- a/ls/docs/_generated/skill-packs.md
+++ b/ls/docs/_generated/skill-packs.md
@@ -1,10 +1,10 @@
---
localsetup_provenance:
schema_version: 1
- source_provenance_hash: c54679d3c6f4b49db62d3d2766cbf6be76e8f3ed358215878b9a9d5791e6e91d
+ source_provenance_hash: 0a731df435bdcd861541bd11f986b448155685e4639d890701c34cfe4d196086
emitter: generate-docs
-framework_version: 5.6.2
-source_commit: 121d921de0bc14c99475633986c457cf3d57d5ce
+framework_version: 5.7.0
+source_commit: 7aa27482de3a6482c9d7d524dea6f991730a737e
artifact_sha256: 7d82d4aff296de701c4b807383efd1a29c91da98d571fc81f31c8f544d3d7e04
---
# Skill And Workflow Packs
diff --git a/ls/docs/_generated/skill-taxonomy.json b/ls/docs/_generated/skill-taxonomy.json
index 942f3d4bd..1e704a3aa 100644
--- a/ls/docs/_generated/skill-taxonomy.json
+++ b/ls/docs/_generated/skill-taxonomy.json
@@ -13,14 +13,14 @@
"artifact_path": "ls/docs/_generated/skill-taxonomy.json",
"artifact_sha256": "6dbaf28f6a3169d873c87830a966e298aba185cb24fa376de49f7c60d04288a9",
"emitter": "generate-docs",
- "framework_version": "5.6.2",
+ "framework_version": "5.7.0",
"schema_version": 1,
- "source_commit": "121d921de0bc14c99475633986c457cf3d57d5ce",
+ "source_commit": "7aa27482de3a6482c9d7d524dea6f991730a737e",
"source_dirty": false,
- "source_provenance_hash": "c54679d3c6f4b49db62d3d2766cbf6be76e8f3ed358215878b9a9d5791e6e91d",
- "source_root_id": "972e16c4e6fb6bca5611c860994875b9b64aa3ac057956e4185dc374d8e6d2ea",
+ "source_provenance_hash": "0a731df435bdcd861541bd11f986b448155685e4639d890701c34cfe4d196086",
+ "source_root_id": "0c1208a61679eaa48c37bd16d4e2d427e2c53d81bb3d38eb0d4aee23932e382c",
"source_tag": null,
- "source_tree_sha": "ca3f62d207ec2f6e02798c312278224c32c3d0d9"
+ "source_tree_sha": "f3077853769401596e2fc8dade0a34d075525d32"
},
"schema_version": 1,
"skills": [
diff --git a/ls/docs/_generated/skill_aliases.json b/ls/docs/_generated/skill_aliases.json
index 3b21074f2..403404026 100644
--- a/ls/docs/_generated/skill_aliases.json
+++ b/ls/docs/_generated/skill_aliases.json
@@ -108,13 +108,13 @@
"artifact_path": "ls/docs/_generated/skill_aliases.json",
"artifact_sha256": "1722c982e3a57fba80937413be0cc2d4de4590e41b2b8d6a7f55d99bf0b9eaab",
"emitter": "generate-docs",
- "framework_version": "5.6.2",
+ "framework_version": "5.7.0",
"schema_version": 1,
- "source_commit": "121d921de0bc14c99475633986c457cf3d57d5ce",
+ "source_commit": "7aa27482de3a6482c9d7d524dea6f991730a737e",
"source_dirty": false,
- "source_provenance_hash": "c54679d3c6f4b49db62d3d2766cbf6be76e8f3ed358215878b9a9d5791e6e91d",
- "source_root_id": "972e16c4e6fb6bca5611c860994875b9b64aa3ac057956e4185dc374d8e6d2ea",
+ "source_provenance_hash": "0a731df435bdcd861541bd11f986b448155685e4639d890701c34cfe4d196086",
+ "source_root_id": "0c1208a61679eaa48c37bd16d4e2d427e2c53d81bb3d38eb0d4aee23932e382c",
"source_tag": null,
- "source_tree_sha": "ca3f62d207ec2f6e02798c312278224c32c3d0d9"
+ "source_tree_sha": "f3077853769401596e2fc8dade0a34d075525d32"
}
}
diff --git a/ls/docs/_generated/workflow-catalog.json b/ls/docs/_generated/workflow-catalog.json
index b5959c75a..9df4acd9f 100644
--- a/ls/docs/_generated/workflow-catalog.json
+++ b/ls/docs/_generated/workflow-catalog.json
@@ -4,14 +4,14 @@
"artifact_path": "ls/docs/_generated/workflow-catalog.json",
"artifact_sha256": "975b246dd410e6393fcd601f10bbad641470355afac42c64e00252a1c7bb7425",
"emitter": "generate-docs",
- "framework_version": "5.6.2",
+ "framework_version": "5.7.0",
"schema_version": 1,
- "source_commit": "121d921de0bc14c99475633986c457cf3d57d5ce",
+ "source_commit": "7aa27482de3a6482c9d7d524dea6f991730a737e",
"source_dirty": false,
- "source_provenance_hash": "c54679d3c6f4b49db62d3d2766cbf6be76e8f3ed358215878b9a9d5791e6e91d",
- "source_root_id": "972e16c4e6fb6bca5611c860994875b9b64aa3ac057956e4185dc374d8e6d2ea",
+ "source_provenance_hash": "0a731df435bdcd861541bd11f986b448155685e4639d890701c34cfe4d196086",
+ "source_root_id": "0c1208a61679eaa48c37bd16d4e2d427e2c53d81bb3d38eb0d4aee23932e382c",
"source_tag": null,
- "source_tree_sha": "ca3f62d207ec2f6e02798c312278224c32c3d0d9"
+ "source_tree_sha": "f3077853769401596e2fc8dade0a34d075525d32"
},
"workflows": [
{
diff --git a/ls/docs/bootstrap-packs/INDEX.md b/ls/docs/bootstrap-packs/INDEX.md
index 79dd8e5df..d2237cfb9 100644
--- a/ls/docs/bootstrap-packs/INDEX.md
+++ b/ls/docs/bootstrap-packs/INDEX.md
@@ -1,6 +1,6 @@
---
status: ACTIVE
-version: 5.6
+version: 5.7
owner_skill: ls-framework-compliance
---
diff --git a/ls/docs/bootstrap-packs/codex-agent-team/AUDIT_PROMPT.md b/ls/docs/bootstrap-packs/codex-agent-team/AUDIT_PROMPT.md
index ae3096f91..c77bb907e 100644
--- a/ls/docs/bootstrap-packs/codex-agent-team/AUDIT_PROMPT.md
+++ b/ls/docs/bootstrap-packs/codex-agent-team/AUDIT_PROMPT.md
@@ -1,6 +1,6 @@
---
status: ACTIVE
-version: 5.6
+version: 5.7
owner_skill: ls-framework-compliance
---
diff --git a/ls/docs/bootstrap-packs/codex-agent-team/README.md b/ls/docs/bootstrap-packs/codex-agent-team/README.md
index 5e4343767..b887ba847 100644
--- a/ls/docs/bootstrap-packs/codex-agent-team/README.md
+++ b/ls/docs/bootstrap-packs/codex-agent-team/README.md
@@ -1,6 +1,6 @@
---
status: ACTIVE
-version: 5.6
+version: 5.7
owner_skill: ls-framework-compliance
---
diff --git a/ls/docs/bootstrap-packs/opencode-agent-team/AUDIT_PROMPT.md b/ls/docs/bootstrap-packs/opencode-agent-team/AUDIT_PROMPT.md
index 0be9c5d58..0b741ad0c 100644
--- a/ls/docs/bootstrap-packs/opencode-agent-team/AUDIT_PROMPT.md
+++ b/ls/docs/bootstrap-packs/opencode-agent-team/AUDIT_PROMPT.md
@@ -1,6 +1,6 @@
---
status: ACTIVE
-version: 5.6
+version: 5.7
owner_skill: ls-framework-compliance
---
diff --git a/ls/docs/bootstrap-packs/opencode-agent-team/MODEL_MAP.md b/ls/docs/bootstrap-packs/opencode-agent-team/MODEL_MAP.md
index 94df1b90f..89da0a3bf 100644
--- a/ls/docs/bootstrap-packs/opencode-agent-team/MODEL_MAP.md
+++ b/ls/docs/bootstrap-packs/opencode-agent-team/MODEL_MAP.md
@@ -1,6 +1,6 @@
---
status: ACTIVE
-version: 5.6
+version: 5.7
owner_skill: ls-framework-compliance
---
diff --git a/ls/docs/bootstrap-packs/opencode-agent-team/README.md b/ls/docs/bootstrap-packs/opencode-agent-team/README.md
index 91ee6b3fd..aab48be37 100644
--- a/ls/docs/bootstrap-packs/opencode-agent-team/README.md
+++ b/ls/docs/bootstrap-packs/opencode-agent-team/README.md
@@ -1,6 +1,6 @@
---
status: ACTIVE
-version: 5.6
+version: 5.7
owner_skill: ls-framework-compliance
---
diff --git a/ls/docs/migration/overview.md b/ls/docs/migration/overview.md
index fbdb5fde4..c7515f115 100644
--- a/ls/docs/migration/overview.md
+++ b/ls/docs/migration/overview.md
@@ -1,6 +1,6 @@
---
status: ACTIVE
-version: 5.6
+version: 5.7
owner_skill: ls-framework-compliance
---
diff --git a/ls/docs/migration/skill-alias-map.md b/ls/docs/migration/skill-alias-map.md
index eba1b020c..ca7b017cd 100644
--- a/ls/docs/migration/skill-alias-map.md
+++ b/ls/docs/migration/skill-alias-map.md
@@ -1,14 +1,14 @@
---
status: ACTIVE
-version: 5.6
+version: 5.7
owner_package: generate-docs
localsetup_provenance:
schema_version: 1
- source_provenance_hash: c54679d3c6f4b49db62d3d2766cbf6be76e8f3ed358215878b9a9d5791e6e91d
+ source_provenance_hash: 0a731df435bdcd861541bd11f986b448155685e4639d890701c34cfe4d196086
emitter: generate-docs
-framework_version: 5.6.2
-source_commit: 121d921de0bc14c99475633986c457cf3d57d5ce
-artifact_sha256: f28c0e163236bde6801bb08141be5454176551927b06821dc54116e0689c65a1
+framework_version: 5.7.0
+source_commit: 7aa27482de3a6482c9d7d524dea6f991730a737e
+artifact_sha256: 7555ea774417ccfacfb2b6c66f3cf7488787788131ca57e75680795b46669590
---
# Skill Alias Map
diff --git a/ls/docs/ops/tmux-ops-managed.md b/ls/docs/ops/tmux-ops-managed.md
index eb42fefca..570f942e5 100644
--- a/ls/docs/ops/tmux-ops-managed.md
+++ b/ls/docs/ops/tmux-ops-managed.md
@@ -1,6 +1,6 @@
---
status: ACTIVE
-version: 5.6
+version: 5.7
owner_package: ls-workflow-ops-tmux-session
---
diff --git a/ls/docs/ops/tmux-ops-remote.md b/ls/docs/ops/tmux-ops-remote.md
index 32331ff2f..4c723308f 100644
--- a/ls/docs/ops/tmux-ops-remote.md
+++ b/ls/docs/ops/tmux-ops-remote.md
@@ -1,6 +1,6 @@
---
status: ACTIVE
-version: 5.6
+version: 5.7
owner_package: ls-workflow-ops-tmux-session
---
diff --git a/ls/docs/releases/5.7.0.json b/ls/docs/releases/5.7.0.json
new file mode 100644
index 000000000..8079c5e0e
--- /dev/null
+++ b/ls/docs/releases/5.7.0.json
@@ -0,0 +1,34 @@
+{
+ "schema_version": 1,
+ "version": "5.7.0",
+ "source_commit": "9a582770215b4322ac4e2b176ea5a2d4bb9012e4",
+ "baseline_tag": "v5.6.2",
+ "summary": "LocalSetup 5.7.0 gives its GitHub documentation a consistent light and dark visual identity. The README hero and current architecture and installation diagrams use the approved LocalSetup palette, mark, and typography while retaining their technical content and accessible descriptions.",
+ "highlights": [
+ {
+ "text": "**Theme-aware graphics:** The README hero, architecture diagram, and installation flow each have light and dark images selected by GitHub's color scheme. Existing light image paths remain valid.",
+ "evidence": ["README.md", "ls/docs/MULTI_PLATFORM_INSTALL.md", "assets/localsetup-readme-hero-dark.png"]
+ },
+ {
+ "text": "**Reproducible brand assets:** The graphics renderer uses approved tokens and pinned JetBrains Mono v2.304 Regular and SemiBold files. The original font license and hashes are recorded with the source.",
+ "evidence": ["ls/tools/render_brand_graphics.py", "assets/brand/tokens.json", "assets/brand/font-lock.json", "assets/brand/fonts/OFL.txt"]
+ },
+ {
+ "text": "**Asset inventory and brand contract:** Documentation checks recognize images in picture sources, and the brand guide records the visual rules and future AstroSite handoff. Nerd Font glyphs remain an optional site profile.",
+ "evidence": ["ls/core/docs_alignment/assets.py", "ls/core/docs_alignment/io.py", "ls/docs/BRANDING.md"]
+ }
+ ],
+ "compatibility": [
+ "The framework command and Python distribution remain `localsetup`; the integrated CLI remains `lscli`. No installation or runtime command changes are required for this visual update.",
+ "Existing light image filenames remain available for links and renderers that do not support theme selection. Historical release artwork is unchanged."
+ ],
+ "update": [
+ "Update a registered installation using the [quickstart instructions](https://github.com/CruxExperts/localsetup/blob/v5.7.0/ls/docs/QUICKSTART.md#update). The branding changes are visible in the repository documentation and do not require a configuration migration.",
+ "For graphics maintenance, use the [branding guide](https://github.com/CruxExperts/localsetup/blob/v5.7.0/ls/docs/BRANDING.md) and the pinned renderer. Keep the separate AstroSite implementation aligned with the documented visual contract."
+ ],
+ "verification": [
+ "Download `localsetup-v5.7.0.tar.gz`, `localsetup-v5.7.0.tar.gz.sha256`, and `localsetup-v5.7.0.tar.gz.cdx.json` together. Follow the [release guide verification steps](https://github.com/CruxExperts/localsetup/blob/v5.7.0/ls/docs/releases/5.7.0.md#verify-the-download) to run `verify-release` and confirm the signed `v5.7.0` tag points to the release commit.",
+ "Maintainers check the six graphics against the pinned renderer, validate archive and font hashes and licensing, inspect both GitHub color themes, and run the documentation and Python checks before publishing.",
+ "The GitHub repository description and social preview are presentation settings; the social image source remains in private maintenance state and is not part of the release archive."
+ ]
+}
diff --git a/ls/docs/releases/5.7.0.md b/ls/docs/releases/5.7.0.md
new file mode 100644
index 000000000..4a22db924
--- /dev/null
+++ b/ls/docs/releases/5.7.0.md
@@ -0,0 +1,45 @@
+---
+status: ACTIVE
+version: 5.7
+owner_skill: ls-github-publishing-workflow
+---
+
+# LocalSetup 5.7.0
+
+LocalSetup 5.7.0 gives its GitHub documentation a consistent light and dark visual identity. The README hero and current architecture and installation diagrams use the approved LocalSetup palette, mark, and typography while retaining their technical content and accessible descriptions.
+
+## Highlights
+
+- **Theme-aware graphics:** The README hero, architecture diagram, and installation flow each have light and dark images selected by GitHub's color scheme. Existing light image paths remain valid.
+- **Reproducible brand assets:** The graphics renderer uses approved tokens and pinned JetBrains Mono v2.304 Regular and SemiBold files. The original font license and hashes are recorded with the source.
+- **Asset inventory and brand contract:** Documentation checks recognize images in picture sources, and the brand guide records the visual rules and future AstroSite handoff. Nerd Font glyphs remain an optional site profile.
+
+After publication, see the [release and downloads](https://github.com/CruxExperts/localsetup/releases/tag/v5.7.0) for release assets.
+
+## Compatibility
+
+The framework command and Python distribution remain `localsetup`; the integrated CLI remains `lscli`. No installation or runtime command changes are required for this visual update.
+
+Existing light image filenames remain available for links and renderers that do not support theme selection. Historical release artwork is unchanged.
+
+## Update
+
+Update a registered installation using the [quickstart instructions](https://github.com/CruxExperts/localsetup/blob/v5.7.0/ls/docs/QUICKSTART.md#update). The branding changes are visible in the repository documentation and do not require a configuration migration.
+
+For graphics maintenance, use the [branding guide](https://github.com/CruxExperts/localsetup/blob/v5.7.0/ls/docs/BRANDING.md) and the pinned renderer. Keep the separate AstroSite implementation aligned with the documented visual contract.
+
+For installation and source refresh, read the [quickstart update instructions](../QUICKSTART.md#update). Adapter changes follow the [adapter ownership guide](../ADAPTER_OWNERSHIP.md).
+
+## Verify the download
+
+Download `localsetup-v5.7.0.tar.gz`, `localsetup-v5.7.0.tar.gz.sha256`, and `localsetup-v5.7.0.tar.gz.cdx.json` together. Follow the [release guide verification steps](https://github.com/CruxExperts/localsetup/blob/v5.7.0/ls/docs/releases/5.7.0.md#verify-the-download) to run `verify-release` and confirm the signed `v5.7.0` tag points to the release commit.
+
+Maintainers check the six graphics against the pinned renderer, validate archive and font hashes and licensing, inspect both GitHub color themes, and run the documentation and Python checks before publishing.
+
+The GitHub repository description and social preview are presentation settings; the social image source remains in private maintenance state and is not part of the release archive.
+
+Download the framework archive with both its `.sha256` checksum and `.cdx.json` SBOM sidecars. Keep all three files in the same directory before running `verify-release`.
+
+```bash
+uv run --locked python ls/tools/localsetup.py --source-root . verify-release /path/to/localsetup-v5.7.0.tar.gz
+```
diff --git a/ls/docs/scrapling-cheat-sheet.md b/ls/docs/scrapling-cheat-sheet.md
index 39e693961..adcf706a4 100644
--- a/ls/docs/scrapling-cheat-sheet.md
+++ b/ls/docs/scrapling-cheat-sheet.md
@@ -1,6 +1,6 @@
---
status: ACTIVE
-version: 5.6
+version: 5.7
owner_skill: ls-scrapling
---
diff --git a/ls/tests/test_docs_alignment.py b/ls/tests/test_docs_alignment.py
index c67c74697..c6c54134e 100644
--- a/ls/tests/test_docs_alignment.py
+++ b/ls/tests/test_docs_alignment.py
@@ -70,6 +70,27 @@ def test_public_inventory_excludes_untracked_local_notes(tmp_path: Path):
assert [path.name for path in _markdown_files(tmp_path)] == ["README.md"]
+def test_theme_picture_sources_are_counted_and_checked(tmp_path: Path) -> None:
+ from ls.core.docs_alignment.assets import collect_asset_manifest
+ from ls.core.docs_alignment.io import _markdown_links
+
+ (tmp_path / "assets").mkdir()
+ (tmp_path / "assets" / "hero-dark.png").write_bytes(b"dark")
+ (tmp_path / "assets" / "hero-light.png").write_bytes(b"light")
+ (tmp_path / "README.md").write_text(
+ ''
+ ' \n',
+ encoding="utf-8",
+ )
+ links = list(_markdown_links((tmp_path / "README.md").read_text()))
+ assert [target for kind, target, _, _ in links if kind == "source"] == [
+ "assets/hero-dark.png", "assets/hero-light.png"
+ ]
+ assets = collect_asset_manifest(tmp_path)["assets"]
+ assert all(asset["references"] == ["README.md"] for asset in assets)
+
+
def test_inventory_discovers_docs_assets_skills_workflows_and_ci(tmp_path: Path) -> None:
repo = copy_docs_alignment_repo(tmp_path)
payload = json.loads(run_tool(repo, "inventory").stdout)
diff --git a/ls/tests/test_versioning_release_push.py b/ls/tests/test_versioning_release_push.py
index 7487fef38..bcbc16dae 100644
--- a/ls/tests/test_versioning_release_push.py
+++ b/ls/tests/test_versioning_release_push.py
@@ -160,6 +160,23 @@ def test_prepare_version_sync_candidate_excludes_generated_source_outputs(tmp_pa
assert (repo / "VERSION").read_text(encoding="utf-8").strip() == target
+def test_version_sync_preserves_dated_audit_records(tmp_path: Path) -> None:
+ from ls.core.versioning_sync import update_doc_frontmatter_versions
+
+ audit = tmp_path / "ls" / "docs" / "audits" / "past-review" / "AUDIT_REPORT.md"
+ audit.parent.mkdir(parents=True)
+ original = "---\nstatus: ACTIVE\nversion: 1.2\ndate: 2026-05-10\n---\n\n# Past review\n"
+ audit.write_text(original, encoding="utf-8")
+ active = tmp_path / "ls" / "docs" / "BRANDING.md"
+ active.write_text("---\nstatus: ACTIVE\nversion: 1.2\n---\n\n# Branding\n", encoding="utf-8")
+
+ changed = update_doc_frontmatter_versions(tmp_path, SemVer.parse("1.3.0"))
+
+ assert changed == ["ls/docs/BRANDING.md"]
+ assert audit.read_text(encoding="utf-8") == original
+ assert "version: 1.3" in active.read_text(encoding="utf-8")
+
+
def test_publish_preflight_without_fix_refuses_dirty_worktree_without_write(tmp_path: Path) -> None:
repo = copy_full_repo(tmp_path)
remote = tmp_path / "remote.git"
diff --git a/ls/tools/render_brand_graphics.py b/ls/tools/render_brand_graphics.py
new file mode 100644
index 000000000..7997e2bee
--- /dev/null
+++ b/ls/tools/render_brand_graphics.py
@@ -0,0 +1,189 @@
+#!/usr/bin/env python3
+"""Render the README graphics from the approved LocalSetup visual tokens."""
+from __future__ import annotations
+
+import argparse
+import hashlib
+import html
+import io
+import json
+import os
+import subprocess
+import tempfile
+from pathlib import Path
+
+ROOT = Path(__file__).resolve().parents[2]
+BRAND = ROOT / "assets" / "brand"
+FONT_HASHES = {
+ "JetBrainsMono-Regular.ttf": "a0bf60ef0f83c5ed4d7a75d45838548b1f6873372dfac88f71804491898d138f",
+ "JetBrainsMono-SemiBold.ttf": "1b3bfa1ed5665a4ce3f9feb68d2d4e40e70bf8b4b7d9a3edd418f321b4e166a0",
+}
+RIGHTS = "Copyright © 2026 Crux Experts LLC"
+NOTICE = (
+ "Private asset. Property of Crux Experts LLC. Use, reproduction, modification, "
+ "distribution, or publication without prior written permission is prohibited."
+)
+
+
+def _text(x: int, y: int, value: str, *, size: int = 20, weight: int = 400,
+ fill: str, anchor: str = "start") -> str:
+ return (f'{html.escape(value)} ')
+
+
+def _frame(width: int, height: int, theme: dict, title: str, content: str) -> str:
+ return (f''
+ f'{RIGHTS}. https://www.cruxexperts.com/. {NOTICE} '
+ f' '
+ f'{content} ')
+
+
+def _brand_header(theme: dict, width: int) -> str:
+ accent, text, muted = theme["accent"], theme["text"], theme["muted"]
+ return (f'[LS] '
+ f''
+ f'L ocalS etup '
+ + _text(width - 56, 74, "REPO-LOCAL / CLI-FIRST", size=15, fill=muted, anchor="end"))
+
+
+def _hero(theme: dict, *, social: bool = False) -> str:
+ width, height = 1280, 640 if social else 400
+ accent, text, muted = theme["accent"], theme["text"], theme["muted"]
+ title_y = 272 if social else 192
+ rule_y = height - 93
+ content = _brand_header(theme, width)
+ content += _text(56, title_y, "Own your stack.", size=76 if social else 62, weight=600, fill=accent)
+ content += _text(56, title_y + 55, "A repo-local operating layer for coding agents.", size=24, fill=text)
+ if social:
+ content += _text(56, title_y + 103, "Skills. Context. Control.", size=22, fill=muted)
+ content += f' '
+ for x, label in ((56, "[01] READ"), (446, "[02] REVIEW"), (866, "[03] APPLY")):
+ content += _text(x, height - 46, label, size=18, fill=text)
+ return _frame(width, height, theme, "LocalSetup: Own your stack", content)
+
+
+def _card(theme: dict, x: int, y: int, width: int, number: str, title: str,
+ lines: tuple[str, ...]) -> str:
+ content = (f' ')
+ content += _text(x + 24, y + 48, f"[{number}]", size=22, weight=600, fill=theme["accent"])
+ content += _text(x + 24, y + 98, title, size=23, weight=600, fill=theme["text"])
+ content += f' '
+ for index, line in enumerate(lines):
+ content += _text(x + 24, y + 164 + index * 34, line, size=17, fill=theme["text"])
+ return content
+
+
+def _architecture(theme: dict) -> str:
+ content = _brand_header(theme, 1280)
+ content += _text(56, 157, "One source. Selected packages.", size=39, weight=600, fill=theme["accent"])
+ content += _text(56, 197, "Keep framework source separate from project adapters.", size=20, fill=theme["text"])
+ cards = (
+ ("01", "Source checkout", ("Skills + workflows", "Docs + templates")),
+ ("02", "LocalSetup CLI", ("Resolve selection", "Plan + apply")),
+ ("03", "Managed library", ("Selected packages", "Required dependencies")),
+ ("04", "Project adapters", ("Selected agent hosts", "Links or portable copies")),
+ )
+ for index, (number, title, lines) in enumerate(cards):
+ x = 56 + index * 306
+ content += _card(theme, x, 255, 274, number, title, lines)
+ if index < 3:
+ content += _text(x + 288, 414, "→", size=30, fill=theme["accent"])
+ content += (f' ')
+ content += _text(80, 614, "Verification • lock metadata • rollback records", size=19, fill=theme["text"])
+ content += _text(56, 692, "Custom project skills stay in place.", size=19, fill=theme["accent"])
+ return _frame(1280, 740, theme, "LocalSetup architecture", content)
+
+
+def _lifecycle(theme: dict) -> str:
+ content = _brand_header(theme, 1280)
+ content += _text(56, 157, "Inspect. Plan. Apply. Verify.", size=39, weight=600, fill=theme["accent"])
+ content += _text(56, 197, "A deliberate install, with a path back.", size=20, fill=theme["text"])
+ cards = (
+ ("01", "Inspect", ("doctor + context", "Understand the target")),
+ ("02", "Plan", ("Review selected", "changes")),
+ ("03", "Apply", ("install", "Write managed packages")),
+ ("04", "Verify", ("verify", "Check managed state")),
+ )
+ for index, (number, title, lines) in enumerate(cards):
+ x = 56 + index * 306
+ content += _card(theme, x, 255, 274, number, title, lines)
+ if index < 3:
+ content += _text(x + 288, 414, "→", size=30, fill=theme["accent"])
+ content += _text(513, 566, "Confirm scope before apply", size=17, fill=theme["accent"])
+ content += (f' ')
+ content += _text(80, 644, "Rollback restores recorded managed paths.", size=19, fill=theme["text"])
+ content += _text(56, 716, "Updates use the same ownership boundaries.", size=19, fill=theme["muted"])
+ return _frame(1280, 760, theme, "LocalSetup install lifecycle", content)
+
+
+def _font_config(path: Path) -> None:
+ path.write_text(
+ ''
+ '/etc/fonts/fonts.conf '
+ f'{html.escape(str(BRAND / "fonts"))} ',
+ encoding="utf-8",
+ )
+
+
+def render(*, check: bool, social_output: Path | None) -> None:
+ for name, expected in FONT_HASHES.items():
+ actual = hashlib.sha256((BRAND / "fonts" / name).read_bytes()).hexdigest()
+ if actual != expected:
+ raise RuntimeError(f"Font hash mismatch: {name}")
+ import cairosvg
+ from PIL import Image, PngImagePlugin
+
+ tokens = json.loads((BRAND / "tokens.json").read_text(encoding="utf-8"))
+ outputs: list[tuple[Path, str]] = []
+ for mode, theme in tokens["theme"].items():
+ outputs.extend([
+ (ROOT / "assets" / ("localsetup-readme-hero.png" if mode == "light" else "localsetup-readme-hero-dark.png"), _hero(theme)),
+ (ROOT / "assets" / ("localsetup-architecture.png" if mode == "light" else "localsetup-architecture-dark.png"), _architecture(theme)),
+ (ROOT / "assets" / ("localsetup-install-lifecycle.png" if mode == "light" else "localsetup-install-lifecycle-dark.png"), _lifecycle(theme)),
+ ])
+ if mode == "dark" and social_output is not None:
+ outputs.append((social_output, _hero(theme, social=True)))
+ with tempfile.TemporaryDirectory(prefix="brand-fontconfig-") as temporary:
+ config = Path(temporary) / "fonts.conf"
+ _font_config(config)
+ os.environ["FONTCONFIG_FILE"] = str(config)
+ for weight, style in (("regular", "Regular"), ("demibold", "SemiBold")):
+ resolved = subprocess.run(
+ ["fc-match", "-f", "%{family}|%{style}|%{file}", f"JetBrains Mono:weight={weight}"],
+ check=True, capture_output=True, text=True,
+ ).stdout
+ if "JetBrains Mono" not in resolved or f"JetBrainsMono-{style}.ttf" not in resolved:
+ raise RuntimeError(f"Font resolution failed for weight {weight}: {resolved}")
+ for path, svg in outputs:
+ data = cairosvg.svg2png(bytestring=svg.encode("utf-8"))
+ image = Image.open(io.BytesIO(data))
+ metadata = PngImagePlugin.PngInfo()
+ metadata.add_text("Copyright", RIGHTS)
+ metadata.add_text("Website", "https://www.cruxexperts.com/")
+ metadata.add_text("Usage Terms", NOTICE)
+ buffer = io.BytesIO()
+ image.save(buffer, format="PNG", pnginfo=metadata, optimize=False)
+ result = buffer.getvalue()
+ if check:
+ if not path.exists() or path.read_bytes() != result:
+ raise RuntimeError(f"Graphic differs from generated output: {path}")
+ else:
+ path.parent.mkdir(parents=True, exist_ok=True)
+ path.write_bytes(result)
+ print(f"{path}: {hashlib.sha256(result).hexdigest()}")
+
+
+def main() -> None:
+ parser = argparse.ArgumentParser(description=__doc__)
+ parser.add_argument("--check", action="store_true", help="verify committed graphics without writing")
+ parser.add_argument("--social-output", type=Path, help="write the dark GitHub preview to private maintenance state")
+ args = parser.parse_args()
+ render(check=args.check, social_output=args.social_output)
+
+
+if __name__ == "__main__":
+ main()
diff --git a/pyproject.toml b/pyproject.toml
index 141c2a2fb..2fe5d96be 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
[project]
name = "localsetup"
-version = "5.6.2"
+version = "5.7.0"
description = "Global-first LocalSetup skill pack manager"
requires-python = ">=3.12"
dependencies = [
@@ -35,6 +35,8 @@ sdk-build = [
"packaging==26.3",
]
dev = [
+ "cairosvg==2.9.1",
+ "pillow==12.3.0",
"pytest>=9.1.1",
"pytest-xdist>=3.6",
"setuptools==84.0.0",
diff --git a/uv.lock b/uv.lock
index ee31e8eac..99acd60f0 100644
--- a/uv.lock
+++ b/uv.lock
@@ -68,6 +68,34 @@ wheels = [
{ url = "https://files.pythonhosted.org/packages/9e/9d/96f9dee6d12eedf1c2b4264eefd59c7ac8cac10daadb9a7bfccc9ee881c6/botocore-1.43.89-py3-none-any.whl", hash = "sha256:d7211220c815427fe71225acc6909e4ab5dfab3b03770e72fd16cf9eb86b3d1a", size = 15768272, upload-time = "2026-09-04T19:24:49.769Z" },
]
+[[package]]
+name = "cairocffi"
+version = "1.7.1"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "cffi" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/70/c5/1a4dc131459e68a173cbdab5fad6b524f53f9c1ef7861b7698e998b837cc/cairocffi-1.7.1.tar.gz", hash = "sha256:2e48ee864884ec4a3a34bfa8c9ab9999f688286eb714a15a43ec9d068c36557b", size = 88096, upload-time = "2024-06-18T10:56:06.741Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/93/d8/ba13451aa6b745c49536e87b6bf8f629b950e84bd0e8308f7dc6883b67e2/cairocffi-1.7.1-py3-none-any.whl", hash = "sha256:9803a0e11f6c962f3b0ae2ec8ba6ae45e957a146a004697a1ac1bbf16b073b3f", size = 75611, upload-time = "2024-06-18T10:55:59.489Z" },
+]
+
+[[package]]
+name = "cairosvg"
+version = "2.9.1"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "cairocffi" },
+ { name = "cssselect2" },
+ { name = "defusedxml" },
+ { name = "pillow" },
+ { name = "tinycss2" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/c6/80/db62c0a96d2e55282c83524f6b1d02f09c7fd7f612e93bf83e30de1dc75c/cairosvg-2.9.1.tar.gz", hash = "sha256:861bc28ad97ce4f537d50eb3d6ee97a7afcccec9c61ac25c4e7d073fe409aec7", size = 41256, upload-time = "2026-09-07T10:35:09.563Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/41/51/8041c2e70649e5b7f2a0aedbbbd0609ac099cfaa0cbde2014279c9c05756/cairosvg-2.9.1-py3-none-any.whl", hash = "sha256:f91c5628e834be024a0ed4544d76261cd84016a4c73bcdf26c386495825c05a1", size = 46165, upload-time = "2026-09-07T10:35:07.952Z" },
+]
+
[[package]]
name = "certifi"
version = "2026.4.22"
@@ -266,6 +294,28 @@ wheels = [
{ url = "https://files.pythonhosted.org/packages/99/89/87ef49ffe383ef4e147d27b7bf2088fb0b54ea409dd87b5a89442e5828a5/cryptography-50.0.1-cp39-abi3-win_amd64.whl", hash = "sha256:55d16b1ef3ee0958d893a977b19777887e546c9954ea81b200c3301a864013f2", size = 3875429, upload-time = "2026-08-25T19:45:24.418Z" },
]
+[[package]]
+name = "cssselect2"
+version = "0.10.1"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "tinycss2" },
+ { name = "webencodings" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/06/00/2456b6b664c7a770989cbe3c352aac4eb962c938486f03a2e1255ae963c6/cssselect2-0.10.1.tar.gz", hash = "sha256:83b0d820ef589dabaf693289b647c2f5b410f76d285f56deba911ffa75a7b9d1", size = 35653, upload-time = "2026-08-31T21:57:42.59Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/bd/59/6b1daa3b94de8970e2a2787ba73616c2d0675d2f948ef4cad8bef7f21bc6/cssselect2-0.10.1-py3-none-any.whl", hash = "sha256:25cc4494d55985d6a6da359be48da6ce98c28dcbafa2314c383ace3fc32ec868", size = 15489, upload-time = "2026-08-31T21:57:41.162Z" },
+]
+
+[[package]]
+name = "defusedxml"
+version = "0.7.1"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/0f/d5/c66da9b79e5bdb124974bfe172b4daf3c984ebd9c2a06e2b8a4dc7331c72/defusedxml-0.7.1.tar.gz", hash = "sha256:1bb3032db185915b62d7c6209c5a8792be6a32ab2fedacc84e01b52c51aa3e69", size = 75520, upload-time = "2021-03-08T10:59:26.269Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/07/6c/aa3f2f849e01cb6a001cd8554a88d4c77c5c1a31c95bdf1cf9301e6d9ef4/defusedxml-0.7.1-py2.py3-none-any.whl", hash = "sha256:a352e7e428770286cc899e2542b6cdaedb2b4953ff269a210103ec58f6198a61", size = 25604, upload-time = "2021-03-08T10:59:24.45Z" },
+]
+
[[package]]
name = "execnet"
version = "2.1.2"
@@ -497,7 +547,7 @@ wheels = [
[[package]]
name = "localsetup"
-version = "5.6.2"
+version = "5.7.0"
source = { editable = "." }
dependencies = [
{ name = "anyio" },
@@ -522,6 +572,8 @@ dependencies = [
[package.dev-dependencies]
dev = [
+ { name = "cairosvg" },
+ { name = "pillow" },
{ name = "pytest" },
{ name = "pytest-xdist" },
{ name = "setuptools" },
@@ -559,6 +611,8 @@ requires-dist = [
[package.metadata.requires-dev]
dev = [
+ { name = "cairosvg", specifier = "==2.9.1" },
+ { name = "pillow", specifier = "==12.3.0" },
{ name = "pytest", specifier = ">=9.1.1" },
{ name = "pytest-xdist", specifier = ">=3.6" },
{ name = "setuptools", specifier = "==84.0.0" },
@@ -627,6 +681,77 @@ dependencies = [
]
sdist = { url = "https://files.pythonhosted.org/packages/f8/68/5e285ba9465550a48e837b08b27fa99ef238618f6085a1464afaa4dc8426/PGPy-0.6.0.tar.gz", hash = "sha256:279c2e353f4c3a319f00bd9bd582456e420f8a3ac6de2b4e9731444746828383", size = 603002, upload-time = "2022-11-24T02:35:22.133Z" }
+[[package]]
+name = "pillow"
+version = "12.3.0"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/1c/3d/bb7fca845737cf9d7dbde16ed1843984665ff2e0a518f5db43e77ec540b9/pillow-12.3.0.tar.gz", hash = "sha256:3b8182a766685eaa002637e28b4ec8d6b18819a0c71f579bf0dbaa5830297cce", size = 47025035, upload-time = "2026-07-01T11:56:38.965Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/37/bf/fb3ebff8ddcb76aac5a01389251bbbb9519922a9b520d8247c1ca864a25d/pillow-12.3.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:ba09209fbe443b4acccebe845d8a138b89a8f4fbaeedd44953490b5315d5e965", size = 5345969, upload-time = "2026-07-01T11:54:06.397Z" },
+ { url = "https://files.pythonhosted.org/packages/d8/66/9a386a92561f402389a4fc70c18838bf6d35eb5eb5c6850b4b2dc64f5048/pillow-12.3.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:ffd0c5368496f41b0944be820fcb7a838aa6e623d250b01acf2643939c3f99d7", size = 4780323, upload-time = "2026-07-01T11:54:09.351Z" },
+ { url = "https://files.pythonhosted.org/packages/25/27/ac8f99618ffd3dde21db0f4d4b1d2ab00c0880595bfd17df103f7f39fd0c/pillow-12.3.0-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d9c7f76c0673154f044e9d78c8655fb4213f6ca31a836df48b40fe5d187717b9", size = 6266838, upload-time = "2026-07-01T11:54:11.71Z" },
+ { url = "https://files.pythonhosted.org/packages/84/21/a35af28dcc61f37ed850a2d64c65c701321dfbf25085e469d5559360cbbf/pillow-12.3.0-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:78cb2c6865a35ab8ff8b75fd122f6033b92a62c82801110e48ddd6c936a45d91", size = 6940830, upload-time = "2026-07-01T11:54:13.732Z" },
+ { url = "https://files.pythonhosted.org/packages/eb/51/8b08617af3ad95e33ce6d7dd2c99ed6c8298f7fb131636303956be022e25/pillow-12.3.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:e491916b378fba47242221bb9ead245211b70d504f495d105d17b14a24b4907c", size = 6344383, upload-time = "2026-07-01T11:54:15.756Z" },
+ { url = "https://files.pythonhosted.org/packages/1d/72/cf78ac9780bb93c28328f408973845a309d4d145041665f734572ced1b52/pillow-12.3.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:0dd2064cbc55aaec028ef5fbb60fa47bb6c3e7918e07ff17935284b227a9d2df", size = 7052934, upload-time = "2026-07-01T11:54:17.721Z" },
+ { url = "https://files.pythonhosted.org/packages/20/20/25e0f4dc178a6bc0696793720055519a0de89e7661dae886992decbd2f81/pillow-12.3.0-cp312-cp312-win32.whl", hash = "sha256:dbce0b29841537a2fa4a214c2bbf14de3587c9680caa9b4e217568472490b28f", size = 6472684, upload-time = "2026-07-01T11:54:19.839Z" },
+ { url = "https://files.pythonhosted.org/packages/45/89/da2f7971a317f83d807fdd4065c0af40208e59e692cc43d315a71a0e96d1/pillow-12.3.0-cp312-cp312-win_amd64.whl", hash = "sha256:a2b55dd6b2a4c4b7d87ffa56bdb33fdc5fdb9a462173861a7bc097f17d91cb09", size = 7227137, upload-time = "2026-07-01T11:54:22.025Z" },
+ { url = "https://files.pythonhosted.org/packages/de/47/4845a0a6c0dbf1db8456bd9fc791f13c5ced7ced20606d08a0aacfd25b49/pillow-12.3.0-cp312-cp312-win_arm64.whl", hash = "sha256:331b624368d4f1d069149002f25f44bc61c8919ce8ddb3c45bdad8f6e2d89510", size = 2568267, upload-time = "2026-07-01T11:54:24.051Z" },
+ { url = "https://files.pythonhosted.org/packages/9d/ac/31fb64e1e7efb5a4b50cd3d92049ba89ac6e4d8d3bb6a74e15048ca3353e/pillow-12.3.0-cp313-cp313-ios_13_0_arm64_iphoneos.whl", hash = "sha256:21900ce7ba264168cd50defae43cd75d25c833ad4ad6e73ffc5596d12e25ac89", size = 4161684, upload-time = "2026-07-01T11:54:25.934Z" },
+ { url = "https://files.pythonhosted.org/packages/87/b4/9805e23d2b4d77842b468513841fda254ee42f0289d25088340e4ff46e2d/pillow-12.3.0-cp313-cp313-ios_13_0_arm64_iphonesimulator.whl", hash = "sha256:4e8c2a84d977f50b9daed6eeaf3baef67d00d5d74d932288f02cb94518ee3ace", size = 4255487, upload-time = "2026-07-01T11:54:27.935Z" },
+ { url = "https://files.pythonhosted.org/packages/df/39/ecf519435a200c693fe053a6ee4d835b41cf963a4dfc2551c4e637cb2a71/pillow-12.3.0-cp313-cp313-ios_13_0_x86_64_iphonesimulator.whl", hash = "sha256:ae26d61dfa7a47befdc7572b521024e8745f3d809bd95ca9505a7bba9ef849ec", size = 3696433, upload-time = "2026-07-01T11:54:29.813Z" },
+ { url = "https://files.pythonhosted.org/packages/42/92/2fc3ffad878ae8dd5469ec1bc8eb83b71f48e13efdf68f02709003982a32/pillow-12.3.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:7a743ff716f746fc19a9557f60dab1600d4613255f8a7aeb3cdde4db7eb15a66", size = 5345889, upload-time = "2026-07-01T11:54:31.97Z" },
+ { url = "https://files.pythonhosted.org/packages/10/76/8803c13605b763d33d156c4678fc77f8443389c0c51c8aef707bb02015f4/pillow-12.3.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:d69141514cc30b774ceea5e3ed3a6635c8d8a96edf664689b890f4089111fb35", size = 4780109, upload-time = "2026-07-01T11:54:34.026Z" },
+ { url = "https://files.pythonhosted.org/packages/1f/01/e18aff37cb0b4aac47ac90f016d347a49aca667ef97f190b06ac2aabc928/pillow-12.3.0-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f7401aebd7f581d7f83a439d87d474999317ee099218e5ad25d125290990ba65", size = 6263736, upload-time = "2026-07-01T11:54:36.131Z" },
+ { url = "https://files.pythonhosted.org/packages/f7/62/de5bdd77d935331f4f802edc11e4d82950f642caad6cb2f949837b8560e2/pillow-12.3.0-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0847a763afefb695bc912d7c131e7e0632d4edc1d8698f58ddabec8e46b8b6d3", size = 6937129, upload-time = "2026-07-01T11:54:38.216Z" },
+ { url = "https://files.pythonhosted.org/packages/70/4d/105627a13300c5e0df1d174230b32fd1273062c96f7745fd552b945d1e1d/pillow-12.3.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:571b9fcb07b97ef3a492028fb3d2dc0993ca23a06138b0315286566d29ef718a", size = 6339562, upload-time = "2026-07-01T11:54:40.354Z" },
+ { url = "https://files.pythonhosted.org/packages/6b/1d/f13de01a553988ab895ba1c722e06cf3144d4f57656fd5b81b6d881f1179/pillow-12.3.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:756c768d0c9c2955feb7a56c37ea24aea2e369f8d36a88da270b6a9f19e62b5e", size = 7049439, upload-time = "2026-07-01T11:54:42.489Z" },
+ { url = "https://files.pythonhosted.org/packages/c9/f9/066794cca041b969964f779ee5fa66a9498bbf34248ac39c5d7954e4198f/pillow-12.3.0-cp313-cp313-win32.whl", hash = "sha256:a876864214e136f0eb367788dbd7df045f4806801518e2cfe9e13229cfe06d8f", size = 6473287, upload-time = "2026-07-01T11:54:44.9Z" },
+ { url = "https://files.pythonhosted.org/packages/a6/9b/7a58e61d62be561da3a356fe2384d4059a6345fc130e23ef1c36a5b81d24/pillow-12.3.0-cp313-cp313-win_amd64.whl", hash = "sha256:1cca606cd25738df4ed873d5ad46bbdb3d83b5cbca291f6b4ff13a4df6b0bbe8", size = 7239691, upload-time = "2026-07-01T11:54:47.141Z" },
+ { url = "https://files.pythonhosted.org/packages/aa/b0/c4ed4f0ef8f8fa5ee8351537db6650bb8189f7e118842978dd6589065692/pillow-12.3.0-cp313-cp313-win_arm64.whl", hash = "sha256:b629de27fda84b42cde7edef0d85f13b958b47f6e9bbcbba9b673c562a89bd8b", size = 2568185, upload-time = "2026-07-01T11:54:49.137Z" },
+ { url = "https://files.pythonhosted.org/packages/dc/01/001f65b68192f0228cc1dbbc8d2530ab5d58b61037ba0587f946fea607cd/pillow-12.3.0-cp314-cp314-ios_13_0_arm64_iphoneos.whl", hash = "sha256:9cf95fe4d0f84c82d282745d9bb08ad9f926efa00be4697e767b814ce40d4330", size = 4161736, upload-time = "2026-07-01T11:54:51.156Z" },
+ { url = "https://files.pythonhosted.org/packages/1a/d2/0219746d0fd16fc8a84498e79452375be3797d3ce4044596ce565164b84f/pillow-12.3.0-cp314-cp314-ios_13_0_arm64_iphonesimulator.whl", hash = "sha256:8728f216dcdb6e6d555cf971cb34076139ad74b31fc2c14da4fafc741c5f6217", size = 4255435, upload-time = "2026-07-01T11:54:53.414Z" },
+ { url = "https://files.pythonhosted.org/packages/c8/02/8d0bc62ef0302318c46ff2a512822d2610e81c7aa46c9b3abe6cbaca5ad0/pillow-12.3.0-cp314-cp314-ios_13_0_x86_64_iphonesimulator.whl", hash = "sha256:a45650e8ce7fafffd731db8550230db6b0d306d181a90b67d3e6bca2f1990930", size = 3696262, upload-time = "2026-07-01T11:54:55.739Z" },
+ { url = "https://files.pythonhosted.org/packages/85/e2/73c77d218410b14f5f2d565e8a998d5317b7b9c75368d29985139f7a46f0/pillow-12.3.0-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:ba54cfebe86920a559a7c4d6b9050791c20513650a1952ebe3368c7dc70306f8", size = 5350344, upload-time = "2026-07-01T11:54:57.657Z" },
+ { url = "https://files.pythonhosted.org/packages/c7/da/32c752228ae345f489e3a42499d817b6c3996da7e8a3bc7a04fc806b243b/pillow-12.3.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:e158cb00350dc278f3b91551101aa7d12415a66ebf2c91d8d5ac14e56ddd3ad0", size = 4780131, upload-time = "2026-07-01T11:54:59.713Z" },
+ { url = "https://files.pythonhosted.org/packages/b1/9d/8b2c807dbef61a5197c047afe99823787eb66f63daf9fb2432f91d6f0462/pillow-12.3.0-cp314-cp314-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e9aeb04d6aef139de265b29683e119b638208f88cf73cdd1658aa07221165321", size = 6263757, upload-time = "2026-07-01T11:55:01.778Z" },
+ { url = "https://files.pythonhosted.org/packages/5c/44/c85361f65dbe00eea8576ee467c768d25129989efb76e94f205e9ca9bb46/pillow-12.3.0-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:251bf95b67017e27b13d82f5b326234ca62d70f9cf4c2b9032de2358a3b12c7b", size = 6936962, upload-time = "2026-07-01T11:55:03.93Z" },
+ { url = "https://files.pythonhosted.org/packages/18/7e/e483414b35800b86b6f08dbbc7803fb5cd52c4d6f897f47d53ea2c7e6f65/pillow-12.3.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:fe3cca2e4e8a592be0f269a1ca4835c25199d9f3ce815c8491048f785b0a0198", size = 6339171, upload-time = "2026-07-01T11:55:05.989Z" },
+ { url = "https://files.pythonhosted.org/packages/f0/f4/68c491844841ede6bed70189546b3ee9731cf9f2cbad396faff5e1ccba45/pillow-12.3.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:23aceaa007d6172b02c277f0cd359c79492bbb14f7072b4ede9fbcaf20648130", size = 7048116, upload-time = "2026-07-01T11:55:08.131Z" },
+ { url = "https://files.pythonhosted.org/packages/a3/34/77f3f793fed8efc7d243f21b33c5a3f0d1c97ee70346d3db855587e155ff/pillow-12.3.0-cp314-cp314-win32.whl", hash = "sha256:af8d94b0db561cf68b88a267c5c44b49e134f525d0dc2cb7ed413a66bc23559a", size = 6467209, upload-time = "2026-07-01T11:55:10.408Z" },
+ { url = "https://files.pythonhosted.org/packages/f1/e0/492879f69d94f91f60fc8cd05ba03650e9520afebb2fb7aa12777d7c7f38/pillow-12.3.0-cp314-cp314-win_amd64.whl", hash = "sha256:fdafc9cce40277e0f7a0feabce0ee50dd2fa1800f3b38015e51296b5e814048d", size = 7237707, upload-time = "2026-07-01T11:55:12.745Z" },
+ { url = "https://files.pythonhosted.org/packages/c9/ac/6b11f2875f1c2ac040d84e1bbf9cf22a88038f901ca1037898b280b38365/pillow-12.3.0-cp314-cp314-win_arm64.whl", hash = "sha256:e91206ee562682b51b98ef4b26a6ef48fd84e15fd4c4bc5ec768eb641d206838", size = 2565995, upload-time = "2026-07-01T11:55:14.736Z" },
+ { url = "https://files.pythonhosted.org/packages/52/69/c2208e56af9bfc1913afb24020297a691eb1d4ef688474c8a04913f65e04/pillow-12.3.0-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:164b31cd1a0490ab6efae01aa5df49da7061be0af1b30e035b6e9a1bfe34ee6e", size = 5352503, upload-time = "2026-07-01T11:55:17.076Z" },
+ { url = "https://files.pythonhosted.org/packages/07/70/e5686d753e898a45d778ff1718dba8516ead6ab6b95d85fc8c4b70650cf2/pillow-12.3.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:5afb51d599ea772b8365ae807ae557f18bccfe46ab261fd1c2a9ed700fc6eb17", size = 4782956, upload-time = "2026-07-01T11:55:19.448Z" },
+ { url = "https://files.pythonhosted.org/packages/d5/37/25c6692f06927ee973ff18c8d9ee98ad0b4d84ee67a09610c2dd1447958e/pillow-12.3.0-cp314-cp314t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:3edce1d53195db527e0191f84b71d02022de0540bf43a16ed734ed7537b07385", size = 6322855, upload-time = "2026-07-01T11:55:21.613Z" },
+ { url = "https://files.pythonhosted.org/packages/cc/91/420637fcb8f1bc11029e403b4538e6694744428d8246118e45719f944556/pillow-12.3.0-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:bf16ba1b4d0b6b7c8e534936632270cf70eb00dbe09005bc345b2677b726855c", size = 6989642, upload-time = "2026-07-01T11:55:24.006Z" },
+ { url = "https://files.pythonhosted.org/packages/10/08/b94d7811281ccf0d143a1cf768d1c49e1e54af63e7b708ab2ee3eb87face/pillow-12.3.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:24870b09b224f7ae3c39ed07d10e819d06f8720bc551847b1d623832b5b0e28d", size = 6391281, upload-time = "2026-07-01T11:55:26.252Z" },
+ { url = "https://files.pythonhosted.org/packages/d2/87/24233f785f55474dc02ce3e739c5528a77e3a862e9333d1dd7a25cc31f70/pillow-12.3.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:30f2aa603c41533cc25c05acd0da21636e84a315768feb631c937177db558931", size = 7096716, upload-time = "2026-07-01T11:55:28.318Z" },
+ { url = "https://files.pythonhosted.org/packages/23/26/fcb2f6e37175b04f53570b59937867e2b80ee1685e744023153028fc14f9/pillow-12.3.0-cp314-cp314t-win32.whl", hash = "sha256:4b0a7fe987b14c31ebda6083f74f22b561fd3739bc0ac51e019622e3d72668c7", size = 6474125, upload-time = "2026-07-01T11:55:30.956Z" },
+ { url = "https://files.pythonhosted.org/packages/90/de/3634abee5f1c9e13c56787b7d5517b0ba8d6de51700b95578cf338349c9f/pillow-12.3.0-cp314-cp314t-win_amd64.whl", hash = "sha256:962864dc93511324d51ddbb5b9f8731bf71675b93ca612a07441896f4688fb8c", size = 7242939, upload-time = "2026-07-01T11:55:34.044Z" },
+ { url = "https://files.pythonhosted.org/packages/ce/2a/fd13f8eb24de5714a6eb444a3d67e2842c6c576e159a43793adf23051351/pillow-12.3.0-cp314-cp314t-win_arm64.whl", hash = "sha256:0740a512dc522224c77d9aa5a8d70d8b7d73fb91f2c21125d8d025d3b8990e45", size = 2567506, upload-time = "2026-07-01T11:55:35.988Z" },
+ { url = "https://files.pythonhosted.org/packages/5d/dc/8fdce34ec725a33c81c6ba122b904d6b9024e50ea9ac7bede62fab54506c/pillow-12.3.0-cp315-cp315-ios_13_0_arm64_iphoneos.whl", hash = "sha256:0feb2e9d6ad6c9e3c06effe9d00f3f1e618a6643273576b016f591e9315a7139", size = 4162063, upload-time = "2026-07-01T11:55:37.941Z" },
+ { url = "https://files.pythonhosted.org/packages/76/66/2044b9a63d3b84ff048228dfcb7cd9bf0df983e8470971bf7d4c57b693de/pillow-12.3.0-cp315-cp315-ios_13_0_arm64_iphonesimulator.whl", hash = "sha256:9e881fca225083806662a5c43d627d215f258ff43c890f831966c7d7ba9c7402", size = 4255549, upload-time = "2026-07-01T11:55:40.022Z" },
+ { url = "https://files.pythonhosted.org/packages/52/7e/1f67e6f4ece6b582ee4b539decbcc9f848dc245a93ed8cd7338bafef72f1/pillow-12.3.0-cp315-cp315-ios_13_0_x86_64_iphonesimulator.whl", hash = "sha256:4998562bf62a445225f22e07c896bb04b35b1b1f2eb6d760584c9c51d7a5f78c", size = 3696331, upload-time = "2026-07-01T11:55:41.98Z" },
+ { url = "https://files.pythonhosted.org/packages/12/40/d306fc2c8e4d45d7f175c77edca7063be7b86fe7fe6e68f4353bf71d808c/pillow-12.3.0-cp315-cp315-macosx_10_15_x86_64.whl", hash = "sha256:dc624f6bc473dacdf7ef7eb8678d0d08edf15cd94fad6ae5c7d6cc67a4e4902f", size = 5350370, upload-time = "2026-07-01T11:55:44.028Z" },
+ { url = "https://files.pythonhosted.org/packages/dd/44/668fb1437e8ce420f62d6106eb66e44a5971602a4d794615bdf79315d82d/pillow-12.3.0-cp315-cp315-macosx_11_0_arm64.whl", hash = "sha256:71d6097b330eea8fd15097780c8e89cb1a8ce7838669f48c5bacd6f663dd4701", size = 4780147, upload-time = "2026-07-01T11:55:46.073Z" },
+ { url = "https://files.pythonhosted.org/packages/0c/08/93fa2e70e30a2d81547e481b6ee2bb9522117221fb1e0ce4b5df70967677/pillow-12.3.0-cp315-cp315-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:28ce87c5ab450a9dd970b52e5aca5fe63ed432d18a2eaddd1979a00a1ba24ace", size = 6273659, upload-time = "2026-07-01T11:55:48.264Z" },
+ { url = "https://files.pythonhosted.org/packages/f8/6d/043e96ff814fc31a33077e4cba86082167db520c93632afdf2042febbb0c/pillow-12.3.0-cp315-cp315-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:6b02afb9b97f65fbca5f31db6a2a3ba21aa93030225f150fa3f249717e938fb4", size = 6947439, upload-time = "2026-07-01T11:55:50.503Z" },
+ { url = "https://files.pythonhosted.org/packages/af/92/ba71d2ee2ac0edf3fa33bd9d5ee9ee080da70b1766f3ca3934f9938ddac9/pillow-12.3.0-cp315-cp315-musllinux_1_2_aarch64.whl", hash = "sha256:1182d52bc2d5e5d7d0949503aa7e36d12f42205dc287e4883f407b1988820d39", size = 6353577, upload-time = "2026-07-01T11:55:52.697Z" },
+ { url = "https://files.pythonhosted.org/packages/0f/ce/e63064e2122923ff687c8ad792d0d736a7b3920a56a46982e81a7fdd25d6/pillow-12.3.0-cp315-cp315-musllinux_1_2_x86_64.whl", hash = "sha256:e795b7eb908249c4e43c7c99fac7c2c75dab0c43566e37db472a355f63693d71", size = 7060394, upload-time = "2026-07-01T11:55:55.149Z" },
+ { url = "https://files.pythonhosted.org/packages/54/76/a09cc3ccc8d773a7283d34c38bec1708f9e3cc932093cbc4c5e71ac4060b/pillow-12.3.0-cp315-cp315-win32.whl", hash = "sha256:57b3d78c95ba9059768b10e28b813002261d3f3dfc55cc48b0c988f625175827", size = 6467375, upload-time = "2026-07-01T11:55:57.769Z" },
+ { url = "https://files.pythonhosted.org/packages/3e/03/1846c49ba3b1d5550392a4bbd06d6fb4578e1cd91a803198b5c90f5f7d53/pillow-12.3.0-cp315-cp315-win_amd64.whl", hash = "sha256:fa4ecea169a355be7a3ade2c783e2ed12f0e40d2c5621cda8b3297faf7fbb9f5", size = 7237048, upload-time = "2026-07-01T11:55:59.975Z" },
+ { url = "https://files.pythonhosted.org/packages/fb/bb/89f35dcc79610423f9f195504d7def7f0d1416a711541b42867e25fe3412/pillow-12.3.0-cp315-cp315-win_arm64.whl", hash = "sha256:877c3f311ff35410f690861c4409e7ccbf0cd2f878e50628a28e5a0bb689e658", size = 2566006, upload-time = "2026-07-01T11:56:02.143Z" },
+ { url = "https://files.pythonhosted.org/packages/30/88/707027ba09942dfa2c28759b5c222d769290a41c6d20ea60ec250801941f/pillow-12.3.0-cp315-cp315t-macosx_10_15_x86_64.whl", hash = "sha256:e9871b1ffbfa9656b60aeee92ed5136a5742696006fa322b29ea3d8da0ecc9cf", size = 5352509, upload-time = "2026-07-01T11:56:04.2Z" },
+ { url = "https://files.pythonhosted.org/packages/b0/6d/00352fa25332c2569cd387851f568cc5a4b75a9adbfb37ac4fbce4c02eec/pillow-12.3.0-cp315-cp315t-macosx_11_0_arm64.whl", hash = "sha256:53aa02d20d10c3d814d536aa4e5ac9b84ca0ff5a88377963b085ad6822f93e64", size = 4783167, upload-time = "2026-07-01T11:56:06.631Z" },
+ { url = "https://files.pythonhosted.org/packages/13/4f/9e049dfa21af7c22427275720e2490267ba8138120add5c4c574deb69782/pillow-12.3.0-cp315-cp315t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:446c34dcc4324b084a53b705127dc15717b22c5e140ae0a3c38349d4efec071e", size = 6329237, upload-time = "2026-07-01T11:56:08.868Z" },
+ { url = "https://files.pythonhosted.org/packages/36/16/cf6eeaae8d0fce8dd390a33437cf68c5d5bd73834a2bc6e2f14efda0ab45/pillow-12.3.0-cp315-cp315t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:cf1845d02ad822a369a49f2bb9345b1614744267682e7a03527dc3bf6eea1777", size = 6997047, upload-time = "2026-07-01T11:56:11.379Z" },
+ { url = "https://files.pythonhosted.org/packages/1e/69/dbf769bdd55f48bf5733cac28edc6364ffaa072ec9ba336266e4fe66be55/pillow-12.3.0-cp315-cp315t-musllinux_1_2_aarch64.whl", hash = "sha256:186941b6aef820ad110fb01fb06eb925374dc3a21b17e37ec9a53b250c6fe2d1", size = 6400440, upload-time = "2026-07-01T11:56:13.908Z" },
+ { url = "https://files.pythonhosted.org/packages/a0/e1/ffc9cfc2eea0d178da8018e18e959301ad9d6bc9f3edb7181e748a474b97/pillow-12.3.0-cp315-cp315t-musllinux_1_2_x86_64.whl", hash = "sha256:f13c32a3abd6079a66d9526e18dad9b6d280384d49d7c54040cd57b6424041d9", size = 7105895, upload-time = "2026-07-01T11:56:16.575Z" },
+ { url = "https://files.pythonhosted.org/packages/18/f0/a5595c1e8c3ae44b9828cb2f0fa8155e5095ef04d6327b8f61cf44a3df85/pillow-12.3.0-cp315-cp315t-win32.whl", hash = "sha256:1657923d2d45afb66526e5b933e5b3052e6bdea196c90d3abb2424e18c77dae8", size = 6474384, upload-time = "2026-07-01T11:56:18.855Z" },
+ { url = "https://files.pythonhosted.org/packages/e4/04/62bcd9f844984c5938d3b05264a61d797a29d3e0812341a8204af70bbdee/pillow-12.3.0-cp315-cp315t-win_amd64.whl", hash = "sha256:8cd2f7bdda092d99c9fc2fb7391354f306d01443d22785d0cbfafa2e2c8bb418", size = 7243537, upload-time = "2026-07-01T11:56:21.214Z" },
+ { url = "https://files.pythonhosted.org/packages/3d/68/1f3066acedf37673694a7141381d8f811ae97f30d34413d236abe7d489f1/pillow-12.3.0-cp315-cp315t-win_arm64.whl", hash = "sha256:06ff022112bc9cbf83b60f8e028d94ad87b60621706487e65f673de61610ab59", size = 2567491, upload-time = "2026-07-01T11:56:23.506Z" },
+]
+
[[package]]
name = "pluggy"
version = "1.6.0"
@@ -1159,6 +1284,18 @@ wheels = [
{ url = "https://files.pythonhosted.org/packages/35/5e/9b01afd037bfa22a0033963fa091e0f75b6fb15cd85bffb42ff86e697323/tiktoken-0.14.0-cp315-cp315t-win_amd64.whl", hash = "sha256:561e7580f84a79859af1ef6f676968e9030fcc3fe195700b15235bca64f009c9", size = 987929, upload-time = "2026-08-17T19:49:38.947Z" },
]
+[[package]]
+name = "tinycss2"
+version = "1.5.1"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "webencodings" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/a3/ae/2ca4913e5c0f09781d75482874c3a95db9105462a92ddd303c7d285d3df2/tinycss2-1.5.1.tar.gz", hash = "sha256:d339d2b616ba90ccce58da8495a78f46e55d4d25f9fd71dfd526f07e7d53f957", size = 88195, upload-time = "2025-11-23T10:29:10.082Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/60/45/c7b5c3168458db837e8ceab06dc77824e18202679d0463f0e8f002143a97/tinycss2-1.5.1-py3-none-any.whl", hash = "sha256:3415ba0f5839c062696996998176c4a3751d18b7edaaeeb658c9ce21ec150661", size = 28404, upload-time = "2025-11-23T10:29:08.676Z" },
+]
+
[[package]]
name = "truststore"
version = "0.10.4"
@@ -1198,6 +1335,15 @@ wheels = [
{ url = "https://files.pythonhosted.org/packages/7f/3e/5db95bcf282c52709639744ca2a8b149baccf648e39c8cc87553df9eae0c/urllib3-2.7.0-py3-none-any.whl", hash = "sha256:9fb4c81ebbb1ce9531cce37674bbc6f1360472bc18ca9a553ede278ef7276897", size = 131087, upload-time = "2026-05-07T16:13:17.151Z" },
]
+[[package]]
+name = "webencodings"
+version = "0.6.1"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/d5/a0/8fd707bcb776a7be556bad06a2ea5fb9bd519df78ef8e26f70ccf0f38bff/webencodings-0.6.1.tar.gz", hash = "sha256:565f9ad031c702dae404e27a099e3e09186a3ab1b9520f06d215502b651fd910", size = 15001, upload-time = "2026-08-15T14:22:57.549Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/77/c6/040cbc72480d789a5f40d63fb484d3106554c4dfa2d2b70ad5022057750f/webencodings-0.6.1-py3-none-any.whl", hash = "sha256:7fab6269c8bf237c657876b52058ccb182e861518d1c695c1a9aaa8c1c105d5b", size = 8745, upload-time = "2026-08-15T14:22:56.31Z" },
+]
+
[[package]]
name = "wheel"
version = "0.48.0"