Theme Forge: Stellar Loom (theme-forge-stellar-loom)
- PyPI distribution version:
0.4.0.post1 - Upstream release version:
0.4.0 - Upstream npm package:
@knowledge-forge-ai/theme-forge-stellar-loom - Upstream source commit:
d6f3cc457ee68224cef06e9599c9d2401057c618 - Upstream release tag: v0.4.0
- Console script entrypoints:
tfsl,tfsl-batch - SPDX license expression:
AGPL-3.0-or-later - Python requirement:
>=3.9 - External runtime requirement:
Node.js >=22(Requires-External: nodejs (>=22))
Overview
Theme Forge Stellar Loom (TFSL) is a Starlight theme-builder backend, library, and CLI (tfsl, tfsl-batch), packaged as the theme-forge-stellar-loom Python distribution (0.4.0.post1). It compiles typed, versioned theme specifications into canonical, deterministic CSS custom properties, theme descriptors, and standalone Starlight plugin packages for documentation sites (starlight-v0.42, demonstrated with Astro 7.3.1 and @astrojs/starlight@0.42.0).
The .post1 PEP 440 post-release suffix identifies the first Python packaging revision of the immutable upstream 0.4.0 release. Version 0.4.0 includes reading layout presets (--reading-layout), distribution-safe TypeScript emission (--language typescript), Expressive Code syntax styling derivation, and book-chrome navigation.
Key properties:
- Versioned theme schemas: Supports both
tfsl.theme-v1and the closedtfsl.theme-v2/ catalog domain. - Zero-dependency core: Compiles using Node.js built-in modules (
node:crypto,node:fs/promises,node:path) with zero third-party npm dependencies and zero native binary addons. - Deterministic compilation: Produces byte-identical CSS and SHA-256 digests across environments.
- Deterministic contrast diagnostics: Computes WCAG 2.2 AA relative luminance and contrast ratios for body text, links, and inline code across light and dark modes.
- Filesystem safety: Prevents CSS injection, refuses symlink destination roots and dangling intermediate symlinks, requires empty or absent destination directories for package generation, requires
--overwritefor existing v1 compilation outputs, protects manually edited CSS by verifying existing descriptor output digests, and detects input/output collisions.
Wheel Targets and Requirements
Platform wheels and host-targeted source-distribution (sdist) builds support three POSIX environments:
| Target Key | Operating System & Architecture | PEP 425 Wheel Tag | Minimum C Library / OS Floor |
|---|---|---|---|
darwin-arm64 |
macOS Apple Silicon (arm64) |
py3-none-macosx_11_0_arm64 |
macOS 11.0+ |
linux-arm64-gnu |
Linux ARM64 (aarch64, GNU libc) |
py3-none-manylinux_2_28_aarch64 |
glibc >= 2.28 |
linux-x64-gnu |
Linux AMD64 (x86_64, GNU libc) |
py3-none-manylinux_2_28_x86_64 |
glibc >= 2.28 |
Distribution Filenames
theme_forge_stellar_loom-0.4.0.post1-py3-none-macosx_11_0_arm64.whltheme_forge_stellar_loom-0.4.0.post1-py3-none-manylinux_2_28_aarch64.whltheme_forge_stellar_loom-0.4.0.post1-py3-none-manylinux_2_28_x86_64.whltheme_forge_stellar_loom-0.4.0.post1.tar.gz
Prerequisites
- Python
>=3.9withpip. - Node.js
>=22(v22.0.0or newer) matching the wheel's target operating system, CPU architecture, and (on Linux) GNUlibc(glibc >= 2.28).
Verify both runtimes before installation:
python3 --version
node --version
Installation and Upgrade
Standard installation from PyPI downloads the distribution over the network:
python3 -m pip install "theme-forge-stellar-loom==0.4.0.post1"
Upgrade an existing installation to 0.4.0.post1:
python3 -m pip install --upgrade "theme-forge-stellar-loom==0.4.0.post1"
Offline Installation from Local Artifacts
The entire upstream release payload is bundled inside the wheel and sdist. The Python packaging adapter and launcher never invoke npm, npx, or corepack.
To install offline from a local directory (./dist) containing the prebuilt wheel or .tar.gz sdist without network access:
python3 -m pip install --no-index --no-deps --find-links ./dist "theme-forge-stellar-loom==0.4.0.post1"
--no-deps is safe because theme-forge-stellar-loom declares zero Python package dependencies and build-system.requires = []. When building a wheel from theme_forge_stellar_loom-0.4.0.post1.tar.gz, the bundled offline PEP 517 backend (rs9.tf_pypi_backend under _rs9_build/) selects the current host target (darwin-arm64, linux-arm64-gnu, or linux-x64-gnu) via host_key(), refuses unsupported build hosts (such as darwin-x64 or non-glibc Linux), and rejects any PEP 517 config_settings.
Node.js Resolution and Launcher Diagnostics
At runtime, the console-script wrapper (theme_forge_stellar_loom.launcher) locates the Node.js executable in the following order:
THEME_FORGE_NODE_BINenvironment variable: If set and non-empty, the launcher uses that path directly without falling back toPATH.PATHlookup: Otherwise, the launcher resolvesnodeonPATH.
To bind execution to a specific Node.js >=22 binary:
export THEME_FORGE_NODE_BIN="/opt/node-v22/bin/node"
tfsl --version
Runtime Verification and Failure Codes
Before handing off execution with os.execv, the launcher verifies:
- The host
os.nameis"posix"and the packaged JavaScript entrypoint exists on disk. <node> --versionreports a major version>=22.- A subprocess check of Node's
process.platform,process.arch, andprocess.report.getReport().header.glibcVersionRuntimematches the wheel'sPLATFORM_KEY(darwin-arm64,linux-arm64-gnu, orlinux-x64-gnu) and, on Linux, confirms GNUlibcmeetsMIN_GLIBC(2.28). Note that the macOS11.0deployment floor is enforced by the wheel tag (macosx_11_0_arm64) rather than a runtime macOS version probe.
If any check fails, the launcher exits with status 1 and writes a single line to stderr in the fixed format:
<TOKEN>: Node.js >=22 and an intact supported POSIX installation are required.
| Diagnostic Token | Triggering Conditions |
|---|---|
TF_PYPI_NODE_REQUIRED |
Non-POSIX host, missing packaged entrypoint file, node not found on PATH, THEME_FORGE_NODE_BIN missing or non-executable, --version query failure, or detected Node.js major version older than 22. |
TF_PYPI_NODE_PLATFORM |
Node's reported process.platform/process.arch does not match the wheel's PLATFORM_KEY (for example, running an x64 Node.js binary under Rosetta 2 on darwin-arm64), Linux runtime is non-glibc (such as musl), or Linux runtime glibc is older than 2.28. |
The installed Python package (theme_forge_stellar_loom) ships an empty __init__.py and exposes no Python library API; installing via pip provides the tfsl and tfsl-batch console scripts on PATH.
Theme v2 and Catalog
tfsl.theme-v2 is a separate closed domain alongside supported tfsl.theme-v1 validation, canonical bytes, generated packages, and strict exchange compatibility. First-party capability fixtures in examples/ include loom-black-core.theme.json, loom-flexoki-core.theme.json, and loom-celestia-core.theme.json (plus v1 examples such as stellar-cyan.theme.json and amber-forge.theme.json).
The library compileTheme, CLI validate/compile/generate, and batch compile/validate discriminate automatically by schemaVersion. V2 compilation returns an ordered styles map and a v2 descriptor; css (batch compiledCss) is its ordered concatenation for display rather than a structural browser preview. V2 CLI compile writes the fixed five stylesheet files and descriptor to an absent or empty directory and does not support --overwrite:
tfsl validate examples/loom-black-core.theme.json
tfsl compile examples/loom-black-core.theme.json --out compiled
tfsl generate examples/loom-black-core.theme.json --package metadata.json --out theme-package
Use --accent <declared-id> to select another complete light/dark variant. The emitted v2 stylesheet order is:
styles/layers.cssstyles/tokens.cssstyles/base.cssstyles/accent.cssstyles/overrides.css
The layer declaration places starlight before tfsl, then orders Loom's tokens, base, accent, and overrides sublayers. Unlayered consumer custom CSS follows defaults and wins under ordinary CSS cascade rules. Documented override selectors include :root, .sl-markdown-content a:focus-visible, and ::selection.
Catalog Capabilities and Boundaries
The catalog supports finite Hero, PageTitle, Pagination, and Sidebar choices, responsive navigation, and bounded syntax/frame/diff presentation. Consumer components and supported Expressive Code values retain precedence. Catalog specifications include a closed catalog object; core specifications without that object retain their separate, smaller contract. Unknown structures fail closed.
Header and PageFrame replacements, generated code tabs, virtual data modules, and font-provider conversion remain deferred. Public Starlight search, theme, language, and supporting controls retain their normal behavior.
Font Records and Materialization
Font records use logical IDs, face metadata, a SHA-256 digest, and license/notice identities; the theme specification contains no file paths or URLs. In the CLI, pass --font-root <selected-directory> --font-ids <comma-separated-ids> (or in the upstream Node.js API, call materializeFontResources(root, declarations, selectedIds) and pass the returned map as fontResources to generateThemePackageV2).
Only fixed <id>.woff or <id>.woff2 leaf files are read: at most 8 resources, 4 MiB each, and 16 MiB total, rejecting symlinks, path traversal, and digest mismatches. Generated font filenames are fixed ordinals. Core byte-pipeline fixtures use non-rendering test bytes; actual font rendering and third-party font licensing require catalog qualification, and system fonts make no promise of pixel-identical cross-OS rendering.
Exchange Compatibility
The legacy v1 exchange verifier requires the exact producer version (compilerVersion). V2 semantic compatibility is independent of package SemVer: producer package version is recorded as provenance rather than a compatibility gate, and exchange v2 recompiles locally and requires exact bound output and inventory equality. Explicit v1 import creates a fresh unadopted v2 candidate linked to the historical packet without mutating historical bytes. V2 CLI output is structured JSON even when --json is omitted.
Command-Line Interface (tfsl and tfsl-batch)
tfsl Usage
# Validate a theme specification and inspect contrast diagnostics
tfsl validate ./examples/stellar-cyan.theme.json
# Fail validation if contrast warnings exist
tfsl validate ./examples/stellar-cyan.theme.json --strict-contrast
# Compile to custom CSS and descriptor in an output directory
tfsl compile ./examples/stellar-cyan.theme.json --out ./dist/theme
# Re-compile a v1 theme into an existing directory (verifies existing descriptor and unedited theme.css)
tfsl compile ./examples/stellar-cyan.theme.json --out ./dist/theme --overwrite
# Output parseable JSON diagnostics without progress prose
tfsl compile ./examples/stellar-cyan.theme.json --out ./dist/theme --json
# Generate an installable Starlight theme package
tfsl generate ./examples/stellar-cyan.theme.json --package ./pkg-meta.json --out ./dist/cyan-package
# Generate an installable package with the approved page-title-frame template
tfsl generate ./examples/amber-forge.theme.json --package ./pkg-meta.json --out ./dist/amber-package --template page-title-frame
# Emit a TypeScript Starlight theme package
tfsl generate ./examples/amber-forge.theme.json --package ./pkg-meta.json --out ./dist/amber-ts-package --language typescript
# Show help or version
tfsl --help
tfsl --version
Note on
--out: Fortfsl compile,--out <output-dir>always specifies an output directory (writing<output-dir>/theme.cssandtheme.descriptor.jsonfortfsl.theme-v1, or the fivestyles/*.cssfiles and descriptor fortfsl.theme-v2).
Locating Bundled Example Files on Disk
The installed wheel unpacks upstream example specifications under <site-packages>/theme_forge_stellar_loom/payload/package/examples/, including examples/amber-forge.theme.json. Because theme_forge_stellar_loom has no Python library API, locating theme_forge_stellar_loom.__file__ in a one-liner only resolves the installed payload directory on disk for CLI invocation:
SPEC_PATH="$(python3 -c 'import pathlib, theme_forge_stellar_loom as m; print(pathlib.Path(m.__file__).parent / "payload/package/examples/amber-forge.theme.json")')"
tfsl validate "$SPEC_PATH" --json
tfsl compile "$SPEC_PATH" --json --out ./out-dir
Batch IPC Runner (tfsl-batch)
The tfsl-batch console script (bin/tfsl-batch.js) runs the batch IPC processor over stdin and stdout. It reads a JSON request payload from stdin and writes a JSON response payload to stdout. If stdin is empty, tfsl-batch exits with status 1 and emits a JSON error response with code EMPTY_INPUT.
Request payload (stdin):
{
"action": "compile",
"specification": {
"...": "contents of a *.theme.json specification object"
}
}
Response payload (stdout on success, exit code 0):
{
"status": "success",
"compiledCss": ":root {\n --...\n}\n"
}
Example tfsl-batch invocation from Python using subprocess:
import json
from pathlib import Path
import subprocess
import theme_forge_stellar_loom
spec_path = (
Path(theme_forge_stellar_loom.__file__).parent
/ "payload/package/examples/amber-forge.theme.json"
)
specification = json.loads(spec_path.read_text(encoding="utf-8"))
request = json.dumps({
"action": "compile",
"specification": specification,
}).encode("utf-8")
result = subprocess.run(
["tfsl-batch"],
input=request,
capture_output=True,
check=True,
)
response = json.loads(result.stdout)
assert response["status"] == "success"
assert "--" in response["compiledCss"]
Theme Data Contract (tfsl.theme-v1), Dimensions, and Exit Codes
Stellar Loom validates untrusted JSON data strictly. Top-level plain objects must inherit from Object.prototype or null to defend against prototype pollution (INVALID_PROTOTYPE).
tfsl.theme-v1 Fields and Version Grammar
schemaVersion:"tfsl.theme-v1".adapter:"starlight-v0.42".name: Alphanumeric identifier (^[a-zA-Z0-9_-]{1,64}$).version: Strict SemVer 2.0.0 without leading zeroes in major/minor/patch segments (^(0|[1-9]\d*)\.(0|[1-9]\d*)\.(0|[1-9]\d*)(?:-...)?$).$schema(optional): Non-executing editor metadata string; excluded from canonical semantic hashing and never dereferenced.colors: Object containingdarkandlightpalettes. Each palette must specify 7-character#rrggbbhex colors for:accent:base,low,high.neutrals:bg,bgNav,bgSidebar,bgInlineCode,bgAccent,text,textAccent,textInvert,hairline,hairlineLight,hairlineShade.grays:gray1throughgray7.
typography:bodyFont:"system-sans"|"system-serif"|"system-mono".codeFont:"system-mono"|"system-code".baseFontSize(optional): Bounded dimension string.lineHeight(optional): Unitless number in[1.0, 3.0].
layout:contentWidth: Bounded dimension string.sidebarWidth: Bounded dimension string.
Per-Unit Dimension Bounds
| Role | px |
rem |
em |
ch |
|---|---|---|---|---|
layout.contentWidth |
[320, 3840] |
[20, 240] |
[20, 240] |
[30, 200] |
layout.sidebarWidth |
[160, 600] |
[10, 40] |
[10, 40] |
[15, 60] |
typography.baseFontSize |
[10, 36] |
[0.625, 2.25] |
[0.625, 2.25] |
[1, 4] |
Spelling is canonically normalized within each unit (for example, 048.00rem -> 48rem, 019.0px -> 19px). Units are not conflated across unit types.
Exit Codes and CLI Behavior
| Code | Category | Meaning & Triggers |
|---|---|---|
0 |
Success | Command completed successfully (validate, compile, generate, --help, --version). |
1 |
Theme Specification Error | Schema validation failure, missing or unreadable input file, or contrast threshold failure under --strict-contrast. |
2 |
Syntax / Invocation Error | Unknown options, missing option arguments, duplicate options, surplus operands, specifying --overwrite on generate (or v2 compile), or --out with a leading hyphen. |
3 |
Filesystem Safety or I/O Failure | Non-empty target directory without --overwrite (for v1 compile), non-empty target directory (for generate or v2 compile), symlink target or traversal refusal, non-regular target (FIFO/socket), unmanaged manual edits to theme.css without matching descriptor, input/output collision, or staging/publication write failure. |
Upstream Node.js Library API, Exports, and Protocol Schemas
Upstream Node.js / npm interface notice: Installing
theme-forge-stellar-loomviapipprovides thetfslandtfsl-batchCLI commands and does not expose a Python module API or globally register the npm package for Node.js imports. The programmatic exports below apply when importing@knowledge-forge-ai/theme-forge-stellar-loomin a Node.js / TypeScript project.
import {
validateTheme, // Alias to validateThemeSpecification
validateThemeSpecification,
ValidationError,
compileTheme,
canonicalizeTheme, // Alias to canonicalizeSpecification
canonicalizeSpecification,
generateThemeDescriptor,
computeSha256,
analyzeThemeContrast,
calculateContrastRatio,
calculateRelativeLuminance,
ContrastError,
generateThemePackage,
writeThemePackage,
} from "@knowledge-forge-ai/theme-forge-stellar-loom";
const spec = validateTheme(inputJson);
const { canonicalObject, canonicalJson, inputDigest } = canonicalizeTheme(spec);
const diagnostics = analyzeThemeContrast(canonicalObject);
const { css, descriptor, outputDigest, diagnostics: compDiagnostics } = compileTheme(spec, {
strictContrast: false,
});
const packageResult = generateThemePackage({
themeSpec: spec,
metadata: {
name: "starlight-theme-stellar-cyan",
version: "0.1.0",
description: "Stellar Cyan Starlight theme plugin",
template: "page-title-frame",
},
strictContrast: false,
});
const writeResult = await writeThemePackage(packageResult, "./dist/my-theme-package");
Upstream Package Subpath Exports
.(@knowledge-forge-ai/theme-forge-stellar-loom): Core compiler, validator, generator (generateThemePackage,generateThemePackageCatalog,generateThemePackageV2,materializeFontResources), design exchange, and contrast diagnostics../batch(@knowledge-forge-ai/theme-forge-stellar-loom/batch): Batch IPC runner (runBatch,processBatchRequest)../cli(@knowledge-forge-ai/theme-forge-stellar-loom/cli): Programmatic CLI invocation (runCli,CLI_HELP)../protocol/*: JSON schemas, inventory, and canonical protocol example packets.
Portable Theme Evidence Protocol v1
Shipped under protocol/tfsl-theme-evidence-v1/:
brief.schema.json: Schema fortfsl.theme-brief(version 1)candidate.schema.json: Schema fortfsl.theme-candidate(version 1)review.schema.json: Schema fortfsl.theme-review(version 1)visual-evidence.schema.json: Schema fortfsl.theme-visual-evidence(version 1)inventory.json: Protocol inventory manifestnegative-corpus.json: Closed negative test corpusexamples/: Integrity-bound canonical packet examples (brief,candidate-a,candidate-b,review)
Generated Starlight Integration, Code Presentation, and Paired Profiles
Starlight Plugin Integration
Each emitted theme package is a standalone Starlight plugin conforming to @astrojs/starlight@0.42.0:
import { defineConfig } from "astro/config";
import starlight from "@astrojs/starlight";
import themePlugin from "starlight-theme-stellar-cyan";
export default defineConfig({
integrations: [
starlight({
title: "Docs",
plugins: [themePlugin()],
// Consumer customCss automatically takes precedence over theme defaults:
customCss: ["./src/styles/custom.css"],
}),
],
});
- CSS cascade: Injects
${packageName}/styles/theme.cssbefore existing entries inconfig.customCss, ensuring consumer CSS rules take precedence. - Idempotence: Repeated hook invocations do not duplicate stylesheet registrations.
- Component overrides: When generated with
--template page-title-frame, registerscomponents.PageTitleonly if the consumer has not configured a customPageTitlecomponent.
Code Presentation and Syntax Palette Integration
The syntaxPalette specification pairs syntax highlighting tokens with Expressive Code frame chrome:
syntax: Light and dark hex color mappings for 11 syntax roles (keyword,string,number,constant,function,type,variable,comment,punctuation,tag,attribute).chrome: Light and dark role mappings for 8 frame surfaces (background,foreground,border,focus,tabBarBackground,activeTabBackground,activeTabIndicator,copyButtonForeground). Every chrome role must be defined symmetrically in both dark and light modes; asymmetric definitions fail closed with[SYNTAX_PALETTE_VALIDATION_ERROR].tabs: Tabbed presentation settings (such asactiveIndicator: "bottom"). WhensyntaxPaletteis supplied togenerateThemePackageCatalog,styles/tabs.cssis emitted and wired so--sl-tab-color-bordermaps tochrome[mode].activeTabIndicatorwith a 2px tablist bottom border.frame: Frame style ("editor","terminal", or"plain").- Expressive Code contrast normalization: Expressive Code enforces a minimum syntax contrast ratio of
5.5:1(minSyntaxHighlightingColorContrast: 5.5), preserving exact hex colors at>= 5.5:1and adjusting luminance when raw contrast is lower.
TypeScript Authoring and Book Chrome Layouts
- TypeScript mode (
--language typescript): Emits typed sources (src/index.ts,src/navigation.ts,src/middleware.ts) andtsconfig.jsonwithbuild: "tsc"andprepare: "tsc"scripts mapping package exports to./dist/artifacts (./dist/index.js,./dist/index.d.ts,./dist/navigation.js,./dist/navigation.d.ts), matching JavaScript package CSS and browser rendering byte-for-byte. - Book Chrome reading layouts (
bookChrome): SupportsbookChrome: true,bookChrome: false, or a granularBookChromeConfig(chapterNavigation,chapterProgress,keyboardShortcuts). Arrow-key listeners bail out whene.defaultPreventedis set, when focus is in an editable input (<input>,<select>,<textarea>,isContentEditable), or when focus is inside[role="tab"],[role="tablist"],.expressive-code,<pre>,<code>, open<dialog>, or horizontally scrollable containers. All rules reside under@layer tfsl.overridesand.tfsl-book-chromewith zero!importantdeclarations, and normalize intoprovenance.bookChrome.
Consumer Override Precedence and Digest Boundaries
- Leaf options: Consumer Expressive Code options (such as
styleOverrides.frames.editorBackground) deep-merge over theme defaults. - Array replacement: Consumer array properties (such as
themes: ["github-light"]) replace theme defaults rather than concatenating. - Unlayered custom CSS: Consumer
customCssloads after theme stylesheets in unlayered space, overriding@layer tfslrules. PageTitleprecedence: Consumercomponents.PageTitlebypasses theme frame wrappers.- Expressive Code disablement: Setting
expressiveCode: falsedisables Expressive Code rendering and falls back to standard Markdown<pre><code>.
Output digest boundaries: cssOutputDigest covers purely CSS-derived output (styles/tokens.css, styles/base.css, styles/layers.css, styles/accent.css, styles/overrides.css, styles/tabs.css), whereas provenance.inventoryDigest covers the full generated package file tree including runtime JS/TS ecDefaults.styleOverrides.
Paired Profiles (tf-paired-profile-v1 and v2) and Compatibility Limits
- Paired Profile v1 (
tf-paired-profile-v1): Stellar Loom and Solar Sail compile shared design profiles (such asflexoki.profile.json) with identical canonical SHA-256 profile digests and independenttargetOverrides.loomvstargetOverrides.solarSailsections. - Paired Profile v2 checkpoint: Defines neutral semantic groups and separately named target adapters while preserving v1 functions. V2 requires explicit version migration, source-byte binding, capability reports, and explicit
baseCatalog,token-set, primary/secondary family, default accent, and family-to-font-ID bindings. Loom pixel geometry does not implyrem/emconversion, and relative lengths and alpha colors remain visible unsupported effects. - Core adapter qualification limits: Core browser qualification covers screen media on sidebar-bearing documentation pages; Starlight
0.42.0has unlayered sidebar-less content-width and print rules that can take precedence over Loom layers. Installed packages validate catalog/template data and recompile bound exchange output; they do not read TypeScript source or provide tamper detection.
Package Layout
When installed into a Python environment, theme-forge-stellar-loom unpacks under site-packages/theme_forge_stellar_loom/ and site-packages/theme_forge_stellar_loom-0.4.0.post1.dist-info/:
theme_forge_stellar_loom/
__init__.py
launcher.py
payload/
package/
package.json
LICENSE
NOTICE
COMMERCIAL-LICENSE.md
bin/
tfsl.js
tfsl-batch.js
examples/
amber-forge.theme.json
loom-black-core.theme.json
loom-flexoki-core.theme.json
loom-celestia-core.theme.json
stellar-cyan.theme.json
protocol/
tfsl-theme-evidence-v1/
...
theme_forge_stellar_loom-0.4.0.post1.dist-info/
METADATA
WHEEL
RECORD
entry_points.txt
rs9-tf-transform.json
licenses/
LICENSE
NOTICE
COMMERCIAL-LICENSE.md
RS9-LICENSE
RS9-NOTICE
Licensing and Legal Notices
The distribution is governed by the SPDX license expression:
AGPL-3.0-or-later
- Upstream payload (
@knowledge-forge-ai/theme-forge-stellar-loom): Licensed under the GNU Affero General Public License v3.0 or later (AGPL-3.0-or-later), with attribution inNOTICEand separate commercial licensing details inCOMMERCIAL-LICENSE.md. - RS9 Python packaging adapter (
theme_forge_stellar_loom/launcher.pyand_rs9_build/rs9/*): Licensed underAGPL-3.0-or-later(RS9-LICENSEandRS9-NOTICE).
Upstream Repository References
- Source:
https://github.com/Knowledge-Forge-AI/theme-forge-stellar-loom/tree/d6f3cc457ee68224cef06e9599c9d2401057c618 - Release:
https://github.com/Knowledge-Forge-AI/theme-forge-stellar-loom/releases/tag/v0.4.0
Metadata
Release files for theme-forge-stellar-loom 0.4.0.post1
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | |
|---|---|---|---|---|
| theme_forge_stellar_loom-0.4.0.post1.tar.gz | 563.3 kB | With provenance | Details |
Built distributions (wheels)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| theme_forge_stellar_loom-0.4.0.post1-py3-none-manylinux_2_28_x86_64.whl | Python 3 | none | Linux glibc 2.28+ x86-64 | Details |
| theme_forge_stellar_loom-0.4.0.post1-py3-none-manylinux_2_28_aarch64.whl | Python 3 | none | Linux glibc 2.28+ ARM64 | Details |
| theme_forge_stellar_loom-0.4.0.post1-py3-none-macosx_11_0_arm64.whl | Python 3 | none | macOS 11.0+ ARM64 | Details |
Total release size: 5.3 MB
Release files / theme_forge_stellar_loom-0.4.0.post1.tar.gz
| Download URL | theme_forge_stellar_loom-0.4.0.post1.tar.gz |
|---|---|
| Size | 563.3 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
0adff7029c25dfece5ced1755f4ee0f3367c5e321046aa3d0efbf8aaa488dd6c
|
|
BLAKE2b-256 checksum How to use checksums |
a1edb091ade70fd714cf3370395bbc6a7f03b7b3c86aa07f3af062243e428287
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.13.7
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 21, 2026.
Transparency logRelease files / theme_forge_stellar_loom-0.4.0.post1-py3-none-manylinux_2_28_x86_64.whl
| Download URL | theme_forge_stellar_loom-0.4.0.post1-py3-none-manylinux_2_28_x86_64.whl |
|---|---|
| Size | 1.6 MB |
| Tags | Linux glibc 2.28+ x86-64 Python 3 |
|
SHA-256 checksum How to use checksums |
a4581d66989e920179fc2f99cc47be7e067bb312431c8f8a795725f34282c4ff
|
|
BLAKE2b-256 checksum How to use checksums |
24726e4ba2dca01ddda34d1543832a88730ea5a47a2c666e0acf5718ffd1a35c
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.13.7
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 21, 2026.
Transparency logRelease files / theme_forge_stellar_loom-0.4.0.post1-py3-none-manylinux_2_28_aarch64.whl
| Download URL | theme_forge_stellar_loom-0.4.0.post1-py3-none-manylinux_2_28_aarch64.whl |
|---|---|
| Size | 1.6 MB |
| Tags | Linux glibc 2.28+ ARM64 Python 3 |
|
SHA-256 checksum How to use checksums |
dea6b8bf15416edf72802e1e67f9703594208eb054eab140a694f2c424b615de
|
|
BLAKE2b-256 checksum How to use checksums |
9d019aee882b618e85abd4c058064ba9c9ad7ef11d414c8d0d2b6bac49e405d5
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.13.7
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 21, 2026.
Transparency logRelease files / theme_forge_stellar_loom-0.4.0.post1-py3-none-macosx_11_0_arm64.whl
| Download URL | theme_forge_stellar_loom-0.4.0.post1-py3-none-macosx_11_0_arm64.whl |
|---|---|
| Size | 1.6 MB |
| Tags | Python 3 macOS 11.0+ ARM64 |
|
SHA-256 checksum How to use checksums |
8925f6860ea16232d00305f986c59d472f3fd52c6c16383364be2f61d63fed2a
|
|
BLAKE2b-256 checksum How to use checksums |
66666240283ead51e36160c32409e26fd3efc4b09effc5e9ded45cdc518e031f
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.13.7
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 21, 2026.
Transparency logSecurity for theme-forge-stellar-loom 0.4.0.post1
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
Full provenance
All 4 files in this release have been uploaded with provenance metadata.
Attestation for theme_forge_stellar_loom-0.4.0.post1.tar.gz
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 21, 2026.
Transparency logA note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.
To learn more about protecting yourself from malicious actors, visit our package security documentation.