Repository files navigation

stella/.github

Organization-wide GitHub configurations, reusable workflows, and templates.

Contents

Reusable Workflows

WorkflowDescription
pr-lint.ymlPR linting: conventional commits, labels, auto-assign
base-checks.ymlComposite workflow calling pr-lint
dependabot-bun-dedupe.ymlDedupe Bun lockfiles on trusted Dependabot pull requests
audit-branch-protection.ymlDrift detection for GitHub rulesets (compliance evidence)
ai-shared-update.ymlUpdate the pinned stella/ai-shared submodule, regenerate consumers, and open a PR
provenance-update.ymlReusable nightly/manual provenance refresh that opens a PR when provenance/ drifts
changeset-release-pr.ymlMaintain a version-only Changesets PR with an app-scoped token
npm-independent-release.ymlPublish independently versioned npm monorepos from caller-built tarballs
npm-artifact-publish.ymlPublish one pre-packed npm artifact without exposing OIDC to its build
pypi-publish-hardenedPrepare and verify an exact wheel matrix around top-level PyPI trusted publishing
crates-io-publish.ymlPackage without OIDC, then attest and publish exact crate bytes
release-policy.ymlEnforce immutable, artifact-only release privilege boundaries

Composite Actions

ActionDescription
typescript-checksSetup pnpm, install deps, run lint + format + typecheck
notify-failureSend failure notification to Google Chat webhook
provenance-checkInstall stella/provenance and verify committed provenance artifacts
changeset-policyRequire valid release intent for caller-declared package paths
npm-publish-hardenedPublish pre-packed npm tarballs through trusted publishing
sync-cargo-workspace-lockSynchronize inherited Cargo workspace versions in Cargo.lock

Templates

  • PULL_REQUEST_TEMPLATE.md - Standard PR template
  • ISSUE_TEMPLATE/ - Bug report, epic, feature request, other

Label Definitions

  • labels.yml - Standardized labels (reference for manual setup)

Usage

Dependabot Bun Dedupe

Keep the pull request trigger and the required autofix.ci workflow name in the calling repository. Install the autofix.ci GitHub App for the caller, then pin the shared workflow to a reviewed commit:

# .github/workflows/autofix.ymlname: autofix.cion:
pull_request:
types: [opened, synchronize, reopened]paths:
- bun.lockconcurrency:
group: ${{ github.workflow }}-${{ github.event.pull_request.number }}cancel-in-progress: truepermissions:
contents: readjobs:
dependabot-bun-dedupe:
uses: stella/.github/.github/workflows/dependabot-bun-dedupe.yml@<commit-sha>

The shared workflow accepts only same-repository Dependabot branches under dependabot/bun/. It runs Bun's lockfile-only dedupe and rejects changes outside bun.lock before passing the patch to autofix.ci. Callers may pass runs-on as a JSON runner-label array; it defaults to ["ubuntu-24.04"].

Base Checks (Recommended)

Use this composite workflow to run all standard checks:

# .github/workflows/ci.ymlname: CIon:
pull_request:
types: [opened, synchronize, reopened, edited]permissions: write-alljobs:
checks:
uses: stella/.github/.github/workflows/base-checks.yml@mainsecrets: inherit

PR Lint

# .github/workflows/pr-lint.ymlname: PR Linton:
pull_request:
types: [opened, synchronize, reopened, edited]branches-ignore:
- "dependabot/**"concurrency:
group: ${{ github.workflow }}-${{ github.ref }}cancel-in-progress: truepermissions: write-alljobs:
pr-lint:
uses: stella/.github/.github/workflows/pr-lint.yml@mainsecrets: inherit

Branch Protection Scripts

ScriptDescription
apply-ruleset.shIdempotent create/update of a GitHub ruleset from JSON

Audit Branch Protection

Compares live GitHub rulesets against a checked-in expected config and uploads the result as a compliance artifact (365-day retention). Detects drift and fails if the live config diverges from the expected state.

# .github/workflows/audit-branch-protection.ymlname: Audit Branch Protectionon:
schedule:
- cron: "0 8 * * 1"# Monday 08:00 UTCworkflow_dispatch:
jobs:
audit:
uses: stella/.github/.github/workflows/audit-branch-protection.yml@mainwith:
expected-config-path: .github/branch-protection/ruleset-main.jsonsecrets:
BRANCH_PROTECTION_APP_ID: ${{ secrets.BRANCH_PROTECTION_APP_ID }}BRANCH_PROTECTION_APP_KEY: ${{ secrets.BRANCH_PROTECTION_APP_KEY }}

Secrets required:

  • BRANCH_PROTECTION_APP_ID — GitHub App ID with Administration: Read and write
  • BRANCH_PROTECTION_APP_KEY — GitHub App private key (PEM)

Inputs:

  • expected-config-path — path to the expected ruleset JSON (default: .github/branch-protection/ruleset-main.json)

Provenance Update

Runs provenance generate in the calling repository and opens or updates a pull request when checked-in provenance/ artifacts drift. This workflow never pushes directly to main.

The schedule must live in the calling repository.

# .github/workflows/provenance-nightly.ymlname: Provenance Nightlyon:
schedule:
- cron: "0 2 * * *"workflow_dispatch:
jobs:
provenance-update:
permissions:
contents: writepull-requests: writeuses: stella/.github/.github/workflows/provenance-update.yml@<commit-sha>with:
install-command: bun install --frozen-lockfileprovenance-version: v0.1.2secrets: inherit

Inputs:

  • root — repository root to scan (default: .)
  • node-version — Node.js version used to install cdxgen (default: 22)
  • cdxgen-version — pinned @cyclonedx/cdxgen version (default: 12.1.5)
  • install-syft — install Syft before generation (default: false)
  • syft-version — pinned Syft release tag (default: v1.42.4)
  • provenance-version — GitHub release tag in stella/provenance to install (default: v0.1.2)
  • provenance-repository — provenance repository slug (default: stella/provenance)
  • install-command — optional dependency install command run before generation (default: bun install --frozen-lockfile)
  • branch — branch used for refresh PRs (default: chore/provenance-update)
  • commit-message — commit message for generated refreshes (default: chore: refresh provenance artifacts)
  • pr-title — pull request title for generated refreshes (default: chore: refresh provenance artifacts)
  • pr-body — pull request body for generated refreshes (default: Automated provenance refresh generated by the shared nightly updater.)

Optional secrets:

  • auth_token — token for updater PR creation when downstream CI should run; if omitted, the workflow falls back to github.token

AI shared updates

Consumer repositories keep .ai/shared pinned for reproducible CI, then call the shared updater on a schedule. The updater fetches the selected stella/ai-shared ref, rejects non-fast-forward changes, runs the fetched canonical sync script, and opens or updates one PR containing the submodule pointer and every generated file.

name: Update shared AI toolingon:
schedule:
- cron: "17 7 * * 1"workflow_dispatch:
permissions:
actions: writecontents: writepull-requests: writejobs:
update:
uses: stella/.github/.github/workflows/ai-shared-update.yml@<commit-sha>with:
runs-on: '["self-hosted","linux","x64"]'validation-workflow: ci.yml

runs-on accepts a JSON runner label array and defaults to ["ubuntu-latest"] when omitted. Only select self-hosted runners trusted with the workflow's declared permissions and secrets.

The caller must enable GitHub Actions to create pull requests when relying on the repository GITHUB_TOKEN. Alternatively, pass auth_token, or app_id plus app_private_key, from a dedicated bot. A PAT or App token triggers normal PR CI; the default-token path can explicitly dispatch a caller-selected workflow that supports workflow_dispatch.

The updater checks out the caller without persisted credentials and does not mint an optional App token until after the newly fetched sync script finishes. Consumer CI and local commands continue to execute only the committed submodule revision.

Changeset releases

Package repositories keep their source-path and version-synchronization rules local, then delegate enforcement and version-PR maintenance to these shared contracts. Changesets only prepares release metadata; the existing hardened release workflow remains the sole publisher.

jobs:
changeset:
if: github.event_name == 'pull_request'runs-on: ubuntu-latestpermissions:
contents: readsteps:
- uses: actions/checkout@<commit-sha>with:
fetch-depth: 0persist-credentials: false
- uses: stella/.github/.github/actions/changeset-policy@<commit-sha>with:
release-paths: | src/** crates/core/src/**generated-paths: | CHANGELOG.md VERSION Cargo.toml Cargo.lock package.json wasm/package.jsonpackage-files: | package.json# In a separate push-to-main workflow:jobs:
version:
uses: stella/.github/.github/workflows/changeset-release-pr.yml@<commit-sha>with:
prepare-rust-wasm: trueruns-on: '["self-hosted","linux","x64"]'sync-cargo-inherited-lock: truesecrets: inherit

runs-on accepts a JSON runner label array and defaults to ["ubuntu-latest"] when omitted. Only select self-hosted runners trusted with the workflow's declared permissions and secrets.

The caller must provide changeset, changeset:version, and a .changeset/config.json. The shared workflow serializes each target branch without interrupting an active release mutation, and skips write-capable steps when its trigger commit is no longer the branch head. A current no-op run closes any stale version PR and deletes its generated branch, so queued runs converge without a duplicate release PR. Callers should use matching workflow-level concurrency without cancellation; newer pushes replace obsolete pending runs while the active mutation finishes.

For hybrid repositories, changeset:version must synchronize the selected package version into every npm, Cargo manifest, Python, and central VERSION surface. With sync-cargo-inherited-lock enabled, the shared workflow validates the incoming lockfile and updates inherited local Cargo package entries inside the same Changesets transaction, before the generated PR is committed. The version command must preserve the committed Bun lockfile: deleting bun.lock/bun.lockb or running an unfrozen bun install is rejected by the shared policy.

When a version command regenerates browser Wasm artifacts, prepare-rust-wasm installs the wasm32-unknown-unknown target and the exact wasm-bindgen CLI version resolved from the caller's locked Cargo workspace. The option is disabled by default and expects the workspace at cargo-manifest to resolve exactly one wasm-bindgen runtime version with all features enabled.

Repositories whose Cargo packages use version.workspace = true can validate or repair the corresponding local Cargo.lock entries without maintaining a package allowlist:

- uses: stella/.github/.github/actions/sync-cargo-workspace-lock@<commit-sha>with:
mode: check # use write while generating synchronized release metadata

The action discovers root workspace members with locked Cargo metadata, changes only members that explicitly inherit [workspace.package].version, and leaves explicitly versioned and registry packages untouched.

Independent npm package releases

Independently versioned Changesets monorepos keep build and pack commands in their own workflow, with no write credential or OIDC permission in that job. The privileged job delegates the complete release transaction to the shared workflow:

jobs:
pack:
permissions:
contents: read# Build each public package, pack one .tgz, then upload one artifact per package.release:
needs: packpermissions:
actions: readcontents: writeid-token: writeuses: stella/.github/.github/workflows/npm-independent-release.yml@<commit-sha>with:
artifact-pattern: npm-tarball-*github-latest-package: "@scope/core"github-latest-policy: canonical-packagepackage-files: | packages/core/package.json packages/react/package.jsonsecrets:
RELEASE_APP_ID: ${{ secrets.RELEASE_APP_ID }}RELEASE_APP_PRIVATE_KEY: ${{ secrets.RELEASE_APP_PRIVATE_KEY }}

The shared job validates an exact one-to-one mapping between the declared public manifests and packed tarballs. It rejects unresolved workspace:, catalog:, link:, and file: dependency specifiers, orders internal dependencies before dependants, stages one draft release per <name>@<version>, publishes only versions missing from npm, verifies the release asset against npm dist.integrity, then makes the draft releases public. Existing complete versions are immutable no-ops. Safe partial runs resume; registry-only versions are repaired with the registry artifact and release notes that do not claim a local rebuild was the originally uploaded file. Package releases preserve the repository's existing GitHub Latest pointer by default. Repositories with one canonical package can set github-latest-policy to canonical-package and name it with github-latest-package; after the transaction is complete, that package's stable release becomes Latest regardless of dependency or publication order. Package-only repositories can instead use newest-published-stable to promote the last stable package release created from the release commit. Prereleases are never eligible. Manual recovery can pass both source-ref and artifact-run-id; the shared workflow accepts the earlier artifacts only when that run used the resolved source commit and the same caller workflow path. Pass environment when RELEASE_APP_PRIVATE_KEY is an environment secret; the release job then runs in that environment, so its deployment policy decides which refs can mint the token.

Each package must have an adjacent CHANGELOG.md section headed ## <version>. Uploaded artifacts may include checksum files, but each must contain exactly one .tgz; only that tarball becomes the corresponding GitHub release asset.

Trusted publishing is authorized against the calling repository workflow filename, not npm-independent-release.yml. Keep that local filename stable and configure the npm trusted publisher for it. Both the caller job and reusable workflow grant id-token: write; no npm token is accepted. Optional RELEASE_APP_ID and RELEASE_APP_PRIVATE_KEY secrets let protected tags and releases use a repository GitHub App token.

Callers that pack a verified commit other than the triggering github.sha (for example, a workflow_run gated on a promoted application release) pass that commit as source-ref. The shared workflow resolves the ref once after checkout and uses the resulting immutable SHA for package tag and release provenance.

Release privilege policy

Keep builds, tests, package installation, and artifact creation in caller jobs with read-only permissions. A separate workflow supplies one stable required check:

# .github/workflows/release-policy.ymlname: Release policyon:
pull_request:
paths: [.github/workflows/release.yml]push:
branches: [main]paths: [.github/workflows/release.yml]permissions:
contents: readjobs:
release-policy:
uses: stella/.github/.github/workflows/release-policy.yml@<commit-sha>

Require Release policy / Enforce release boundaries on the default branch. The policy rejects public-event release triggers, workflow-level execution controls, mutable action references, floating Node.js or Bun runtimes, inherited secrets, and repository-controlled code in an OIDC or write-capable job. Approved publishers must use the same immutable shared commit as the policy.

For tamper-resistant enforcement, configure this workflow as a ruleset workflow sourced from stella/.github; the local caller is fast feedback, not the trust anchor. The shared workflow supports pull_request and merge_group for that purpose and selects publish.yml for stella/tooling, otherwise release.yml.

PyPI trusted publishers remain bound to each caller's top-level release workflow; PyPI does not support reusable workflows for this OIDC exchange. Callers use the pinned pypi-publish-hardened prepare action, invoke the pinned PyPI Docker action directly, then use the pinned verification action. The shared guards validate the exact declared wheel set and verify published files byte for byte without nesting a Docker action inside a composite action.

crates.io and npm callers can delegate to crates-io-publish.yml, npm-artifact-publish.yml, or npm-version-finalize.yml. Their unprivileged jobs hand immutable artifacts to the shared privileged implementation; no caller source is executed after OIDC becomes available.

npm-version-finalize.yml does not mutate pull requests. Post-release changelog automation remains a separate workflow and permission boundary.

Apply Ruleset

Create or update a GitHub ruleset from a JSON file. Idempotent: looks up by name, creates if missing, updates if found.

# Basic usage (from repository root)
.github/branch-protection/apply-ruleset.sh stella/stella \
.github/branch-protection/ruleset-main.json
# With github-actions[bot] bypass (for SBOM workflow etc.)
.github/branch-protection/apply-ruleset.sh --github-actions-bypass \
stella/stella .github/branch-protection/ruleset-main.json

Composite Actions

typescript-checks

Setup pnpm, install dependencies with caching, and run lint + format + typecheck.

jobs:
ci:
runs-on: ubuntu-latestpermissions:
contents: readsteps:
- uses: actions/checkout@v4
- name: TypeScript Checksuses: stella/.github/actions/typescript-checks@main

Inputs:

  • run-lint - Run pnpm lint (default: true)
  • run-format - Run pnpm format (default: true)
  • run-typecheck - Run pnpm typecheck (default: true)
  • run-codespell - Run codespell spell checker (default: true)
  • working-directory - Working directory (default: .)
  • node-version-file - Node version file (default: .nvmrc)

notify-failure

Send failure notification to Google Chat webhook.

steps:
- name: Buildrun: ./build.sh
- name: Notify on failureif: failure()uses: stella/.github/actions/notify-failure@mainwith:
webhook-url: ${{ secrets.GOOGLE_CHAT_WEBHOOK }}message: 'Failed to build service-name in production.'

provenance-check

Install a pinned stella/provenance release binary and fail if committed provenance/ artifacts are stale.

steps:
- uses: actions/checkout@v6
- name: Provenanceuses: stella/.github/actions/provenance-check@mainwith:
provenance-version: v0.1.2

Inputs:

  • root - Repository root to scan (default: .)
  • node-version - Node.js version used to install cdxgen (default: 22)
  • cdxgen-version - Pinned @cyclonedx/cdxgen version (default: 12.1.5)
  • install-syft - Install Syft for container provenance checks (default: false)
  • syft-version - Pinned Syft release tag (default: v1.42.4)
  • provenance-version - GitHub release tag in stella/provenance to install (default: v0.1.2)
  • provenance-repository - Provenance repository slug (default: stella/provenance)
  • show-diff-on-failure - Print provenance diff output on failure (default: true)

About

Organization-wide GitHub configuration, reusable workflows, and profile assets for stella repositories

Topics

Resources

Code of conduct

Stars

1 star

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Repository files navigation

stella/.github

Organization-wide GitHub configurations, reusable workflows, and templates.

Contents

Reusable Workflows

WorkflowDescription
pr-lint.ymlPR linting: conventional commits, labels, auto-assign
base-checks.ymlComposite workflow calling pr-lint
dependabot-bun-dedupe.ymlDedupe Bun lockfiles on trusted Dependabot pull requests
audit-branch-protection.ymlDrift detection for GitHub rulesets (compliance evidence)
ai-shared-update.ymlUpdate the pinned stella/ai-shared submodule, regenerate consumers, and open a PR
provenance-update.ymlReusable nightly/manual provenance refresh that opens a PR when provenance/ drifts
changeset-release-pr.ymlMaintain a version-only Changesets PR with an app-scoped token
npm-independent-release.ymlPublish independently versioned npm monorepos from caller-built tarballs
npm-artifact-publish.ymlPublish one pre-packed npm artifact without exposing OIDC to its build
pypi-publish-hardenedPrepare and verify an exact wheel matrix around top-level PyPI trusted publishing
crates-io-publish.ymlPackage without OIDC, then attest and publish exact crate bytes
release-policy.ymlEnforce immutable, artifact-only release privilege boundaries

Composite Actions

ActionDescription
typescript-checksSetup pnpm, install deps, run lint + format + typecheck
notify-failureSend failure notification to Google Chat webhook
provenance-checkInstall stella/provenance and verify committed provenance artifacts
changeset-policyRequire valid release intent for caller-declared package paths
npm-publish-hardenedPublish pre-packed npm tarballs through trusted publishing
sync-cargo-workspace-lockSynchronize inherited Cargo workspace versions in Cargo.lock

Templates

  • PULL_REQUEST_TEMPLATE.md - Standard PR template
  • ISSUE_TEMPLATE/ - Bug report, epic, feature request, other

Label Definitions

  • labels.yml - Standardized labels (reference for manual setup)

Usage

Dependabot Bun Dedupe

Keep the pull request trigger and the required autofix.ci workflow name in the calling repository. Install the autofix.ci GitHub App for the caller, then pin the shared workflow to a reviewed commit:

# .github/workflows/autofix.ymlname: autofix.cion:
pull_request:
types: [opened, synchronize, reopened]paths:
- bun.lockconcurrency:
group: ${{ github.workflow }}-${{ github.event.pull_request.number }}cancel-in-progress: truepermissions:
contents: readjobs:
dependabot-bun-dedupe:
uses: stella/.github/.github/workflows/dependabot-bun-dedupe.yml@<commit-sha>

The shared workflow accepts only same-repository Dependabot branches under dependabot/bun/. It runs Bun's lockfile-only dedupe and rejects changes outside bun.lock before passing the patch to autofix.ci. Callers may pass runs-on as a JSON runner-label array; it defaults to ["ubuntu-24.04"].

Base Checks (Recommended)

Use this composite workflow to run all standard checks:

# .github/workflows/ci.ymlname: CIon:
pull_request:
types: [opened, synchronize, reopened, edited]permissions: write-alljobs:
checks:
uses: stella/.github/.github/workflows/base-checks.yml@mainsecrets: inherit

PR Lint

# .github/workflows/pr-lint.ymlname: PR Linton:
pull_request:
types: [opened, synchronize, reopened, edited]branches-ignore:
- "dependabot/**"concurrency:
group: ${{ github.workflow }}-${{ github.ref }}cancel-in-progress: truepermissions: write-alljobs:
pr-lint:
uses: stella/.github/.github/workflows/pr-lint.yml@mainsecrets: inherit

Branch Protection Scripts

ScriptDescription
apply-ruleset.shIdempotent create/update of a GitHub ruleset from JSON

Audit Branch Protection

Compares live GitHub rulesets against a checked-in expected config and uploads the result as a compliance artifact (365-day retention). Detects drift and fails if the live config diverges from the expected state.

# .github/workflows/audit-branch-protection.ymlname: Audit Branch Protectionon:
schedule:
- cron: "0 8 * * 1"# Monday 08:00 UTCworkflow_dispatch:
jobs:
audit:
uses: stella/.github/.github/workflows/audit-branch-protection.yml@mainwith:
expected-config-path: .github/branch-protection/ruleset-main.jsonsecrets:
BRANCH_PROTECTION_APP_ID: ${{ secrets.BRANCH_PROTECTION_APP_ID }}BRANCH_PROTECTION_APP_KEY: ${{ secrets.BRANCH_PROTECTION_APP_KEY }}

Secrets required:

  • BRANCH_PROTECTION_APP_ID — GitHub App ID with Administration: Read and write
  • BRANCH_PROTECTION_APP_KEY — GitHub App private key (PEM)

Inputs:

  • expected-config-path — path to the expected ruleset JSON (default: .github/branch-protection/ruleset-main.json)

Provenance Update

Runs provenance generate in the calling repository and opens or updates a pull request when checked-in provenance/ artifacts drift. This workflow never pushes directly to main.

The schedule must live in the calling repository.

# .github/workflows/provenance-nightly.ymlname: Provenance Nightlyon:
schedule:
- cron: "0 2 * * *"workflow_dispatch:
jobs:
provenance-update:
permissions:
contents: writepull-requests: writeuses: stella/.github/.github/workflows/provenance-update.yml@<commit-sha>with:
install-command: bun install --frozen-lockfileprovenance-version: v0.1.2secrets: inherit

Inputs:

  • root — repository root to scan (default: .)
  • node-version — Node.js version used to install cdxgen (default: 22)
  • cdxgen-version — pinned @cyclonedx/cdxgen version (default: 12.1.5)
  • install-syft — install Syft before generation (default: false)
  • syft-version — pinned Syft release tag (default: v1.42.4)
  • provenance-version — GitHub release tag in stella/provenance to install (default: v0.1.2)
  • provenance-repository — provenance repository slug (default: stella/provenance)
  • install-command — optional dependency install command run before generation (default: bun install --frozen-lockfile)
  • branch — branch used for refresh PRs (default: chore/provenance-update)
  • commit-message — commit message for generated refreshes (default: chore: refresh provenance artifacts)
  • pr-title — pull request title for generated refreshes (default: chore: refresh provenance artifacts)
  • pr-body — pull request body for generated refreshes (default: Automated provenance refresh generated by the shared nightly updater.)

Optional secrets:

  • auth_token — token for updater PR creation when downstream CI should run; if omitted, the workflow falls back to github.token

AI shared updates

Consumer repositories keep .ai/shared pinned for reproducible CI, then call the shared updater on a schedule. The updater fetches the selected stella/ai-shared ref, rejects non-fast-forward changes, runs the fetched canonical sync script, and opens or updates one PR containing the submodule pointer and every generated file.

name: Update shared AI toolingon:
schedule:
- cron: "17 7 * * 1"workflow_dispatch:
permissions:
actions: writecontents: writepull-requests: writejobs:
update:
uses: stella/.github/.github/workflows/ai-shared-update.yml@<commit-sha>with:
runs-on: '["self-hosted","linux","x64"]'validation-workflow: ci.yml

runs-on accepts a JSON runner label array and defaults to ["ubuntu-latest"] when omitted. Only select self-hosted runners trusted with the workflow's declared permissions and secrets.

The caller must enable GitHub Actions to create pull requests when relying on the repository GITHUB_TOKEN. Alternatively, pass auth_token, or app_id plus app_private_key, from a dedicated bot. A PAT or App token triggers normal PR CI; the default-token path can explicitly dispatch a caller-selected workflow that supports workflow_dispatch.

The updater checks out the caller without persisted credentials and does not mint an optional App token until after the newly fetched sync script finishes. Consumer CI and local commands continue to execute only the committed submodule revision.

Changeset releases

Package repositories keep their source-path and version-synchronization rules local, then delegate enforcement and version-PR maintenance to these shared contracts. Changesets only prepares release metadata; the existing hardened release workflow remains the sole publisher.

jobs:
changeset:
if: github.event_name == 'pull_request'runs-on: ubuntu-latestpermissions:
contents: readsteps:
- uses: actions/checkout@<commit-sha>with:
fetch-depth: 0persist-credentials: false
- uses: stella/.github/.github/actions/changeset-policy@<commit-sha>with:
release-paths: | src/** crates/core/src/**generated-paths: | CHANGELOG.md VERSION Cargo.toml Cargo.lock package.json wasm/package.jsonpackage-files: | package.json# In a separate push-to-main workflow:jobs:
version:
uses: stella/.github/.github/workflows/changeset-release-pr.yml@<commit-sha>with:
prepare-rust-wasm: trueruns-on: '["self-hosted","linux","x64"]'sync-cargo-inherited-lock: truesecrets: inherit

runs-on accepts a JSON runner label array and defaults to ["ubuntu-latest"] when omitted. Only select self-hosted runners trusted with the workflow's declared permissions and secrets.

The caller must provide changeset, changeset:version, and a .changeset/config.json. The shared workflow serializes each target branch without interrupting an active release mutation, and skips write-capable steps when its trigger commit is no longer the branch head. A current no-op run closes any stale version PR and deletes its generated branch, so queued runs converge without a duplicate release PR. Callers should use matching workflow-level concurrency without cancellation; newer pushes replace obsolete pending runs while the active mutation finishes.

For hybrid repositories, changeset:version must synchronize the selected package version into every npm, Cargo manifest, Python, and central VERSION surface. With sync-cargo-inherited-lock enabled, the shared workflow validates the incoming lockfile and updates inherited local Cargo package entries inside the same Changesets transaction, before the generated PR is committed. The version command must preserve the committed Bun lockfile: deleting bun.lock/bun.lockb or running an unfrozen bun install is rejected by the shared policy.

When a version command regenerates browser Wasm artifacts, prepare-rust-wasm installs the wasm32-unknown-unknown target and the exact wasm-bindgen CLI version resolved from the caller's locked Cargo workspace. The option is disabled by default and expects the workspace at cargo-manifest to resolve exactly one wasm-bindgen runtime version with all features enabled.

Repositories whose Cargo packages use version.workspace = true can validate or repair the corresponding local Cargo.lock entries without maintaining a package allowlist:

- uses: stella/.github/.github/actions/sync-cargo-workspace-lock@<commit-sha>with:
mode: check # use write while generating synchronized release metadata

The action discovers root workspace members with locked Cargo metadata, changes only members that explicitly inherit [workspace.package].version, and leaves explicitly versioned and registry packages untouched.

Independent npm package releases

Independently versioned Changesets monorepos keep build and pack commands in their own workflow, with no write credential or OIDC permission in that job. The privileged job delegates the complete release transaction to the shared workflow:

jobs:
pack:
permissions:
contents: read# Build each public package, pack one .tgz, then upload one artifact per package.release:
needs: packpermissions:
actions: readcontents: writeid-token: writeuses: stella/.github/.github/workflows/npm-independent-release.yml@<commit-sha>with:
artifact-pattern: npm-tarball-*github-latest-package: "@scope/core"github-latest-policy: canonical-packagepackage-files: | packages/core/package.json packages/react/package.jsonsecrets:
RELEASE_APP_ID: ${{ secrets.RELEASE_APP_ID }}RELEASE_APP_PRIVATE_KEY: ${{ secrets.RELEASE_APP_PRIVATE_KEY }}

The shared job validates an exact one-to-one mapping between the declared public manifests and packed tarballs. It rejects unresolved workspace:, catalog:, link:, and file: dependency specifiers, orders internal dependencies before dependants, stages one draft release per <name>@<version>, publishes only versions missing from npm, verifies the release asset against npm dist.integrity, then makes the draft releases public. Existing complete versions are immutable no-ops. Safe partial runs resume; registry-only versions are repaired with the registry artifact and release notes that do not claim a local rebuild was the originally uploaded file. Package releases preserve the repository's existing GitHub Latest pointer by default. Repositories with one canonical package can set github-latest-policy to canonical-package and name it with github-latest-package; after the transaction is complete, that package's stable release becomes Latest regardless of dependency or publication order. Package-only repositories can instead use newest-published-stable to promote the last stable package release created from the release commit. Prereleases are never eligible. Manual recovery can pass both source-ref and artifact-run-id; the shared workflow accepts the earlier artifacts only when that run used the resolved source commit and the same caller workflow path. Pass environment when RELEASE_APP_PRIVATE_KEY is an environment secret; the release job then runs in that environment, so its deployment policy decides which refs can mint the token.

Each package must have an adjacent CHANGELOG.md section headed ## <version>. Uploaded artifacts may include checksum files, but each must contain exactly one .tgz; only that tarball becomes the corresponding GitHub release asset.

Trusted publishing is authorized against the calling repository workflow filename, not npm-independent-release.yml. Keep that local filename stable and configure the npm trusted publisher for it. Both the caller job and reusable workflow grant id-token: write; no npm token is accepted. Optional RELEASE_APP_ID and RELEASE_APP_PRIVATE_KEY secrets let protected tags and releases use a repository GitHub App token.

Callers that pack a verified commit other than the triggering github.sha (for example, a workflow_run gated on a promoted application release) pass that commit as source-ref. The shared workflow resolves the ref once after checkout and uses the resulting immutable SHA for package tag and release provenance.

Release privilege policy

Keep builds, tests, package installation, and artifact creation in caller jobs with read-only permissions. A separate workflow supplies one stable required check:

# .github/workflows/release-policy.ymlname: Release policyon:
pull_request:
paths: [.github/workflows/release.yml]push:
branches: [main]paths: [.github/workflows/release.yml]permissions:
contents: readjobs:
release-policy:
uses: stella/.github/.github/workflows/release-policy.yml@<commit-sha>

Require Release policy / Enforce release boundaries on the default branch. The policy rejects public-event release triggers, workflow-level execution controls, mutable action references, floating Node.js or Bun runtimes, inherited secrets, and repository-controlled code in an OIDC or write-capable job. Approved publishers must use the same immutable shared commit as the policy.

For tamper-resistant enforcement, configure this workflow as a ruleset workflow sourced from stella/.github; the local caller is fast feedback, not the trust anchor. The shared workflow supports pull_request and merge_group for that purpose and selects publish.yml for stella/tooling, otherwise release.yml.

PyPI trusted publishers remain bound to each caller's top-level release workflow; PyPI does not support reusable workflows for this OIDC exchange. Callers use the pinned pypi-publish-hardened prepare action, invoke the pinned PyPI Docker action directly, then use the pinned verification action. The shared guards validate the exact declared wheel set and verify published files byte for byte without nesting a Docker action inside a composite action.

crates.io and npm callers can delegate to crates-io-publish.yml, npm-artifact-publish.yml, or npm-version-finalize.yml. Their unprivileged jobs hand immutable artifacts to the shared privileged implementation; no caller source is executed after OIDC becomes available.

npm-version-finalize.yml does not mutate pull requests. Post-release changelog automation remains a separate workflow and permission boundary.

Apply Ruleset

Create or update a GitHub ruleset from a JSON file. Idempotent: looks up by name, creates if missing, updates if found.

# Basic usage (from repository root)
.github/branch-protection/apply-ruleset.sh stella/stella \
.github/branch-protection/ruleset-main.json
# With github-actions[bot] bypass (for SBOM workflow etc.)
.github/branch-protection/apply-ruleset.sh --github-actions-bypass \
stella/stella .github/branch-protection/ruleset-main.json

Composite Actions

typescript-checks

Setup pnpm, install dependencies with caching, and run lint + format + typecheck.

jobs:
ci:
runs-on: ubuntu-latestpermissions:
contents: readsteps:
- uses: actions/checkout@v4
- name: TypeScript Checksuses: stella/.github/actions/typescript-checks@main

Inputs:

  • run-lint - Run pnpm lint (default: true)
  • run-format - Run pnpm format (default: true)
  • run-typecheck - Run pnpm typecheck (default: true)
  • run-codespell - Run codespell spell checker (default: true)
  • working-directory - Working directory (default: .)
  • node-version-file - Node version file (default: .nvmrc)

notify-failure

Send failure notification to Google Chat webhook.

steps:
- name: Buildrun: ./build.sh
- name: Notify on failureif: failure()uses: stella/.github/actions/notify-failure@mainwith:
webhook-url: ${{ secrets.GOOGLE_CHAT_WEBHOOK }}message: 'Failed to build service-name in production.'

provenance-check

Install a pinned stella/provenance release binary and fail if committed provenance/ artifacts are stale.

steps:
- uses: actions/checkout@v6
- name: Provenanceuses: stella/.github/actions/provenance-check@mainwith:
provenance-version: v0.1.2

Inputs:

  • root - Repository root to scan (default: .)
  • node-version - Node.js version used to install cdxgen (default: 22)
  • cdxgen-version - Pinned @cyclonedx/cdxgen version (default: 12.1.5)
  • install-syft - Install Syft for container provenance checks (default: false)
  • syft-version - Pinned Syft release tag (default: v1.42.4)
  • provenance-version - GitHub release tag in stella/provenance to install (default: v0.1.2)
  • provenance-repository - Provenance repository slug (default: stella/provenance)
  • show-diff-on-failure - Print provenance diff output on failure (default: true)

About

Organization-wide GitHub configuration, reusable workflows, and profile assets for stella repositories

Topics

Resources

Code of conduct

Stars

1 star

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

stella/.github

Organization-wide GitHub configurations, reusable workflows, and templates.

Contents

Reusable Workflows

WorkflowDescription
pr-lint.ymlPR linting: conventional commits, labels, auto-assign
base-checks.ymlComposite workflow calling pr-lint
dependabot-bun-dedupe.ymlDedupe Bun lockfiles on trusted Dependabot pull requests
audit-branch-protection.ymlDrift detection for GitHub rulesets (compliance evidence)
ai-shared-update.ymlUpdate the pinned stella/ai-shared submodule, regenerate consumers, and open a PR
provenance-update.ymlReusable nightly/manual provenance refresh that opens a PR when provenance/ drifts
changeset-release-pr.ymlMaintain a version-only Changesets PR with an app-scoped token
npm-independent-release.ymlPublish independently versioned npm monorepos from caller-built tarballs
npm-artifact-publish.ymlPublish one pre-packed npm artifact without exposing OIDC to its build
pypi-publish-hardenedPrepare and verify an exact wheel matrix around top-level PyPI trusted publishing
crates-io-publish.ymlPackage without OIDC, then attest and publish exact crate bytes
release-policy.ymlEnforce immutable, artifact-only release privilege boundaries

Composite Actions

ActionDescription
typescript-checksSetup pnpm, install deps, run lint + format + typecheck
notify-failureSend failure notification to Google Chat webhook
provenance-checkInstall stella/provenance and verify committed provenance artifacts
changeset-policyRequire valid release intent for caller-declared package paths
npm-publish-hardenedPublish pre-packed npm tarballs through trusted publishing
sync-cargo-workspace-lockSynchronize inherited Cargo workspace versions in Cargo.lock

Templates

  • PULL_REQUEST_TEMPLATE.md - Standard PR template
  • ISSUE_TEMPLATE/ - Bug report, epic, feature request, other

Label Definitions

  • labels.yml - Standardized labels (reference for manual setup)

Usage

Dependabot Bun Dedupe

Keep the pull request trigger and the required autofix.ci workflow name in the calling repository. Install the autofix.ci GitHub App for the caller, then pin the shared workflow to a reviewed commit:

# .github/workflows/autofix.ymlname: autofix.cion:
pull_request:
types: [opened, synchronize, reopened]paths:
- bun.lockconcurrency:
group: ${{ github.workflow }}-${{ github.event.pull_request.number }}cancel-in-progress: truepermissions:
contents: readjobs:
dependabot-bun-dedupe:
uses: stella/.github/.github/workflows/dependabot-bun-dedupe.yml@<commit-sha>

The shared workflow accepts only same-repository Dependabot branches under dependabot/bun/. It runs Bun's lockfile-only dedupe and rejects changes outside bun.lock before passing the patch to autofix.ci. Callers may pass runs-on as a JSON runner-label array; it defaults to ["ubuntu-24.04"].

Base Checks (Recommended)

Use this composite workflow to run all standard checks:

# .github/workflows/ci.ymlname: CIon:
pull_request:
types: [opened, synchronize, reopened, edited]permissions: write-alljobs:
checks:
uses: stella/.github/.github/workflows/base-checks.yml@mainsecrets: inherit

PR Lint

# .github/workflows/pr-lint.ymlname: PR Linton:
pull_request:
types: [opened, synchronize, reopened, edited]branches-ignore:
- "dependabot/**"concurrency:
group: ${{ github.workflow }}-${{ github.ref }}cancel-in-progress: truepermissions: write-alljobs:
pr-lint:
uses: stella/.github/.github/workflows/pr-lint.yml@mainsecrets: inherit

Branch Protection Scripts

ScriptDescription
apply-ruleset.shIdempotent create/update of a GitHub ruleset from JSON

Audit Branch Protection

Compares live GitHub rulesets against a checked-in expected config and uploads the result as a compliance artifact (365-day retention). Detects drift and fails if the live config diverges from the expected state.

# .github/workflows/audit-branch-protection.ymlname: Audit Branch Protectionon:
schedule:
- cron: "0 8 * * 1"# Monday 08:00 UTCworkflow_dispatch:
jobs:
audit:
uses: stella/.github/.github/workflows/audit-branch-protection.yml@mainwith:
expected-config-path: .github/branch-protection/ruleset-main.jsonsecrets:
BRANCH_PROTECTION_APP_ID: ${{ secrets.BRANCH_PROTECTION_APP_ID }}BRANCH_PROTECTION_APP_KEY: ${{ secrets.BRANCH_PROTECTION_APP_KEY }}

Secrets required:

  • BRANCH_PROTECTION_APP_ID — GitHub App ID with Administration: Read and write
  • BRANCH_PROTECTION_APP_KEY — GitHub App private key (PEM)

Inputs:

  • expected-config-path — path to the expected ruleset JSON (default: .github/branch-protection/ruleset-main.json)

Provenance Update

Runs provenance generate in the calling repository and opens or updates a pull request when checked-in provenance/ artifacts drift. This workflow never pushes directly to main.

The schedule must live in the calling repository.

# .github/workflows/provenance-nightly.ymlname: Provenance Nightlyon:
schedule:
- cron: "0 2 * * *"workflow_dispatch:
jobs:
provenance-update:
permissions:
contents: writepull-requests: writeuses: stella/.github/.github/workflows/provenance-update.yml@<commit-sha>with:
install-command: bun install --frozen-lockfileprovenance-version: v0.1.2secrets: inherit

Inputs:

  • root — repository root to scan (default: .)
  • node-version — Node.js version used to install cdxgen (default: 22)
  • cdxgen-version — pinned @cyclonedx/cdxgen version (default: 12.1.5)
  • install-syft — install Syft before generation (default: false)
  • syft-version — pinned Syft release tag (default: v1.42.4)
  • provenance-version — GitHub release tag in stella/provenance to install (default: v0.1.2)
  • provenance-repository — provenance repository slug (default: stella/provenance)
  • install-command — optional dependency install command run before generation (default: bun install --frozen-lockfile)
  • branch — branch used for refresh PRs (default: chore/provenance-update)
  • commit-message — commit message for generated refreshes (default: chore: refresh provenance artifacts)
  • pr-title — pull request title for generated refreshes (default: chore: refresh provenance artifacts)
  • pr-body — pull request body for generated refreshes (default: Automated provenance refresh generated by the shared nightly updater.)

Optional secrets:

  • auth_token — token for updater PR creation when downstream CI should run; if omitted, the workflow falls back to github.token

AI shared updates

Consumer repositories keep .ai/shared pinned for reproducible CI, then call the shared updater on a schedule. The updater fetches the selected stella/ai-shared ref, rejects non-fast-forward changes, runs the fetched canonical sync script, and opens or updates one PR containing the submodule pointer and every generated file.

name: Update shared AI toolingon:
schedule:
- cron: "17 7 * * 1"workflow_dispatch:
permissions:
actions: writecontents: writepull-requests: writejobs:
update:
uses: stella/.github/.github/workflows/ai-shared-update.yml@<commit-sha>with:
runs-on: '["self-hosted","linux","x64"]'validation-workflow: ci.yml

runs-on accepts a JSON runner label array and defaults to ["ubuntu-latest"] when omitted. Only select self-hosted runners trusted with the workflow's declared permissions and secrets.

The caller must enable GitHub Actions to create pull requests when relying on the repository GITHUB_TOKEN. Alternatively, pass auth_token, or app_id plus app_private_key, from a dedicated bot. A PAT or App token triggers normal PR CI; the default-token path can explicitly dispatch a caller-selected workflow that supports workflow_dispatch.

The updater checks out the caller without persisted credentials and does not mint an optional App token until after the newly fetched sync script finishes. Consumer CI and local commands continue to execute only the committed submodule revision.

Changeset releases

Package repositories keep their source-path and version-synchronization rules local, then delegate enforcement and version-PR maintenance to these shared contracts. Changesets only prepares release metadata; the existing hardened release workflow remains the sole publisher.

jobs:
changeset:
if: github.event_name == 'pull_request'runs-on: ubuntu-latestpermissions:
contents: readsteps:
- uses: actions/checkout@<commit-sha>with:
fetch-depth: 0persist-credentials: false
- uses: stella/.github/.github/actions/changeset-policy@<commit-sha>with:
release-paths: | src/** crates/core/src/**generated-paths: | CHANGELOG.md VERSION Cargo.toml Cargo.lock package.json wasm/package.jsonpackage-files: | package.json# In a separate push-to-main workflow:jobs:
version:
uses: stella/.github/.github/workflows/changeset-release-pr.yml@<commit-sha>with:
prepare-rust-wasm: trueruns-on: '["self-hosted","linux","x64"]'sync-cargo-inherited-lock: truesecrets: inherit

runs-on accepts a JSON runner label array and defaults to ["ubuntu-latest"] when omitted. Only select self-hosted runners trusted with the workflow's declared permissions and secrets.

The caller must provide changeset, changeset:version, and a .changeset/config.json. The shared workflow serializes each target branch without interrupting an active release mutation, and skips write-capable steps when its trigger commit is no longer the branch head. A current no-op run closes any stale version PR and deletes its generated branch, so queued runs converge without a duplicate release PR. Callers should use matching workflow-level concurrency without cancellation; newer pushes replace obsolete pending runs while the active mutation finishes.

For hybrid repositories, changeset:version must synchronize the selected package version into every npm, Cargo manifest, Python, and central VERSION surface. With sync-cargo-inherited-lock enabled, the shared workflow validates the incoming lockfile and updates inherited local Cargo package entries inside the same Changesets transaction, before the generated PR is committed. The version command must preserve the committed Bun lockfile: deleting bun.lock/bun.lockb or running an unfrozen bun install is rejected by the shared policy.

When a version command regenerates browser Wasm artifacts, prepare-rust-wasm installs the wasm32-unknown-unknown target and the exact wasm-bindgen CLI version resolved from the caller's locked Cargo workspace. The option is disabled by default and expects the workspace at cargo-manifest to resolve exactly one wasm-bindgen runtime version with all features enabled.

Repositories whose Cargo packages use version.workspace = true can validate or repair the corresponding local Cargo.lock entries without maintaining a package allowlist:

- uses: stella/.github/.github/actions/sync-cargo-workspace-lock@<commit-sha>with:
mode: check # use write while generating synchronized release metadata

The action discovers root workspace members with locked Cargo metadata, changes only members that explicitly inherit [workspace.package].version, and leaves explicitly versioned and registry packages untouched.

Independent npm package releases

Independently versioned Changesets monorepos keep build and pack commands in their own workflow, with no write credential or OIDC permission in that job. The privileged job delegates the complete release transaction to the shared workflow:

jobs:
pack:
permissions:
contents: read# Build each public package, pack one .tgz, then upload one artifact per package.release:
needs: packpermissions:
actions: readcontents: writeid-token: writeuses: stella/.github/.github/workflows/npm-independent-release.yml@<commit-sha>with:
artifact-pattern: npm-tarball-*github-latest-package: "@scope/core"github-latest-policy: canonical-packagepackage-files: | packages/core/package.json packages/react/package.jsonsecrets:
RELEASE_APP_ID: ${{ secrets.RELEASE_APP_ID }}RELEASE_APP_PRIVATE_KEY: ${{ secrets.RELEASE_APP_PRIVATE_KEY }}

The shared job validates an exact one-to-one mapping between the declared public manifests and packed tarballs. It rejects unresolved workspace:, catalog:, link:, and file: dependency specifiers, orders internal dependencies before dependants, stages one draft release per <name>@<version>, publishes only versions missing from npm, verifies the release asset against npm dist.integrity, then makes the draft releases public. Existing complete versions are immutable no-ops. Safe partial runs resume; registry-only versions are repaired with the registry artifact and release notes that do not claim a local rebuild was the originally uploaded file. Package releases preserve the repository's existing GitHub Latest pointer by default. Repositories with one canonical package can set github-latest-policy to canonical-package and name it with github-latest-package; after the transaction is complete, that package's stable release becomes Latest regardless of dependency or publication order. Package-only repositories can instead use newest-published-stable to promote the last stable package release created from the release commit. Prereleases are never eligible. Manual recovery can pass both source-ref and artifact-run-id; the shared workflow accepts the earlier artifacts only when that run used the resolved source commit and the same caller workflow path. Pass environment when RELEASE_APP_PRIVATE_KEY is an environment secret; the release job then runs in that environment, so its deployment policy decides which refs can mint the token.

Each package must have an adjacent CHANGELOG.md section headed ## <version>. Uploaded artifacts may include checksum files, but each must contain exactly one .tgz; only that tarball becomes the corresponding GitHub release asset.

Trusted publishing is authorized against the calling repository workflow filename, not npm-independent-release.yml. Keep that local filename stable and configure the npm trusted publisher for it. Both the caller job and reusable workflow grant id-token: write; no npm token is accepted. Optional RELEASE_APP_ID and RELEASE_APP_PRIVATE_KEY secrets let protected tags and releases use a repository GitHub App token.

Callers that pack a verified commit other than the triggering github.sha (for example, a workflow_run gated on a promoted application release) pass that commit as source-ref. The shared workflow resolves the ref once after checkout and uses the resulting immutable SHA for package tag and release provenance.

Release privilege policy

Keep builds, tests, package installation, and artifact creation in caller jobs with read-only permissions. A separate workflow supplies one stable required check:

# .github/workflows/release-policy.ymlname: Release policyon:
pull_request:
paths: [.github/workflows/release.yml]push:
branches: [main]paths: [.github/workflows/release.yml]permissions:
contents: readjobs:
release-policy:
uses: stella/.github/.github/workflows/release-policy.yml@<commit-sha>

Require Release policy / Enforce release boundaries on the default branch. The policy rejects public-event release triggers, workflow-level execution controls, mutable action references, floating Node.js or Bun runtimes, inherited secrets, and repository-controlled code in an OIDC or write-capable job. Approved publishers must use the same immutable shared commit as the policy.

For tamper-resistant enforcement, configure this workflow as a ruleset workflow sourced from stella/.github; the local caller is fast feedback, not the trust anchor. The shared workflow supports pull_request and merge_group for that purpose and selects publish.yml for stella/tooling, otherwise release.yml.

PyPI trusted publishers remain bound to each caller's top-level release workflow; PyPI does not support reusable workflows for this OIDC exchange. Callers use the pinned pypi-publish-hardened prepare action, invoke the pinned PyPI Docker action directly, then use the pinned verification action. The shared guards validate the exact declared wheel set and verify published files byte for byte without nesting a Docker action inside a composite action.

crates.io and npm callers can delegate to crates-io-publish.yml, npm-artifact-publish.yml, or npm-version-finalize.yml. Their unprivileged jobs hand immutable artifacts to the shared privileged implementation; no caller source is executed after OIDC becomes available.

npm-version-finalize.yml does not mutate pull requests. Post-release changelog automation remains a separate workflow and permission boundary.

Apply Ruleset

Create or update a GitHub ruleset from a JSON file. Idempotent: looks up by name, creates if missing, updates if found.

# Basic usage (from repository root)
.github/branch-protection/apply-ruleset.sh stella/stella \
.github/branch-protection/ruleset-main.json
# With github-actions[bot] bypass (for SBOM workflow etc.)
.github/branch-protection/apply-ruleset.sh --github-actions-bypass \
stella/stella .github/branch-protection/ruleset-main.json

Composite Actions

typescript-checks

Setup pnpm, install dependencies with caching, and run lint + format + typecheck.

jobs:
ci:
runs-on: ubuntu-latestpermissions:
contents: readsteps:
- uses: actions/checkout@v4
- name: TypeScript Checksuses: stella/.github/actions/typescript-checks@main

Inputs:

  • run-lint - Run pnpm lint (default: true)
  • run-format - Run pnpm format (default: true)
  • run-typecheck - Run pnpm typecheck (default: true)
  • run-codespell - Run codespell spell checker (default: true)
  • working-directory - Working directory (default: .)
  • node-version-file - Node version file (default: .nvmrc)

notify-failure

Send failure notification to Google Chat webhook.

steps:
- name: Buildrun: ./build.sh
- name: Notify on failureif: failure()uses: stella/.github/actions/notify-failure@mainwith:
webhook-url: ${{ secrets.GOOGLE_CHAT_WEBHOOK }}message: 'Failed to build service-name in production.'

provenance-check

Install a pinned stella/provenance release binary and fail if committed provenance/ artifacts are stale.

steps:
- uses: actions/checkout@v6
- name: Provenanceuses: stella/.github/actions/provenance-check@mainwith:
provenance-version: v0.1.2

Inputs:

  • root - Repository root to scan (default: .)
  • node-version - Node.js version used to install cdxgen (default: 22)
  • cdxgen-version - Pinned @cyclonedx/cdxgen version (default: 12.1.5)
  • install-syft - Install Syft for container provenance checks (default: false)
  • syft-version - Pinned Syft release tag (default: v1.42.4)
  • provenance-version - GitHub release tag in stella/provenance to install (default: v0.1.2)
  • provenance-repository - Provenance repository slug (default: stella/provenance)
  • show-diff-on-failure - Print provenance diff output on failure (default: true)

About

Organization-wide GitHub configuration, reusable workflows, and profile assets for stella repositories

Topics

Resources

Code of conduct

Stars

1 star

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

stella/.github

Organization-wide GitHub configurations, reusable workflows, and templates.

Contents

Reusable Workflows

WorkflowDescription
pr-lint.ymlPR linting: conventional commits, labels, auto-assign
base-checks.ymlComposite workflow calling pr-lint
dependabot-bun-dedupe.ymlDedupe Bun lockfiles on trusted Dependabot pull requests
audit-branch-protection.ymlDrift detection for GitHub rulesets (compliance evidence)
ai-shared-update.ymlUpdate the pinned stella/ai-shared submodule, regenerate consumers, and open a PR
provenance-update.ymlReusable nightly/manual provenance refresh that opens a PR when provenance/ drifts
changeset-release-pr.ymlMaintain a version-only Changesets PR with an app-scoped token
npm-independent-release.ymlPublish independently versioned npm monorepos from caller-built tarballs
npm-artifact-publish.ymlPublish one pre-packed npm artifact without exposing OIDC to its build
pypi-publish-hardenedPrepare and verify an exact wheel matrix around top-level PyPI trusted publishing
crates-io-publish.ymlPackage without OIDC, then attest and publish exact crate bytes
release-policy.ymlEnforce immutable, artifact-only release privilege boundaries

Composite Actions

ActionDescription
typescript-checksSetup pnpm, install deps, run lint + format + typecheck
notify-failureSend failure notification to Google Chat webhook
provenance-checkInstall stella/provenance and verify committed provenance artifacts
changeset-policyRequire valid release intent for caller-declared package paths
npm-publish-hardenedPublish pre-packed npm tarballs through trusted publishing
sync-cargo-workspace-lockSynchronize inherited Cargo workspace versions in Cargo.lock

Templates

  • PULL_REQUEST_TEMPLATE.md - Standard PR template
  • ISSUE_TEMPLATE/ - Bug report, epic, feature request, other

Label Definitions

  • labels.yml - Standardized labels (reference for manual setup)

Usage

Dependabot Bun Dedupe

Keep the pull request trigger and the required autofix.ci workflow name in the calling repository. Install the autofix.ci GitHub App for the caller, then pin the shared workflow to a reviewed commit:

# .github/workflows/autofix.ymlname: autofix.cion:
pull_request:
types: [opened, synchronize, reopened]paths:
- bun.lockconcurrency:
group: ${{ github.workflow }}-${{ github.event.pull_request.number }}cancel-in-progress: truepermissions:
contents: readjobs:
dependabot-bun-dedupe:
uses: stella/.github/.github/workflows/dependabot-bun-dedupe.yml@<commit-sha>

The shared workflow accepts only same-repository Dependabot branches under dependabot/bun/. It runs Bun's lockfile-only dedupe and rejects changes outside bun.lock before passing the patch to autofix.ci. Callers may pass runs-on as a JSON runner-label array; it defaults to ["ubuntu-24.04"].

Base Checks (Recommended)

Use this composite workflow to run all standard checks:

# .github/workflows/ci.ymlname: CIon:
pull_request:
types: [opened, synchronize, reopened, edited]permissions: write-alljobs:
checks:
uses: stella/.github/.github/workflows/base-checks.yml@mainsecrets: inherit

PR Lint

# .github/workflows/pr-lint.ymlname: PR Linton:
pull_request:
types: [opened, synchronize, reopened, edited]branches-ignore:
- "dependabot/**"concurrency:
group: ${{ github.workflow }}-${{ github.ref }}cancel-in-progress: truepermissions: write-alljobs:
pr-lint:
uses: stella/.github/.github/workflows/pr-lint.yml@mainsecrets: inherit

Branch Protection Scripts

ScriptDescription
apply-ruleset.shIdempotent create/update of a GitHub ruleset from JSON

Audit Branch Protection

Compares live GitHub rulesets against a checked-in expected config and uploads the result as a compliance artifact (365-day retention). Detects drift and fails if the live config diverges from the expected state.

# .github/workflows/audit-branch-protection.ymlname: Audit Branch Protectionon:
schedule:
- cron: "0 8 * * 1"# Monday 08:00 UTCworkflow_dispatch:
jobs:
audit:
uses: stella/.github/.github/workflows/audit-branch-protection.yml@mainwith:
expected-config-path: .github/branch-protection/ruleset-main.jsonsecrets:
BRANCH_PROTECTION_APP_ID: ${{ secrets.BRANCH_PROTECTION_APP_ID }}BRANCH_PROTECTION_APP_KEY: ${{ secrets.BRANCH_PROTECTION_APP_KEY }}

Secrets required:

  • BRANCH_PROTECTION_APP_ID — GitHub App ID with Administration: Read and write
  • BRANCH_PROTECTION_APP_KEY — GitHub App private key (PEM)

Inputs:

  • expected-config-path — path to the expected ruleset JSON (default: .github/branch-protection/ruleset-main.json)

Provenance Update

Runs provenance generate in the calling repository and opens or updates a pull request when checked-in provenance/ artifacts drift. This workflow never pushes directly to main.

The schedule must live in the calling repository.

# .github/workflows/provenance-nightly.ymlname: Provenance Nightlyon:
schedule:
- cron: "0 2 * * *"workflow_dispatch:
jobs:
provenance-update:
permissions:
contents: writepull-requests: writeuses: stella/.github/.github/workflows/provenance-update.yml@<commit-sha>with:
install-command: bun install --frozen-lockfileprovenance-version: v0.1.2secrets: inherit

Inputs:

  • root — repository root to scan (default: .)
  • node-version — Node.js version used to install cdxgen (default: 22)
  • cdxgen-version — pinned @cyclonedx/cdxgen version (default: 12.1.5)
  • install-syft — install Syft before generation (default: false)
  • syft-version — pinned Syft release tag (default: v1.42.4)
  • provenance-version — GitHub release tag in stella/provenance to install (default: v0.1.2)
  • provenance-repository — provenance repository slug (default: stella/provenance)
  • install-command — optional dependency install command run before generation (default: bun install --frozen-lockfile)
  • branch — branch used for refresh PRs (default: chore/provenance-update)
  • commit-message — commit message for generated refreshes (default: chore: refresh provenance artifacts)
  • pr-title — pull request title for generated refreshes (default: chore: refresh provenance artifacts)
  • pr-body — pull request body for generated refreshes (default: Automated provenance refresh generated by the shared nightly updater.)

Optional secrets:

  • auth_token — token for updater PR creation when downstream CI should run; if omitted, the workflow falls back to github.token

AI shared updates

Consumer repositories keep .ai/shared pinned for reproducible CI, then call the shared updater on a schedule. The updater fetches the selected stella/ai-shared ref, rejects non-fast-forward changes, runs the fetched canonical sync script, and opens or updates one PR containing the submodule pointer and every generated file.

name: Update shared AI toolingon:
schedule:
- cron: "17 7 * * 1"workflow_dispatch:
permissions:
actions: writecontents: writepull-requests: writejobs:
update:
uses: stella/.github/.github/workflows/ai-shared-update.yml@<commit-sha>with:
runs-on: '["self-hosted","linux","x64"]'validation-workflow: ci.yml

runs-on accepts a JSON runner label array and defaults to ["ubuntu-latest"] when omitted. Only select self-hosted runners trusted with the workflow's declared permissions and secrets.

The caller must enable GitHub Actions to create pull requests when relying on the repository GITHUB_TOKEN. Alternatively, pass auth_token, or app_id plus app_private_key, from a dedicated bot. A PAT or App token triggers normal PR CI; the default-token path can explicitly dispatch a caller-selected workflow that supports workflow_dispatch.

The updater checks out the caller without persisted credentials and does not mint an optional App token until after the newly fetched sync script finishes. Consumer CI and local commands continue to execute only the committed submodule revision.

Changeset releases

Package repositories keep their source-path and version-synchronization rules local, then delegate enforcement and version-PR maintenance to these shared contracts. Changesets only prepares release metadata; the existing hardened release workflow remains the sole publisher.

jobs:
changeset:
if: github.event_name == 'pull_request'runs-on: ubuntu-latestpermissions:
contents: readsteps:
- uses: actions/checkout@<commit-sha>with:
fetch-depth: 0persist-credentials: false
- uses: stella/.github/.github/actions/changeset-policy@<commit-sha>with:
release-paths: | src/** crates/core/src/**generated-paths: | CHANGELOG.md VERSION Cargo.toml Cargo.lock package.json wasm/package.jsonpackage-files: | package.json# In a separate push-to-main workflow:jobs:
version:
uses: stella/.github/.github/workflows/changeset-release-pr.yml@<commit-sha>with:
prepare-rust-wasm: trueruns-on: '["self-hosted","linux","x64"]'sync-cargo-inherited-lock: truesecrets: inherit

runs-on accepts a JSON runner label array and defaults to ["ubuntu-latest"] when omitted. Only select self-hosted runners trusted with the workflow's declared permissions and secrets.

The caller must provide changeset, changeset:version, and a .changeset/config.json. The shared workflow serializes each target branch without interrupting an active release mutation, and skips write-capable steps when its trigger commit is no longer the branch head. A current no-op run closes any stale version PR and deletes its generated branch, so queued runs converge without a duplicate release PR. Callers should use matching workflow-level concurrency without cancellation; newer pushes replace obsolete pending runs while the active mutation finishes.

For hybrid repositories, changeset:version must synchronize the selected package version into every npm, Cargo manifest, Python, and central VERSION surface. With sync-cargo-inherited-lock enabled, the shared workflow validates the incoming lockfile and updates inherited local Cargo package entries inside the same Changesets transaction, before the generated PR is committed. The version command must preserve the committed Bun lockfile: deleting bun.lock/bun.lockb or running an unfrozen bun install is rejected by the shared policy.

When a version command regenerates browser Wasm artifacts, prepare-rust-wasm installs the wasm32-unknown-unknown target and the exact wasm-bindgen CLI version resolved from the caller's locked Cargo workspace. The option is disabled by default and expects the workspace at cargo-manifest to resolve exactly one wasm-bindgen runtime version with all features enabled.

Repositories whose Cargo packages use version.workspace = true can validate or repair the corresponding local Cargo.lock entries without maintaining a package allowlist:

- uses: stella/.github/.github/actions/sync-cargo-workspace-lock@<commit-sha>with:
mode: check # use write while generating synchronized release metadata

The action discovers root workspace members with locked Cargo metadata, changes only members that explicitly inherit [workspace.package].version, and leaves explicitly versioned and registry packages untouched.

Independent npm package releases

Independently versioned Changesets monorepos keep build and pack commands in their own workflow, with no write credential or OIDC permission in that job. The privileged job delegates the complete release transaction to the shared workflow:

jobs:
pack:
permissions:
contents: read# Build each public package, pack one .tgz, then upload one artifact per package.release:
needs: packpermissions:
actions: readcontents: writeid-token: writeuses: stella/.github/.github/workflows/npm-independent-release.yml@<commit-sha>with:
artifact-pattern: npm-tarball-*github-latest-package: "@scope/core"github-latest-policy: canonical-packagepackage-files: | packages/core/package.json packages/react/package.jsonsecrets:
RELEASE_APP_ID: ${{ secrets.RELEASE_APP_ID }}RELEASE_APP_PRIVATE_KEY: ${{ secrets.RELEASE_APP_PRIVATE_KEY }}

The shared job validates an exact one-to-one mapping between the declared public manifests and packed tarballs. It rejects unresolved workspace:, catalog:, link:, and file: dependency specifiers, orders internal dependencies before dependants, stages one draft release per <name>@<version>, publishes only versions missing from npm, verifies the release asset against npm dist.integrity, then makes the draft releases public. Existing complete versions are immutable no-ops. Safe partial runs resume; registry-only versions are repaired with the registry artifact and release notes that do not claim a local rebuild was the originally uploaded file. Package releases preserve the repository's existing GitHub Latest pointer by default. Repositories with one canonical package can set github-latest-policy to canonical-package and name it with github-latest-package; after the transaction is complete, that package's stable release becomes Latest regardless of dependency or publication order. Package-only repositories can instead use newest-published-stable to promote the last stable package release created from the release commit. Prereleases are never eligible. Manual recovery can pass both source-ref and artifact-run-id; the shared workflow accepts the earlier artifacts only when that run used the resolved source commit and the same caller workflow path. Pass environment when RELEASE_APP_PRIVATE_KEY is an environment secret; the release job then runs in that environment, so its deployment policy decides which refs can mint the token.

Each package must have an adjacent CHANGELOG.md section headed ## <version>. Uploaded artifacts may include checksum files, but each must contain exactly one .tgz; only that tarball becomes the corresponding GitHub release asset.

Trusted publishing is authorized against the calling repository workflow filename, not npm-independent-release.yml. Keep that local filename stable and configure the npm trusted publisher for it. Both the caller job and reusable workflow grant id-token: write; no npm token is accepted. Optional RELEASE_APP_ID and RELEASE_APP_PRIVATE_KEY secrets let protected tags and releases use a repository GitHub App token.

Callers that pack a verified commit other than the triggering github.sha (for example, a workflow_run gated on a promoted application release) pass that commit as source-ref. The shared workflow resolves the ref once after checkout and uses the resulting immutable SHA for package tag and release provenance.

Release privilege policy

Keep builds, tests, package installation, and artifact creation in caller jobs with read-only permissions. A separate workflow supplies one stable required check:

# .github/workflows/release-policy.ymlname: Release policyon:
pull_request:
paths: [.github/workflows/release.yml]push:
branches: [main]paths: [.github/workflows/release.yml]permissions:
contents: readjobs:
release-policy:
uses: stella/.github/.github/workflows/release-policy.yml@<commit-sha>

Require Release policy / Enforce release boundaries on the default branch. The policy rejects public-event release triggers, workflow-level execution controls, mutable action references, floating Node.js or Bun runtimes, inherited secrets, and repository-controlled code in an OIDC or write-capable job. Approved publishers must use the same immutable shared commit as the policy.

For tamper-resistant enforcement, configure this workflow as a ruleset workflow sourced from stella/.github; the local caller is fast feedback, not the trust anchor. The shared workflow supports pull_request and merge_group for that purpose and selects publish.yml for stella/tooling, otherwise release.yml.

PyPI trusted publishers remain bound to each caller's top-level release workflow; PyPI does not support reusable workflows for this OIDC exchange. Callers use the pinned pypi-publish-hardened prepare action, invoke the pinned PyPI Docker action directly, then use the pinned verification action. The shared guards validate the exact declared wheel set and verify published files byte for byte without nesting a Docker action inside a composite action.

crates.io and npm callers can delegate to crates-io-publish.yml, npm-artifact-publish.yml, or npm-version-finalize.yml. Their unprivileged jobs hand immutable artifacts to the shared privileged implementation; no caller source is executed after OIDC becomes available.

npm-version-finalize.yml does not mutate pull requests. Post-release changelog automation remains a separate workflow and permission boundary.

Apply Ruleset

Create or update a GitHub ruleset from a JSON file. Idempotent: looks up by name, creates if missing, updates if found.

# Basic usage (from repository root)
.github/branch-protection/apply-ruleset.sh stella/stella \
.github/branch-protection/ruleset-main.json
# With github-actions[bot] bypass (for SBOM workflow etc.)
.github/branch-protection/apply-ruleset.sh --github-actions-bypass \
stella/stella .github/branch-protection/ruleset-main.json

Composite Actions

typescript-checks

Setup pnpm, install dependencies with caching, and run lint + format + typecheck.

jobs:
ci:
runs-on: ubuntu-latestpermissions:
contents: readsteps:
- uses: actions/checkout@v4
- name: TypeScript Checksuses: stella/.github/actions/typescript-checks@main

Inputs:

  • run-lint - Run pnpm lint (default: true)
  • run-format - Run pnpm format (default: true)
  • run-typecheck - Run pnpm typecheck (default: true)
  • run-codespell - Run codespell spell checker (default: true)
  • working-directory - Working directory (default: .)
  • node-version-file - Node version file (default: .nvmrc)

notify-failure

Send failure notification to Google Chat webhook.

steps:
- name: Buildrun: ./build.sh
- name: Notify on failureif: failure()uses: stella/.github/actions/notify-failure@mainwith:
webhook-url: ${{ secrets.GOOGLE_CHAT_WEBHOOK }}message: 'Failed to build service-name in production.'

provenance-check

Install a pinned stella/provenance release binary and fail if committed provenance/ artifacts are stale.

steps:
- uses: actions/checkout@v6
- name: Provenanceuses: stella/.github/actions/provenance-check@mainwith:
provenance-version: v0.1.2

Inputs:

  • root - Repository root to scan (default: .)
  • node-version - Node.js version used to install cdxgen (default: 22)
  • cdxgen-version - Pinned @cyclonedx/cdxgen version (default: 12.1.5)
  • install-syft - Install Syft for container provenance checks (default: false)
  • syft-version - Pinned Syft release tag (default: v1.42.4)
  • provenance-version - GitHub release tag in stella/provenance to install (default: v0.1.2)
  • provenance-repository - Provenance repository slug (default: stella/provenance)
  • show-diff-on-failure - Print provenance diff output on failure (default: true)

About

Organization-wide GitHub configuration, reusable workflows, and profile assets for stella repositories

Topics

Resources

Code of conduct

Stars

1 star

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

Repository files navigation

stella/.github

Organization-wide GitHub configurations, reusable workflows, and templates.

Contents

Reusable Workflows

WorkflowDescription
pr-lint.ymlPR linting: conventional commits, labels, auto-assign
base-checks.ymlComposite workflow calling pr-lint
dependabot-bun-dedupe.ymlDedupe Bun lockfiles on trusted Dependabot pull requests
audit-branch-protection.ymlDrift detection for GitHub rulesets (compliance evidence)
ai-shared-update.ymlUpdate the pinned stella/ai-shared submodule, regenerate consumers, and open a PR
provenance-update.ymlReusable nightly/manual provenance refresh that opens a PR when provenance/ drifts
changeset-release-pr.ymlMaintain a version-only Changesets PR with an app-scoped token
npm-independent-release.ymlPublish independently versioned npm monorepos from caller-built tarballs
npm-artifact-publish.ymlPublish one pre-packed npm artifact without exposing OIDC to its build
pypi-publish-hardenedPrepare and verify an exact wheel matrix around top-level PyPI trusted publishing
crates-io-publish.ymlPackage without OIDC, then attest and publish exact crate bytes
release-policy.ymlEnforce immutable, artifact-only release privilege boundaries

Composite Actions

ActionDescription
typescript-checksSetup pnpm, install deps, run lint + format + typecheck
notify-failureSend failure notification to Google Chat webhook
provenance-checkInstall stella/provenance and verify committed provenance artifacts
changeset-policyRequire valid release intent for caller-declared package paths
npm-publish-hardenedPublish pre-packed npm tarballs through trusted publishing
sync-cargo-workspace-lockSynchronize inherited Cargo workspace versions in Cargo.lock

Templates

  • PULL_REQUEST_TEMPLATE.md - Standard PR template
  • ISSUE_TEMPLATE/ - Bug report, epic, feature request, other

Label Definitions

  • labels.yml - Standardized labels (reference for manual setup)

Usage

Dependabot Bun Dedupe

Keep the pull request trigger and the required autofix.ci workflow name in the calling repository. Install the autofix.ci GitHub App for the caller, then pin the shared workflow to a reviewed commit:

# .github/workflows/autofix.ymlname: autofix.cion:
pull_request:
types: [opened, synchronize, reopened]paths:
- bun.lockconcurrency:
group: ${{ github.workflow }}-${{ github.event.pull_request.number }}cancel-in-progress: truepermissions:
contents: readjobs:
dependabot-bun-dedupe:
uses: stella/.github/.github/workflows/dependabot-bun-dedupe.yml@<commit-sha>

The shared workflow accepts only same-repository Dependabot branches under dependabot/bun/. It runs Bun's lockfile-only dedupe and rejects changes outside bun.lock before passing the patch to autofix.ci. Callers may pass runs-on as a JSON runner-label array; it defaults to ["ubuntu-24.04"].

Base Checks (Recommended)

Use this composite workflow to run all standard checks:

# .github/workflows/ci.ymlname: CIon:
pull_request:
types: [opened, synchronize, reopened, edited]permissions: write-alljobs:
checks:
uses: stella/.github/.github/workflows/base-checks.yml@mainsecrets: inherit

PR Lint

# .github/workflows/pr-lint.ymlname: PR Linton:
pull_request:
types: [opened, synchronize, reopened, edited]branches-ignore:
- "dependabot/**"concurrency:
group: ${{ github.workflow }}-${{ github.ref }}cancel-in-progress: truepermissions: write-alljobs:
pr-lint:
uses: stella/.github/.github/workflows/pr-lint.yml@mainsecrets: inherit

Branch Protection Scripts

ScriptDescription
apply-ruleset.shIdempotent create/update of a GitHub ruleset from JSON

Audit Branch Protection

Compares live GitHub rulesets against a checked-in expected config and uploads the result as a compliance artifact (365-day retention). Detects drift and fails if the live config diverges from the expected state.

# .github/workflows/audit-branch-protection.ymlname: Audit Branch Protectionon:
schedule:
- cron: "0 8 * * 1"# Monday 08:00 UTCworkflow_dispatch:
jobs:
audit:
uses: stella/.github/.github/workflows/audit-branch-protection.yml@mainwith:
expected-config-path: .github/branch-protection/ruleset-main.jsonsecrets:
BRANCH_PROTECTION_APP_ID: ${{ secrets.BRANCH_PROTECTION_APP_ID }}BRANCH_PROTECTION_APP_KEY: ${{ secrets.BRANCH_PROTECTION_APP_KEY }}

Secrets required:

  • BRANCH_PROTECTION_APP_ID — GitHub App ID with Administration: Read and write
  • BRANCH_PROTECTION_APP_KEY — GitHub App private key (PEM)

Inputs:

  • expected-config-path — path to the expected ruleset JSON (default: .github/branch-protection/ruleset-main.json)

Provenance Update

Runs provenance generate in the calling repository and opens or updates a pull request when checked-in provenance/ artifacts drift. This workflow never pushes directly to main.

The schedule must live in the calling repository.

# .github/workflows/provenance-nightly.ymlname: Provenance Nightlyon:
schedule:
- cron: "0 2 * * *"workflow_dispatch:
jobs:
provenance-update:
permissions:
contents: writepull-requests: writeuses: stella/.github/.github/workflows/provenance-update.yml@<commit-sha>with:
install-command: bun install --frozen-lockfileprovenance-version: v0.1.2secrets: inherit

Inputs:

  • root — repository root to scan (default: .)
  • node-version — Node.js version used to install cdxgen (default: 22)
  • cdxgen-version — pinned @cyclonedx/cdxgen version (default: 12.1.5)
  • install-syft — install Syft before generation (default: false)
  • syft-version — pinned Syft release tag (default: v1.42.4)
  • provenance-version — GitHub release tag in stella/provenance to install (default: v0.1.2)
  • provenance-repository — provenance repository slug (default: stella/provenance)
  • install-command — optional dependency install command run before generation (default: bun install --frozen-lockfile)
  • branch — branch used for refresh PRs (default: chore/provenance-update)
  • commit-message — commit message for generated refreshes (default: chore: refresh provenance artifacts)
  • pr-title — pull request title for generated refreshes (default: chore: refresh provenance artifacts)
  • pr-body — pull request body for generated refreshes (default: Automated provenance refresh generated by the shared nightly updater.)

Optional secrets:

  • auth_token — token for updater PR creation when downstream CI should run; if omitted, the workflow falls back to github.token

AI shared updates

Consumer repositories keep .ai/shared pinned for reproducible CI, then call the shared updater on a schedule. The updater fetches the selected stella/ai-shared ref, rejects non-fast-forward changes, runs the fetched canonical sync script, and opens or updates one PR containing the submodule pointer and every generated file.

name: Update shared AI toolingon:
schedule:
- cron: "17 7 * * 1"workflow_dispatch:
permissions:
actions: writecontents: writepull-requests: writejobs:
update:
uses: stella/.github/.github/workflows/ai-shared-update.yml@<commit-sha>with:
runs-on: '["self-hosted","linux","x64"]'validation-workflow: ci.yml

runs-on accepts a JSON runner label array and defaults to ["ubuntu-latest"] when omitted. Only select self-hosted runners trusted with the workflow's declared permissions and secrets.

The caller must enable GitHub Actions to create pull requests when relying on the repository GITHUB_TOKEN. Alternatively, pass auth_token, or app_id plus app_private_key, from a dedicated bot. A PAT or App token triggers normal PR CI; the default-token path can explicitly dispatch a caller-selected workflow that supports workflow_dispatch.

The updater checks out the caller without persisted credentials and does not mint an optional App token until after the newly fetched sync script finishes. Consumer CI and local commands continue to execute only the committed submodule revision.

Changeset releases

Package repositories keep their source-path and version-synchronization rules local, then delegate enforcement and version-PR maintenance to these shared contracts. Changesets only prepares release metadata; the existing hardened release workflow remains the sole publisher.

jobs:
changeset:
if: github.event_name == 'pull_request'runs-on: ubuntu-latestpermissions:
contents: readsteps:
- uses: actions/checkout@<commit-sha>with:
fetch-depth: 0persist-credentials: false
- uses: stella/.github/.github/actions/changeset-policy@<commit-sha>with:
release-paths: | src/** crates/core/src/**generated-paths: | CHANGELOG.md VERSION Cargo.toml Cargo.lock package.json wasm/package.jsonpackage-files: | package.json# In a separate push-to-main workflow:jobs:
version:
uses: stella/.github/.github/workflows/changeset-release-pr.yml@<commit-sha>with:
prepare-rust-wasm: trueruns-on: '["self-hosted","linux","x64"]'sync-cargo-inherited-lock: truesecrets: inherit

runs-on accepts a JSON runner label array and defaults to ["ubuntu-latest"] when omitted. Only select self-hosted runners trusted with the workflow's declared permissions and secrets.

The caller must provide changeset, changeset:version, and a .changeset/config.json. The shared workflow serializes each target branch without interrupting an active release mutation, and skips write-capable steps when its trigger commit is no longer the branch head. A current no-op run closes any stale version PR and deletes its generated branch, so queued runs converge without a duplicate release PR. Callers should use matching workflow-level concurrency without cancellation; newer pushes replace obsolete pending runs while the active mutation finishes.

For hybrid repositories, changeset:version must synchronize the selected package version into every npm, Cargo manifest, Python, and central VERSION surface. With sync-cargo-inherited-lock enabled, the shared workflow validates the incoming lockfile and updates inherited local Cargo package entries inside the same Changesets transaction, before the generated PR is committed. The version command must preserve the committed Bun lockfile: deleting bun.lock/bun.lockb or running an unfrozen bun install is rejected by the shared policy.

When a version command regenerates browser Wasm artifacts, prepare-rust-wasm installs the wasm32-unknown-unknown target and the exact wasm-bindgen CLI version resolved from the caller's locked Cargo workspace. The option is disabled by default and expects the workspace at cargo-manifest to resolve exactly one wasm-bindgen runtime version with all features enabled.

Repositories whose Cargo packages use version.workspace = true can validate or repair the corresponding local Cargo.lock entries without maintaining a package allowlist:

- uses: stella/.github/.github/actions/sync-cargo-workspace-lock@<commit-sha>with:
mode: check # use write while generating synchronized release metadata

The action discovers root workspace members with locked Cargo metadata, changes only members that explicitly inherit [workspace.package].version, and leaves explicitly versioned and registry packages untouched.

Independent npm package releases

Independently versioned Changesets monorepos keep build and pack commands in their own workflow, with no write credential or OIDC permission in that job. The privileged job delegates the complete release transaction to the shared workflow:

jobs:
pack:
permissions:
contents: read# Build each public package, pack one .tgz, then upload one artifact per package.release:
needs: packpermissions:
actions: readcontents: writeid-token: writeuses: stella/.github/.github/workflows/npm-independent-release.yml@<commit-sha>with:
artifact-pattern: npm-tarball-*github-latest-package: "@scope/core"github-latest-policy: canonical-packagepackage-files: | packages/core/package.json packages/react/package.jsonsecrets:
RELEASE_APP_ID: ${{ secrets.RELEASE_APP_ID }}RELEASE_APP_PRIVATE_KEY: ${{ secrets.RELEASE_APP_PRIVATE_KEY }}

The shared job validates an exact one-to-one mapping between the declared public manifests and packed tarballs. It rejects unresolved workspace:, catalog:, link:, and file: dependency specifiers, orders internal dependencies before dependants, stages one draft release per <name>@<version>, publishes only versions missing from npm, verifies the release asset against npm dist.integrity, then makes the draft releases public. Existing complete versions are immutable no-ops. Safe partial runs resume; registry-only versions are repaired with the registry artifact and release notes that do not claim a local rebuild was the originally uploaded file. Package releases preserve the repository's existing GitHub Latest pointer by default. Repositories with one canonical package can set github-latest-policy to canonical-package and name it with github-latest-package; after the transaction is complete, that package's stable release becomes Latest regardless of dependency or publication order. Package-only repositories can instead use newest-published-stable to promote the last stable package release created from the release commit. Prereleases are never eligible. Manual recovery can pass both source-ref and artifact-run-id; the shared workflow accepts the earlier artifacts only when that run used the resolved source commit and the same caller workflow path. Pass environment when RELEASE_APP_PRIVATE_KEY is an environment secret; the release job then runs in that environment, so its deployment policy decides which refs can mint the token.

Each package must have an adjacent CHANGELOG.md section headed ## <version>. Uploaded artifacts may include checksum files, but each must contain exactly one .tgz; only that tarball becomes the corresponding GitHub release asset.

Trusted publishing is authorized against the calling repository workflow filename, not npm-independent-release.yml. Keep that local filename stable and configure the npm trusted publisher for it. Both the caller job and reusable workflow grant id-token: write; no npm token is accepted. Optional RELEASE_APP_ID and RELEASE_APP_PRIVATE_KEY secrets let protected tags and releases use a repository GitHub App token.

Callers that pack a verified commit other than the triggering github.sha (for example, a workflow_run gated on a promoted application release) pass that commit as source-ref. The shared workflow resolves the ref once after checkout and uses the resulting immutable SHA for package tag and release provenance.

Release privilege policy

Keep builds, tests, package installation, and artifact creation in caller jobs with read-only permissions. A separate workflow supplies one stable required check:

# .github/workflows/release-policy.ymlname: Release policyon:
pull_request:
paths: [.github/workflows/release.yml]push:
branches: [main]paths: [.github/workflows/release.yml]permissions:
contents: readjobs:
release-policy:
uses: stella/.github/.github/workflows/release-policy.yml@<commit-sha>

Require Release policy / Enforce release boundaries on the default branch. The policy rejects public-event release triggers, workflow-level execution controls, mutable action references, floating Node.js or Bun runtimes, inherited secrets, and repository-controlled code in an OIDC or write-capable job. Approved publishers must use the same immutable shared commit as the policy.

For tamper-resistant enforcement, configure this workflow as a ruleset workflow sourced from stella/.github; the local caller is fast feedback, not the trust anchor. The shared workflow supports pull_request and merge_group for that purpose and selects publish.yml for stella/tooling, otherwise release.yml.

PyPI trusted publishers remain bound to each caller's top-level release workflow; PyPI does not support reusable workflows for this OIDC exchange. Callers use the pinned pypi-publish-hardened prepare action, invoke the pinned PyPI Docker action directly, then use the pinned verification action. The shared guards validate the exact declared wheel set and verify published files byte for byte without nesting a Docker action inside a composite action.

crates.io and npm callers can delegate to crates-io-publish.yml, npm-artifact-publish.yml, or npm-version-finalize.yml. Their unprivileged jobs hand immutable artifacts to the shared privileged implementation; no caller source is executed after OIDC becomes available.

npm-version-finalize.yml does not mutate pull requests. Post-release changelog automation remains a separate workflow and permission boundary.

Apply Ruleset

Create or update a GitHub ruleset from a JSON file. Idempotent: looks up by name, creates if missing, updates if found.

# Basic usage (from repository root)
.github/branch-protection/apply-ruleset.sh stella/stella \
.github/branch-protection/ruleset-main.json
# With github-actions[bot] bypass (for SBOM workflow etc.)
.github/branch-protection/apply-ruleset.sh --github-actions-bypass \
stella/stella .github/branch-protection/ruleset-main.json

Composite Actions

typescript-checks

Setup pnpm, install dependencies with caching, and run lint + format + typecheck.

jobs:
ci:
runs-on: ubuntu-latestpermissions:
contents: readsteps:
- uses: actions/checkout@v4
- name: TypeScript Checksuses: stella/.github/actions/typescript-checks@main

Inputs:

  • run-lint - Run pnpm lint (default: true)
  • run-format - Run pnpm format (default: true)
  • run-typecheck - Run pnpm typecheck (default: true)
  • run-codespell - Run codespell spell checker (default: true)
  • working-directory - Working directory (default: .)
  • node-version-file - Node version file (default: .nvmrc)

notify-failure

Send failure notification to Google Chat webhook.

steps:
- name: Buildrun: ./build.sh
- name: Notify on failureif: failure()uses: stella/.github/actions/notify-failure@mainwith:
webhook-url: ${{ secrets.GOOGLE_CHAT_WEBHOOK }}message: 'Failed to build service-name in production.'

provenance-check

Install a pinned stella/provenance release binary and fail if committed provenance/ artifacts are stale.

steps:
- uses: actions/checkout@v6
- name: Provenanceuses: stella/.github/actions/provenance-check@mainwith:
provenance-version: v0.1.2

Inputs:

  • root - Repository root to scan (default: .)
  • node-version - Node.js version used to install cdxgen (default: 22)
  • cdxgen-version - Pinned @cyclonedx/cdxgen version (default: 12.1.5)
  • install-syft - Install Syft for container provenance checks (default: false)
  • syft-version - Pinned Syft release tag (default: v1.42.4)
  • provenance-version - GitHub release tag in stella/provenance to install (default: v0.1.2)
  • provenance-repository - Provenance repository slug (default: stella/provenance)
  • show-diff-on-failure - Print provenance diff output on failure (default: true)

About

Organization-wide GitHub configuration, reusable workflows, and profile assets for stella repositories

Topics

Resources

Code of conduct

Stars

1 star

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

stella/.github

Organization-wide GitHub configurations, reusable workflows, and templates.

Contents

Reusable Workflows

WorkflowDescription
pr-lint.ymlPR linting: conventional commits, labels, auto-assign
base-checks.ymlComposite workflow calling pr-lint
dependabot-bun-dedupe.ymlDedupe Bun lockfiles on trusted Dependabot pull requests
audit-branch-protection.ymlDrift detection for GitHub rulesets (compliance evidence)
ai-shared-update.ymlUpdate the pinned stella/ai-shared submodule, regenerate consumers, and open a PR
provenance-update.ymlReusable nightly/manual provenance refresh that opens a PR when provenance/ drifts
changeset-release-pr.ymlMaintain a version-only Changesets PR with an app-scoped token
npm-independent-release.ymlPublish independently versioned npm monorepos from caller-built tarballs
npm-artifact-publish.ymlPublish one pre-packed npm artifact without exposing OIDC to its build
pypi-publish-hardenedPrepare and verify an exact wheel matrix around top-level PyPI trusted publishing
crates-io-publish.ymlPackage without OIDC, then attest and publish exact crate bytes
release-policy.ymlEnforce immutable, artifact-only release privilege boundaries

Composite Actions

ActionDescription
typescript-checksSetup pnpm, install deps, run lint + format + typecheck
notify-failureSend failure notification to Google Chat webhook
provenance-checkInstall stella/provenance and verify committed provenance artifacts
changeset-policyRequire valid release intent for caller-declared package paths
npm-publish-hardenedPublish pre-packed npm tarballs through trusted publishing
sync-cargo-workspace-lockSynchronize inherited Cargo workspace versions in Cargo.lock

Templates

  • PULL_REQUEST_TEMPLATE.md - Standard PR template
  • ISSUE_TEMPLATE/ - Bug report, epic, feature request, other

Label Definitions

  • labels.yml - Standardized labels (reference for manual setup)

Usage

Dependabot Bun Dedupe

Keep the pull request trigger and the required autofix.ci workflow name in the calling repository. Install the autofix.ci GitHub App for the caller, then pin the shared workflow to a reviewed commit:

# .github/workflows/autofix.ymlname: autofix.cion:
pull_request:
types: [opened, synchronize, reopened]paths:
- bun.lockconcurrency:
group: ${{ github.workflow }}-${{ github.event.pull_request.number }}cancel-in-progress: truepermissions:
contents: readjobs:
dependabot-bun-dedupe:
uses: stella/.github/.github/workflows/dependabot-bun-dedupe.yml@<commit-sha>

The shared workflow accepts only same-repository Dependabot branches under dependabot/bun/. It runs Bun's lockfile-only dedupe and rejects changes outside bun.lock before passing the patch to autofix.ci. Callers may pass runs-on as a JSON runner-label array; it defaults to ["ubuntu-24.04"].

Base Checks (Recommended)

Use this composite workflow to run all standard checks:

# .github/workflows/ci.ymlname: CIon:
pull_request:
types: [opened, synchronize, reopened, edited]permissions: write-alljobs:
checks:
uses: stella/.github/.github/workflows/base-checks.yml@mainsecrets: inherit

PR Lint

# .github/workflows/pr-lint.ymlname: PR Linton:
pull_request:
types: [opened, synchronize, reopened, edited]branches-ignore:
- "dependabot/**"concurrency:
group: ${{ github.workflow }}-${{ github.ref }}cancel-in-progress: truepermissions: write-alljobs:
pr-lint:
uses: stella/.github/.github/workflows/pr-lint.yml@mainsecrets: inherit

Branch Protection Scripts

ScriptDescription
apply-ruleset.shIdempotent create/update of a GitHub ruleset from JSON

Audit Branch Protection

Compares live GitHub rulesets against a checked-in expected config and uploads the result as a compliance artifact (365-day retention). Detects drift and fails if the live config diverges from the expected state.

# .github/workflows/audit-branch-protection.ymlname: Audit Branch Protectionon:
schedule:
- cron: "0 8 * * 1"# Monday 08:00 UTCworkflow_dispatch:
jobs:
audit:
uses: stella/.github/.github/workflows/audit-branch-protection.yml@mainwith:
expected-config-path: .github/branch-protection/ruleset-main.jsonsecrets:
BRANCH_PROTECTION_APP_ID: ${{ secrets.BRANCH_PROTECTION_APP_ID }}BRANCH_PROTECTION_APP_KEY: ${{ secrets.BRANCH_PROTECTION_APP_KEY }}

Secrets required:

  • BRANCH_PROTECTION_APP_ID — GitHub App ID with Administration: Read and write
  • BRANCH_PROTECTION_APP_KEY — GitHub App private key (PEM)

Inputs:

  • expected-config-path — path to the expected ruleset JSON (default: .github/branch-protection/ruleset-main.json)

Provenance Update

Runs provenance generate in the calling repository and opens or updates a pull request when checked-in provenance/ artifacts drift. This workflow never pushes directly to main.

The schedule must live in the calling repository.

# .github/workflows/provenance-nightly.ymlname: Provenance Nightlyon:
schedule:
- cron: "0 2 * * *"workflow_dispatch:
jobs:
provenance-update:
permissions:
contents: writepull-requests: writeuses: stella/.github/.github/workflows/provenance-update.yml@<commit-sha>with:
install-command: bun install --frozen-lockfileprovenance-version: v0.1.2secrets: inherit

Inputs:

  • root — repository root to scan (default: .)
  • node-version — Node.js version used to install cdxgen (default: 22)
  • cdxgen-version — pinned @cyclonedx/cdxgen version (default: 12.1.5)
  • install-syft — install Syft before generation (default: false)
  • syft-version — pinned Syft release tag (default: v1.42.4)
  • provenance-version — GitHub release tag in stella/provenance to install (default: v0.1.2)
  • provenance-repository — provenance repository slug (default: stella/provenance)
  • install-command — optional dependency install command run before generation (default: bun install --frozen-lockfile)
  • branch — branch used for refresh PRs (default: chore/provenance-update)
  • commit-message — commit message for generated refreshes (default: chore: refresh provenance artifacts)
  • pr-title — pull request title for generated refreshes (default: chore: refresh provenance artifacts)
  • pr-body — pull request body for generated refreshes (default: Automated provenance refresh generated by the shared nightly updater.)

Optional secrets:

  • auth_token — token for updater PR creation when downstream CI should run; if omitted, the workflow falls back to github.token

AI shared updates

Consumer repositories keep .ai/shared pinned for reproducible CI, then call the shared updater on a schedule. The updater fetches the selected stella/ai-shared ref, rejects non-fast-forward changes, runs the fetched canonical sync script, and opens or updates one PR containing the submodule pointer and every generated file.

name: Update shared AI toolingon:
schedule:
- cron: "17 7 * * 1"workflow_dispatch:
permissions:
actions: writecontents: writepull-requests: writejobs:
update:
uses: stella/.github/.github/workflows/ai-shared-update.yml@<commit-sha>with:
runs-on: '["self-hosted","linux","x64"]'validation-workflow: ci.yml

runs-on accepts a JSON runner label array and defaults to ["ubuntu-latest"] when omitted. Only select self-hosted runners trusted with the workflow's declared permissions and secrets.

The caller must enable GitHub Actions to create pull requests when relying on the repository GITHUB_TOKEN. Alternatively, pass auth_token, or app_id plus app_private_key, from a dedicated bot. A PAT or App token triggers normal PR CI; the default-token path can explicitly dispatch a caller-selected workflow that supports workflow_dispatch.

The updater checks out the caller without persisted credentials and does not mint an optional App token until after the newly fetched sync script finishes. Consumer CI and local commands continue to execute only the committed submodule revision.

Changeset releases

Package repositories keep their source-path and version-synchronization rules local, then delegate enforcement and version-PR maintenance to these shared contracts. Changesets only prepares release metadata; the existing hardened release workflow remains the sole publisher.

jobs:
changeset:
if: github.event_name == 'pull_request'runs-on: ubuntu-latestpermissions:
contents: readsteps:
- uses: actions/checkout@<commit-sha>with:
fetch-depth: 0persist-credentials: false
- uses: stella/.github/.github/actions/changeset-policy@<commit-sha>with:
release-paths: | src/** crates/core/src/**generated-paths: | CHANGELOG.md VERSION Cargo.toml Cargo.lock package.json wasm/package.jsonpackage-files: | package.json# In a separate push-to-main workflow:jobs:
version:
uses: stella/.github/.github/workflows/changeset-release-pr.yml@<commit-sha>with:
prepare-rust-wasm: trueruns-on: '["self-hosted","linux","x64"]'sync-cargo-inherited-lock: truesecrets: inherit

runs-on accepts a JSON runner label array and defaults to ["ubuntu-latest"] when omitted. Only select self-hosted runners trusted with the workflow's declared permissions and secrets.

The caller must provide changeset, changeset:version, and a .changeset/config.json. The shared workflow serializes each target branch without interrupting an active release mutation, and skips write-capable steps when its trigger commit is no longer the branch head. A current no-op run closes any stale version PR and deletes its generated branch, so queued runs converge without a duplicate release PR. Callers should use matching workflow-level concurrency without cancellation; newer pushes replace obsolete pending runs while the active mutation finishes.

For hybrid repositories, changeset:version must synchronize the selected package version into every npm, Cargo manifest, Python, and central VERSION surface. With sync-cargo-inherited-lock enabled, the shared workflow validates the incoming lockfile and updates inherited local Cargo package entries inside the same Changesets transaction, before the generated PR is committed. The version command must preserve the committed Bun lockfile: deleting bun.lock/bun.lockb or running an unfrozen bun install is rejected by the shared policy.

When a version command regenerates browser Wasm artifacts, prepare-rust-wasm installs the wasm32-unknown-unknown target and the exact wasm-bindgen CLI version resolved from the caller's locked Cargo workspace. The option is disabled by default and expects the workspace at cargo-manifest to resolve exactly one wasm-bindgen runtime version with all features enabled.

Repositories whose Cargo packages use version.workspace = true can validate or repair the corresponding local Cargo.lock entries without maintaining a package allowlist:

- uses: stella/.github/.github/actions/sync-cargo-workspace-lock@<commit-sha>with:
mode: check # use write while generating synchronized release metadata

The action discovers root workspace members with locked Cargo metadata, changes only members that explicitly inherit [workspace.package].version, and leaves explicitly versioned and registry packages untouched.

Independent npm package releases

Independently versioned Changesets monorepos keep build and pack commands in their own workflow, with no write credential or OIDC permission in that job. The privileged job delegates the complete release transaction to the shared workflow:

jobs:
pack:
permissions:
contents: read# Build each public package, pack one .tgz, then upload one artifact per package.release:
needs: packpermissions:
actions: readcontents: writeid-token: writeuses: stella/.github/.github/workflows/npm-independent-release.yml@<commit-sha>with:
artifact-pattern: npm-tarball-*github-latest-package: "@scope/core"github-latest-policy: canonical-packagepackage-files: | packages/core/package.json packages/react/package.jsonsecrets:
RELEASE_APP_ID: ${{ secrets.RELEASE_APP_ID }}RELEASE_APP_PRIVATE_KEY: ${{ secrets.RELEASE_APP_PRIVATE_KEY }}

The shared job validates an exact one-to-one mapping between the declared public manifests and packed tarballs. It rejects unresolved workspace:, catalog:, link:, and file: dependency specifiers, orders internal dependencies before dependants, stages one draft release per <name>@<version>, publishes only versions missing from npm, verifies the release asset against npm dist.integrity, then makes the draft releases public. Existing complete versions are immutable no-ops. Safe partial runs resume; registry-only versions are repaired with the registry artifact and release notes that do not claim a local rebuild was the originally uploaded file. Package releases preserve the repository's existing GitHub Latest pointer by default. Repositories with one canonical package can set github-latest-policy to canonical-package and name it with github-latest-package; after the transaction is complete, that package's stable release becomes Latest regardless of dependency or publication order. Package-only repositories can instead use newest-published-stable to promote the last stable package release created from the release commit. Prereleases are never eligible. Manual recovery can pass both source-ref and artifact-run-id; the shared workflow accepts the earlier artifacts only when that run used the resolved source commit and the same caller workflow path. Pass environment when RELEASE_APP_PRIVATE_KEY is an environment secret; the release job then runs in that environment, so its deployment policy decides which refs can mint the token.

Each package must have an adjacent CHANGELOG.md section headed ## <version>. Uploaded artifacts may include checksum files, but each must contain exactly one .tgz; only that tarball becomes the corresponding GitHub release asset.

Trusted publishing is authorized against the calling repository workflow filename, not npm-independent-release.yml. Keep that local filename stable and configure the npm trusted publisher for it. Both the caller job and reusable workflow grant id-token: write; no npm token is accepted. Optional RELEASE_APP_ID and RELEASE_APP_PRIVATE_KEY secrets let protected tags and releases use a repository GitHub App token.

Callers that pack a verified commit other than the triggering github.sha (for example, a workflow_run gated on a promoted application release) pass that commit as source-ref. The shared workflow resolves the ref once after checkout and uses the resulting immutable SHA for package tag and release provenance.

Release privilege policy

Keep builds, tests, package installation, and artifact creation in caller jobs with read-only permissions. A separate workflow supplies one stable required check:

# .github/workflows/release-policy.ymlname: Release policyon:
pull_request:
paths: [.github/workflows/release.yml]push:
branches: [main]paths: [.github/workflows/release.yml]permissions:
contents: readjobs:
release-policy:
uses: stella/.github/.github/workflows/release-policy.yml@<commit-sha>

Require Release policy / Enforce release boundaries on the default branch. The policy rejects public-event release triggers, workflow-level execution controls, mutable action references, floating Node.js or Bun runtimes, inherited secrets, and repository-controlled code in an OIDC or write-capable job. Approved publishers must use the same immutable shared commit as the policy.

For tamper-resistant enforcement, configure this workflow as a ruleset workflow sourced from stella/.github; the local caller is fast feedback, not the trust anchor. The shared workflow supports pull_request and merge_group for that purpose and selects publish.yml for stella/tooling, otherwise release.yml.

PyPI trusted publishers remain bound to each caller's top-level release workflow; PyPI does not support reusable workflows for this OIDC exchange. Callers use the pinned pypi-publish-hardened prepare action, invoke the pinned PyPI Docker action directly, then use the pinned verification action. The shared guards validate the exact declared wheel set and verify published files byte for byte without nesting a Docker action inside a composite action.

crates.io and npm callers can delegate to crates-io-publish.yml, npm-artifact-publish.yml, or npm-version-finalize.yml. Their unprivileged jobs hand immutable artifacts to the shared privileged implementation; no caller source is executed after OIDC becomes available.

npm-version-finalize.yml does not mutate pull requests. Post-release changelog automation remains a separate workflow and permission boundary.

Apply Ruleset

Create or update a GitHub ruleset from a JSON file. Idempotent: looks up by name, creates if missing, updates if found.

# Basic usage (from repository root)
.github/branch-protection/apply-ruleset.sh stella/stella \
.github/branch-protection/ruleset-main.json
# With github-actions[bot] bypass (for SBOM workflow etc.)
.github/branch-protection/apply-ruleset.sh --github-actions-bypass \
stella/stella .github/branch-protection/ruleset-main.json

Composite Actions

typescript-checks

Setup pnpm, install dependencies with caching, and run lint + format + typecheck.

jobs:
ci:
runs-on: ubuntu-latestpermissions:
contents: readsteps:
- uses: actions/checkout@v4
- name: TypeScript Checksuses: stella/.github/actions/typescript-checks@main

Inputs:

  • run-lint - Run pnpm lint (default: true)
  • run-format - Run pnpm format (default: true)
  • run-typecheck - Run pnpm typecheck (default: true)
  • run-codespell - Run codespell spell checker (default: true)
  • working-directory - Working directory (default: .)
  • node-version-file - Node version file (default: .nvmrc)

notify-failure

Send failure notification to Google Chat webhook.

steps:
- name: Buildrun: ./build.sh
- name: Notify on failureif: failure()uses: stella/.github/actions/notify-failure@mainwith:
webhook-url: ${{ secrets.GOOGLE_CHAT_WEBHOOK }}message: 'Failed to build service-name in production.'

provenance-check

Install a pinned stella/provenance release binary and fail if committed provenance/ artifacts are stale.

steps:
- uses: actions/checkout@v6
- name: Provenanceuses: stella/.github/actions/provenance-check@mainwith:
provenance-version: v0.1.2

Inputs:

  • root - Repository root to scan (default: .)
  • node-version - Node.js version used to install cdxgen (default: 22)
  • cdxgen-version - Pinned @cyclonedx/cdxgen version (default: 12.1.5)
  • install-syft - Install Syft for container provenance checks (default: false)
  • syft-version - Pinned Syft release tag (default: v1.42.4)
  • provenance-version - GitHub release tag in stella/provenance to install (default: v0.1.2)
  • provenance-repository - Provenance repository slug (default: stella/provenance)
  • show-diff-on-failure - Print provenance diff output on failure (default: true)

About

Organization-wide GitHub configuration, reusable workflows, and profile assets for stella repositories

Topics

Resources

Code of conduct

Stars

1 star

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

stella/.github

Organization-wide GitHub configurations, reusable workflows, and templates.

Contents

Reusable Workflows

WorkflowDescription
pr-lint.ymlPR linting: conventional commits, labels, auto-assign
base-checks.ymlComposite workflow calling pr-lint
dependabot-bun-dedupe.ymlDedupe Bun lockfiles on trusted Dependabot pull requests
audit-branch-protection.ymlDrift detection for GitHub rulesets (compliance evidence)
ai-shared-update.ymlUpdate the pinned stella/ai-shared submodule, regenerate consumers, and open a PR
provenance-update.ymlReusable nightly/manual provenance refresh that opens a PR when provenance/ drifts
changeset-release-pr.ymlMaintain a version-only Changesets PR with an app-scoped token
npm-independent-release.ymlPublish independently versioned npm monorepos from caller-built tarballs
npm-artifact-publish.ymlPublish one pre-packed npm artifact without exposing OIDC to its build
pypi-publish-hardenedPrepare and verify an exact wheel matrix around top-level PyPI trusted publishing
crates-io-publish.ymlPackage without OIDC, then attest and publish exact crate bytes
release-policy.ymlEnforce immutable, artifact-only release privilege boundaries

Composite Actions

ActionDescription
typescript-checksSetup pnpm, install deps, run lint + format + typecheck
notify-failureSend failure notification to Google Chat webhook
provenance-checkInstall stella/provenance and verify committed provenance artifacts
changeset-policyRequire valid release intent for caller-declared package paths
npm-publish-hardenedPublish pre-packed npm tarballs through trusted publishing
sync-cargo-workspace-lockSynchronize inherited Cargo workspace versions in Cargo.lock

Templates

  • PULL_REQUEST_TEMPLATE.md - Standard PR template
  • ISSUE_TEMPLATE/ - Bug report, epic, feature request, other

Label Definitions

  • labels.yml - Standardized labels (reference for manual setup)

Usage

Dependabot Bun Dedupe

Keep the pull request trigger and the required autofix.ci workflow name in the calling repository. Install the autofix.ci GitHub App for the caller, then pin the shared workflow to a reviewed commit:

# .github/workflows/autofix.ymlname: autofix.cion:
pull_request:
types: [opened, synchronize, reopened]paths:
- bun.lockconcurrency:
group: ${{ github.workflow }}-${{ github.event.pull_request.number }}cancel-in-progress: truepermissions:
contents: readjobs:
dependabot-bun-dedupe:
uses: stella/.github/.github/workflows/dependabot-bun-dedupe.yml@<commit-sha>

The shared workflow accepts only same-repository Dependabot branches under dependabot/bun/. It runs Bun's lockfile-only dedupe and rejects changes outside bun.lock before passing the patch to autofix.ci. Callers may pass runs-on as a JSON runner-label array; it defaults to ["ubuntu-24.04"].

Base Checks (Recommended)

Use this composite workflow to run all standard checks:

# .github/workflows/ci.ymlname: CIon:
pull_request:
types: [opened, synchronize, reopened, edited]permissions: write-alljobs:
checks:
uses: stella/.github/.github/workflows/base-checks.yml@mainsecrets: inherit

PR Lint

# .github/workflows/pr-lint.ymlname: PR Linton:
pull_request:
types: [opened, synchronize, reopened, edited]branches-ignore:
- "dependabot/**"concurrency:
group: ${{ github.workflow }}-${{ github.ref }}cancel-in-progress: truepermissions: write-alljobs:
pr-lint:
uses: stella/.github/.github/workflows/pr-lint.yml@mainsecrets: inherit

Branch Protection Scripts

ScriptDescription
apply-ruleset.shIdempotent create/update of a GitHub ruleset from JSON

Audit Branch Protection

Compares live GitHub rulesets against a checked-in expected config and uploads the result as a compliance artifact (365-day retention). Detects drift and fails if the live config diverges from the expected state.

# .github/workflows/audit-branch-protection.ymlname: Audit Branch Protectionon:
schedule:
- cron: "0 8 * * 1"# Monday 08:00 UTCworkflow_dispatch:
jobs:
audit:
uses: stella/.github/.github/workflows/audit-branch-protection.yml@mainwith:
expected-config-path: .github/branch-protection/ruleset-main.jsonsecrets:
BRANCH_PROTECTION_APP_ID: ${{ secrets.BRANCH_PROTECTION_APP_ID }}BRANCH_PROTECTION_APP_KEY: ${{ secrets.BRANCH_PROTECTION_APP_KEY }}

Secrets required:

  • BRANCH_PROTECTION_APP_ID — GitHub App ID with Administration: Read and write
  • BRANCH_PROTECTION_APP_KEY — GitHub App private key (PEM)

Inputs:

  • expected-config-path — path to the expected ruleset JSON (default: .github/branch-protection/ruleset-main.json)

Provenance Update

Runs provenance generate in the calling repository and opens or updates a pull request when checked-in provenance/ artifacts drift. This workflow never pushes directly to main.

The schedule must live in the calling repository.

# .github/workflows/provenance-nightly.ymlname: Provenance Nightlyon:
schedule:
- cron: "0 2 * * *"workflow_dispatch:
jobs:
provenance-update:
permissions:
contents: writepull-requests: writeuses: stella/.github/.github/workflows/provenance-update.yml@<commit-sha>with:
install-command: bun install --frozen-lockfileprovenance-version: v0.1.2secrets: inherit

Inputs:

  • root — repository root to scan (default: .)
  • node-version — Node.js version used to install cdxgen (default: 22)
  • cdxgen-version — pinned @cyclonedx/cdxgen version (default: 12.1.5)
  • install-syft — install Syft before generation (default: false)
  • syft-version — pinned Syft release tag (default: v1.42.4)
  • provenance-version — GitHub release tag in stella/provenance to install (default: v0.1.2)
  • provenance-repository — provenance repository slug (default: stella/provenance)
  • install-command — optional dependency install command run before generation (default: bun install --frozen-lockfile)
  • branch — branch used for refresh PRs (default: chore/provenance-update)
  • commit-message — commit message for generated refreshes (default: chore: refresh provenance artifacts)
  • pr-title — pull request title for generated refreshes (default: chore: refresh provenance artifacts)
  • pr-body — pull request body for generated refreshes (default: Automated provenance refresh generated by the shared nightly updater.)

Optional secrets:

  • auth_token — token for updater PR creation when downstream CI should run; if omitted, the workflow falls back to github.token

AI shared updates

Consumer repositories keep .ai/shared pinned for reproducible CI, then call the shared updater on a schedule. The updater fetches the selected stella/ai-shared ref, rejects non-fast-forward changes, runs the fetched canonical sync script, and opens or updates one PR containing the submodule pointer and every generated file.

name: Update shared AI toolingon:
schedule:
- cron: "17 7 * * 1"workflow_dispatch:
permissions:
actions: writecontents: writepull-requests: writejobs:
update:
uses: stella/.github/.github/workflows/ai-shared-update.yml@<commit-sha>with:
runs-on: '["self-hosted","linux","x64"]'validation-workflow: ci.yml

runs-on accepts a JSON runner label array and defaults to ["ubuntu-latest"] when omitted. Only select self-hosted runners trusted with the workflow's declared permissions and secrets.

The caller must enable GitHub Actions to create pull requests when relying on the repository GITHUB_TOKEN. Alternatively, pass auth_token, or app_id plus app_private_key, from a dedicated bot. A PAT or App token triggers normal PR CI; the default-token path can explicitly dispatch a caller-selected workflow that supports workflow_dispatch.

The updater checks out the caller without persisted credentials and does not mint an optional App token until after the newly fetched sync script finishes. Consumer CI and local commands continue to execute only the committed submodule revision.

Changeset releases

Package repositories keep their source-path and version-synchronization rules local, then delegate enforcement and version-PR maintenance to these shared contracts. Changesets only prepares release metadata; the existing hardened release workflow remains the sole publisher.

jobs:
changeset:
if: github.event_name == 'pull_request'runs-on: ubuntu-latestpermissions:
contents: readsteps:
- uses: actions/checkout@<commit-sha>with:
fetch-depth: 0persist-credentials: false
- uses: stella/.github/.github/actions/changeset-policy@<commit-sha>with:
release-paths: | src/** crates/core/src/**generated-paths: | CHANGELOG.md VERSION Cargo.toml Cargo.lock package.json wasm/package.jsonpackage-files: | package.json# In a separate push-to-main workflow:jobs:
version:
uses: stella/.github/.github/workflows/changeset-release-pr.yml@<commit-sha>with:
prepare-rust-wasm: trueruns-on: '["self-hosted","linux","x64"]'sync-cargo-inherited-lock: truesecrets: inherit

runs-on accepts a JSON runner label array and defaults to ["ubuntu-latest"] when omitted. Only select self-hosted runners trusted with the workflow's declared permissions and secrets.

The caller must provide changeset, changeset:version, and a .changeset/config.json. The shared workflow serializes each target branch without interrupting an active release mutation, and skips write-capable steps when its trigger commit is no longer the branch head. A current no-op run closes any stale version PR and deletes its generated branch, so queued runs converge without a duplicate release PR. Callers should use matching workflow-level concurrency without cancellation; newer pushes replace obsolete pending runs while the active mutation finishes.

For hybrid repositories, changeset:version must synchronize the selected package version into every npm, Cargo manifest, Python, and central VERSION surface. With sync-cargo-inherited-lock enabled, the shared workflow validates the incoming lockfile and updates inherited local Cargo package entries inside the same Changesets transaction, before the generated PR is committed. The version command must preserve the committed Bun lockfile: deleting bun.lock/bun.lockb or running an unfrozen bun install is rejected by the shared policy.

When a version command regenerates browser Wasm artifacts, prepare-rust-wasm installs the wasm32-unknown-unknown target and the exact wasm-bindgen CLI version resolved from the caller's locked Cargo workspace. The option is disabled by default and expects the workspace at cargo-manifest to resolve exactly one wasm-bindgen runtime version with all features enabled.

Repositories whose Cargo packages use version.workspace = true can validate or repair the corresponding local Cargo.lock entries without maintaining a package allowlist:

- uses: stella/.github/.github/actions/sync-cargo-workspace-lock@<commit-sha>with:
mode: check # use write while generating synchronized release metadata

The action discovers root workspace members with locked Cargo metadata, changes only members that explicitly inherit [workspace.package].version, and leaves explicitly versioned and registry packages untouched.

Independent npm package releases

Independently versioned Changesets monorepos keep build and pack commands in their own workflow, with no write credential or OIDC permission in that job. The privileged job delegates the complete release transaction to the shared workflow:

jobs:
pack:
permissions:
contents: read# Build each public package, pack one .tgz, then upload one artifact per package.release:
needs: packpermissions:
actions: readcontents: writeid-token: writeuses: stella/.github/.github/workflows/npm-independent-release.yml@<commit-sha>with:
artifact-pattern: npm-tarball-*github-latest-package: "@scope/core"github-latest-policy: canonical-packagepackage-files: | packages/core/package.json packages/react/package.jsonsecrets:
RELEASE_APP_ID: ${{ secrets.RELEASE_APP_ID }}RELEASE_APP_PRIVATE_KEY: ${{ secrets.RELEASE_APP_PRIVATE_KEY }}

The shared job validates an exact one-to-one mapping between the declared public manifests and packed tarballs. It rejects unresolved workspace:, catalog:, link:, and file: dependency specifiers, orders internal dependencies before dependants, stages one draft release per <name>@<version>, publishes only versions missing from npm, verifies the release asset against npm dist.integrity, then makes the draft releases public. Existing complete versions are immutable no-ops. Safe partial runs resume; registry-only versions are repaired with the registry artifact and release notes that do not claim a local rebuild was the originally uploaded file. Package releases preserve the repository's existing GitHub Latest pointer by default. Repositories with one canonical package can set github-latest-policy to canonical-package and name it with github-latest-package; after the transaction is complete, that package's stable release becomes Latest regardless of dependency or publication order. Package-only repositories can instead use newest-published-stable to promote the last stable package release created from the release commit. Prereleases are never eligible. Manual recovery can pass both source-ref and artifact-run-id; the shared workflow accepts the earlier artifacts only when that run used the resolved source commit and the same caller workflow path. Pass environment when RELEASE_APP_PRIVATE_KEY is an environment secret; the release job then runs in that environment, so its deployment policy decides which refs can mint the token.

Each package must have an adjacent CHANGELOG.md section headed ## <version>. Uploaded artifacts may include checksum files, but each must contain exactly one .tgz; only that tarball becomes the corresponding GitHub release asset.

Trusted publishing is authorized against the calling repository workflow filename, not npm-independent-release.yml. Keep that local filename stable and configure the npm trusted publisher for it. Both the caller job and reusable workflow grant id-token: write; no npm token is accepted. Optional RELEASE_APP_ID and RELEASE_APP_PRIVATE_KEY secrets let protected tags and releases use a repository GitHub App token.

Callers that pack a verified commit other than the triggering github.sha (for example, a workflow_run gated on a promoted application release) pass that commit as source-ref. The shared workflow resolves the ref once after checkout and uses the resulting immutable SHA for package tag and release provenance.

Release privilege policy

Keep builds, tests, package installation, and artifact creation in caller jobs with read-only permissions. A separate workflow supplies one stable required check:

# .github/workflows/release-policy.ymlname: Release policyon:
pull_request:
paths: [.github/workflows/release.yml]push:
branches: [main]paths: [.github/workflows/release.yml]permissions:
contents: readjobs:
release-policy:
uses: stella/.github/.github/workflows/release-policy.yml@<commit-sha>

Require Release policy / Enforce release boundaries on the default branch. The policy rejects public-event release triggers, workflow-level execution controls, mutable action references, floating Node.js or Bun runtimes, inherited secrets, and repository-controlled code in an OIDC or write-capable job. Approved publishers must use the same immutable shared commit as the policy.

For tamper-resistant enforcement, configure this workflow as a ruleset workflow sourced from stella/.github; the local caller is fast feedback, not the trust anchor. The shared workflow supports pull_request and merge_group for that purpose and selects publish.yml for stella/tooling, otherwise release.yml.

PyPI trusted publishers remain bound to each caller's top-level release workflow; PyPI does not support reusable workflows for this OIDC exchange. Callers use the pinned pypi-publish-hardened prepare action, invoke the pinned PyPI Docker action directly, then use the pinned verification action. The shared guards validate the exact declared wheel set and verify published files byte for byte without nesting a Docker action inside a composite action.

crates.io and npm callers can delegate to crates-io-publish.yml, npm-artifact-publish.yml, or npm-version-finalize.yml. Their unprivileged jobs hand immutable artifacts to the shared privileged implementation; no caller source is executed after OIDC becomes available.

npm-version-finalize.yml does not mutate pull requests. Post-release changelog automation remains a separate workflow and permission boundary.

Apply Ruleset

Create or update a GitHub ruleset from a JSON file. Idempotent: looks up by name, creates if missing, updates if found.

# Basic usage (from repository root)
.github/branch-protection/apply-ruleset.sh stella/stella \
.github/branch-protection/ruleset-main.json
# With github-actions[bot] bypass (for SBOM workflow etc.)
.github/branch-protection/apply-ruleset.sh --github-actions-bypass \
stella/stella .github/branch-protection/ruleset-main.json

Composite Actions

typescript-checks

Setup pnpm, install dependencies with caching, and run lint + format + typecheck.

jobs:
ci:
runs-on: ubuntu-latestpermissions:
contents: readsteps:
- uses: actions/checkout@v4
- name: TypeScript Checksuses: stella/.github/actions/typescript-checks@main

Inputs:

  • run-lint - Run pnpm lint (default: true)
  • run-format - Run pnpm format (default: true)
  • run-typecheck - Run pnpm typecheck (default: true)
  • run-codespell - Run codespell spell checker (default: true)
  • working-directory - Working directory (default: .)
  • node-version-file - Node version file (default: .nvmrc)

notify-failure

Send failure notification to Google Chat webhook.

steps:
- name: Buildrun: ./build.sh
- name: Notify on failureif: failure()uses: stella/.github/actions/notify-failure@mainwith:
webhook-url: ${{ secrets.GOOGLE_CHAT_WEBHOOK }}message: 'Failed to build service-name in production.'

provenance-check

Install a pinned stella/provenance release binary and fail if committed provenance/ artifacts are stale.

steps:
- uses: actions/checkout@v6
- name: Provenanceuses: stella/.github/actions/provenance-check@mainwith:
provenance-version: v0.1.2

Inputs:

  • root - Repository root to scan (default: .)
  • node-version - Node.js version used to install cdxgen (default: 22)
  • cdxgen-version - Pinned @cyclonedx/cdxgen version (default: 12.1.5)
  • install-syft - Install Syft for container provenance checks (default: false)
  • syft-version - Pinned Syft release tag (default: v1.42.4)
  • provenance-version - GitHub release tag in stella/provenance to install (default: v0.1.2)
  • provenance-repository - Provenance repository slug (default: stella/provenance)
  • show-diff-on-failure - Print provenance diff output on failure (default: true)

About

Organization-wide GitHub configuration, reusable workflows, and profile assets for stella repositories

Topics

Resources

Code of conduct

Stars

1 star

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

Repository files navigation

stella/.github

Organization-wide GitHub configurations, reusable workflows, and templates.

Contents

Reusable Workflows

WorkflowDescription
pr-lint.ymlPR linting: conventional commits, labels, auto-assign
base-checks.ymlComposite workflow calling pr-lint
dependabot-bun-dedupe.ymlDedupe Bun lockfiles on trusted Dependabot pull requests
audit-branch-protection.ymlDrift detection for GitHub rulesets (compliance evidence)
ai-shared-update.ymlUpdate the pinned stella/ai-shared submodule, regenerate consumers, and open a PR
provenance-update.ymlReusable nightly/manual provenance refresh that opens a PR when provenance/ drifts
changeset-release-pr.ymlMaintain a version-only Changesets PR with an app-scoped token
npm-independent-release.ymlPublish independently versioned npm monorepos from caller-built tarballs
npm-artifact-publish.ymlPublish one pre-packed npm artifact without exposing OIDC to its build
pypi-publish-hardenedPrepare and verify an exact wheel matrix around top-level PyPI trusted publishing
crates-io-publish.ymlPackage without OIDC, then attest and publish exact crate bytes
release-policy.ymlEnforce immutable, artifact-only release privilege boundaries

Composite Actions

ActionDescription
typescript-checksSetup pnpm, install deps, run lint + format + typecheck
notify-failureSend failure notification to Google Chat webhook
provenance-checkInstall stella/provenance and verify committed provenance artifacts
changeset-policyRequire valid release intent for caller-declared package paths
npm-publish-hardenedPublish pre-packed npm tarballs through trusted publishing
sync-cargo-workspace-lockSynchronize inherited Cargo workspace versions in Cargo.lock

Templates

  • PULL_REQUEST_TEMPLATE.md - Standard PR template
  • ISSUE_TEMPLATE/ - Bug report, epic, feature request, other

Label Definitions

  • labels.yml - Standardized labels (reference for manual setup)

Usage

Dependabot Bun Dedupe

Keep the pull request trigger and the required autofix.ci workflow name in the calling repository. Install the autofix.ci GitHub App for the caller, then pin the shared workflow to a reviewed commit:

# .github/workflows/autofix.ymlname: autofix.cion:
pull_request:
types: [opened, synchronize, reopened]paths:
- bun.lockconcurrency:
group: ${{ github.workflow }}-${{ github.event.pull_request.number }}cancel-in-progress: truepermissions:
contents: readjobs:
dependabot-bun-dedupe:
uses: stella/.github/.github/workflows/dependabot-bun-dedupe.yml@<commit-sha>

The shared workflow accepts only same-repository Dependabot branches under dependabot/bun/. It runs Bun's lockfile-only dedupe and rejects changes outside bun.lock before passing the patch to autofix.ci. Callers may pass runs-on as a JSON runner-label array; it defaults to ["ubuntu-24.04"].

Base Checks (Recommended)

Use this composite workflow to run all standard checks:

# .github/workflows/ci.ymlname: CIon:
pull_request:
types: [opened, synchronize, reopened, edited]permissions: write-alljobs:
checks:
uses: stella/.github/.github/workflows/base-checks.yml@mainsecrets: inherit

PR Lint

# .github/workflows/pr-lint.ymlname: PR Linton:
pull_request:
types: [opened, synchronize, reopened, edited]branches-ignore:
- "dependabot/**"concurrency:
group: ${{ github.workflow }}-${{ github.ref }}cancel-in-progress: truepermissions: write-alljobs:
pr-lint:
uses: stella/.github/.github/workflows/pr-lint.yml@mainsecrets: inherit

Branch Protection Scripts

ScriptDescription
apply-ruleset.shIdempotent create/update of a GitHub ruleset from JSON

Audit Branch Protection

Compares live GitHub rulesets against a checked-in expected config and uploads the result as a compliance artifact (365-day retention). Detects drift and fails if the live config diverges from the expected state.

# .github/workflows/audit-branch-protection.ymlname: Audit Branch Protectionon:
schedule:
- cron: "0 8 * * 1"# Monday 08:00 UTCworkflow_dispatch:
jobs:
audit:
uses: stella/.github/.github/workflows/audit-branch-protection.yml@mainwith:
expected-config-path: .github/branch-protection/ruleset-main.jsonsecrets:
BRANCH_PROTECTION_APP_ID: ${{ secrets.BRANCH_PROTECTION_APP_ID }}BRANCH_PROTECTION_APP_KEY: ${{ secrets.BRANCH_PROTECTION_APP_KEY }}

Secrets required:

  • BRANCH_PROTECTION_APP_ID — GitHub App ID with Administration: Read and write
  • BRANCH_PROTECTION_APP_KEY — GitHub App private key (PEM)

Inputs:

  • expected-config-path — path to the expected ruleset JSON (default: .github/branch-protection/ruleset-main.json)

Provenance Update

Runs provenance generate in the calling repository and opens or updates a pull request when checked-in provenance/ artifacts drift. This workflow never pushes directly to main.

The schedule must live in the calling repository.

# .github/workflows/provenance-nightly.ymlname: Provenance Nightlyon:
schedule:
- cron: "0 2 * * *"workflow_dispatch:
jobs:
provenance-update:
permissions:
contents: writepull-requests: writeuses: stella/.github/.github/workflows/provenance-update.yml@<commit-sha>with:
install-command: bun install --frozen-lockfileprovenance-version: v0.1.2secrets: inherit

Inputs:

  • root — repository root to scan (default: .)
  • node-version — Node.js version used to install cdxgen (default: 22)
  • cdxgen-version — pinned @cyclonedx/cdxgen version (default: 12.1.5)
  • install-syft — install Syft before generation (default: false)
  • syft-version — pinned Syft release tag (default: v1.42.4)
  • provenance-version — GitHub release tag in stella/provenance to install (default: v0.1.2)
  • provenance-repository — provenance repository slug (default: stella/provenance)
  • install-command — optional dependency install command run before generation (default: bun install --frozen-lockfile)
  • branch — branch used for refresh PRs (default: chore/provenance-update)
  • commit-message — commit message for generated refreshes (default: chore: refresh provenance artifacts)
  • pr-title — pull request title for generated refreshes (default: chore: refresh provenance artifacts)
  • pr-body — pull request body for generated refreshes (default: Automated provenance refresh generated by the shared nightly updater.)

Optional secrets:

  • auth_token — token for updater PR creation when downstream CI should run; if omitted, the workflow falls back to github.token

AI shared updates

Consumer repositories keep .ai/shared pinned for reproducible CI, then call the shared updater on a schedule. The updater fetches the selected stella/ai-shared ref, rejects non-fast-forward changes, runs the fetched canonical sync script, and opens or updates one PR containing the submodule pointer and every generated file.

name: Update shared AI toolingon:
schedule:
- cron: "17 7 * * 1"workflow_dispatch:
permissions:
actions: writecontents: writepull-requests: writejobs:
update:
uses: stella/.github/.github/workflows/ai-shared-update.yml@<commit-sha>with:
runs-on: '["self-hosted","linux","x64"]'validation-workflow: ci.yml

runs-on accepts a JSON runner label array and defaults to ["ubuntu-latest"] when omitted. Only select self-hosted runners trusted with the workflow's declared permissions and secrets.

The caller must enable GitHub Actions to create pull requests when relying on the repository GITHUB_TOKEN. Alternatively, pass auth_token, or app_id plus app_private_key, from a dedicated bot. A PAT or App token triggers normal PR CI; the default-token path can explicitly dispatch a caller-selected workflow that supports workflow_dispatch.

The updater checks out the caller without persisted credentials and does not mint an optional App token until after the newly fetched sync script finishes. Consumer CI and local commands continue to execute only the committed submodule revision.

Changeset releases

Package repositories keep their source-path and version-synchronization rules local, then delegate enforcement and version-PR maintenance to these shared contracts. Changesets only prepares release metadata; the existing hardened release workflow remains the sole publisher.

jobs:
changeset:
if: github.event_name == 'pull_request'runs-on: ubuntu-latestpermissions:
contents: readsteps:
- uses: actions/checkout@<commit-sha>with:
fetch-depth: 0persist-credentials: false
- uses: stella/.github/.github/actions/changeset-policy@<commit-sha>with:
release-paths: | src/** crates/core/src/**generated-paths: | CHANGELOG.md VERSION Cargo.toml Cargo.lock package.json wasm/package.jsonpackage-files: | package.json# In a separate push-to-main workflow:jobs:
version:
uses: stella/.github/.github/workflows/changeset-release-pr.yml@<commit-sha>with:
prepare-rust-wasm: trueruns-on: '["self-hosted","linux","x64"]'sync-cargo-inherited-lock: truesecrets: inherit

runs-on accepts a JSON runner label array and defaults to ["ubuntu-latest"] when omitted. Only select self-hosted runners trusted with the workflow's declared permissions and secrets.

The caller must provide changeset, changeset:version, and a .changeset/config.json. The shared workflow serializes each target branch without interrupting an active release mutation, and skips write-capable steps when its trigger commit is no longer the branch head. A current no-op run closes any stale version PR and deletes its generated branch, so queued runs converge without a duplicate release PR. Callers should use matching workflow-level concurrency without cancellation; newer pushes replace obsolete pending runs while the active mutation finishes.

For hybrid repositories, changeset:version must synchronize the selected package version into every npm, Cargo manifest, Python, and central VERSION surface. With sync-cargo-inherited-lock enabled, the shared workflow validates the incoming lockfile and updates inherited local Cargo package entries inside the same Changesets transaction, before the generated PR is committed. The version command must preserve the committed Bun lockfile: deleting bun.lock/bun.lockb or running an unfrozen bun install is rejected by the shared policy.

When a version command regenerates browser Wasm artifacts, prepare-rust-wasm installs the wasm32-unknown-unknown target and the exact wasm-bindgen CLI version resolved from the caller's locked Cargo workspace. The option is disabled by default and expects the workspace at cargo-manifest to resolve exactly one wasm-bindgen runtime version with all features enabled.

Repositories whose Cargo packages use version.workspace = true can validate or repair the corresponding local Cargo.lock entries without maintaining a package allowlist:

- uses: stella/.github/.github/actions/sync-cargo-workspace-lock@<commit-sha>with:
mode: check # use write while generating synchronized release metadata

The action discovers root workspace members with locked Cargo metadata, changes only members that explicitly inherit [workspace.package].version, and leaves explicitly versioned and registry packages untouched.

Independent npm package releases

Independently versioned Changesets monorepos keep build and pack commands in their own workflow, with no write credential or OIDC permission in that job. The privileged job delegates the complete release transaction to the shared workflow:

jobs:
pack:
permissions:
contents: read# Build each public package, pack one .tgz, then upload one artifact per package.release:
needs: packpermissions:
actions: readcontents: writeid-token: writeuses: stella/.github/.github/workflows/npm-independent-release.yml@<commit-sha>with:
artifact-pattern: npm-tarball-*github-latest-package: "@scope/core"github-latest-policy: canonical-packagepackage-files: | packages/core/package.json packages/react/package.jsonsecrets:
RELEASE_APP_ID: ${{ secrets.RELEASE_APP_ID }}RELEASE_APP_PRIVATE_KEY: ${{ secrets.RELEASE_APP_PRIVATE_KEY }}

The shared job validates an exact one-to-one mapping between the declared public manifests and packed tarballs. It rejects unresolved workspace:, catalog:, link:, and file: dependency specifiers, orders internal dependencies before dependants, stages one draft release per <name>@<version>, publishes only versions missing from npm, verifies the release asset against npm dist.integrity, then makes the draft releases public. Existing complete versions are immutable no-ops. Safe partial runs resume; registry-only versions are repaired with the registry artifact and release notes that do not claim a local rebuild was the originally uploaded file. Package releases preserve the repository's existing GitHub Latest pointer by default. Repositories with one canonical package can set github-latest-policy to canonical-package and name it with github-latest-package; after the transaction is complete, that package's stable release becomes Latest regardless of dependency or publication order. Package-only repositories can instead use newest-published-stable to promote the last stable package release created from the release commit. Prereleases are never eligible. Manual recovery can pass both source-ref and artifact-run-id; the shared workflow accepts the earlier artifacts only when that run used the resolved source commit and the same caller workflow path. Pass environment when RELEASE_APP_PRIVATE_KEY is an environment secret; the release job then runs in that environment, so its deployment policy decides which refs can mint the token.

Each package must have an adjacent CHANGELOG.md section headed ## <version>. Uploaded artifacts may include checksum files, but each must contain exactly one .tgz; only that tarball becomes the corresponding GitHub release asset.

Trusted publishing is authorized against the calling repository workflow filename, not npm-independent-release.yml. Keep that local filename stable and configure the npm trusted publisher for it. Both the caller job and reusable workflow grant id-token: write; no npm token is accepted. Optional RELEASE_APP_ID and RELEASE_APP_PRIVATE_KEY secrets let protected tags and releases use a repository GitHub App token.

Callers that pack a verified commit other than the triggering github.sha (for example, a workflow_run gated on a promoted application release) pass that commit as source-ref. The shared workflow resolves the ref once after checkout and uses the resulting immutable SHA for package tag and release provenance.

Release privilege policy

Keep builds, tests, package installation, and artifact creation in caller jobs with read-only permissions. A separate workflow supplies one stable required check:

# .github/workflows/release-policy.ymlname: Release policyon:
pull_request:
paths: [.github/workflows/release.yml]push:
branches: [main]paths: [.github/workflows/release.yml]permissions:
contents: readjobs:
release-policy:
uses: stella/.github/.github/workflows/release-policy.yml@<commit-sha>

Require Release policy / Enforce release boundaries on the default branch. The policy rejects public-event release triggers, workflow-level execution controls, mutable action references, floating Node.js or Bun runtimes, inherited secrets, and repository-controlled code in an OIDC or write-capable job. Approved publishers must use the same immutable shared commit as the policy.

For tamper-resistant enforcement, configure this workflow as a ruleset workflow sourced from stella/.github; the local caller is fast feedback, not the trust anchor. The shared workflow supports pull_request and merge_group for that purpose and selects publish.yml for stella/tooling, otherwise release.yml.

PyPI trusted publishers remain bound to each caller's top-level release workflow; PyPI does not support reusable workflows for this OIDC exchange. Callers use the pinned pypi-publish-hardened prepare action, invoke the pinned PyPI Docker action directly, then use the pinned verification action. The shared guards validate the exact declared wheel set and verify published files byte for byte without nesting a Docker action inside a composite action.

crates.io and npm callers can delegate to crates-io-publish.yml, npm-artifact-publish.yml, or npm-version-finalize.yml. Their unprivileged jobs hand immutable artifacts to the shared privileged implementation; no caller source is executed after OIDC becomes available.

npm-version-finalize.yml does not mutate pull requests. Post-release changelog automation remains a separate workflow and permission boundary.

Apply Ruleset

Create or update a GitHub ruleset from a JSON file. Idempotent: looks up by name, creates if missing, updates if found.

# Basic usage (from repository root)
.github/branch-protection/apply-ruleset.sh stella/stella \
.github/branch-protection/ruleset-main.json
# With github-actions[bot] bypass (for SBOM workflow etc.)
.github/branch-protection/apply-ruleset.sh --github-actions-bypass \
stella/stella .github/branch-protection/ruleset-main.json

Composite Actions

typescript-checks

Setup pnpm, install dependencies with caching, and run lint + format + typecheck.

jobs:
ci:
runs-on: ubuntu-latestpermissions:
contents: readsteps:
- uses: actions/checkout@v4
- name: TypeScript Checksuses: stella/.github/actions/typescript-checks@main

Inputs:

  • run-lint - Run pnpm lint (default: true)
  • run-format - Run pnpm format (default: true)
  • run-typecheck - Run pnpm typecheck (default: true)
  • run-codespell - Run codespell spell checker (default: true)
  • working-directory - Working directory (default: .)
  • node-version-file - Node version file (default: .nvmrc)

notify-failure

Send failure notification to Google Chat webhook.

steps:
- name: Buildrun: ./build.sh
- name: Notify on failureif: failure()uses: stella/.github/actions/notify-failure@mainwith:
webhook-url: ${{ secrets.GOOGLE_CHAT_WEBHOOK }}message: 'Failed to build service-name in production.'

provenance-check

Install a pinned stella/provenance release binary and fail if committed provenance/ artifacts are stale.

steps:
- uses: actions/checkout@v6
- name: Provenanceuses: stella/.github/actions/provenance-check@mainwith:
provenance-version: v0.1.2

Inputs:

  • root - Repository root to scan (default: .)
  • node-version - Node.js version used to install cdxgen (default: 22)
  • cdxgen-version - Pinned @cyclonedx/cdxgen version (default: 12.1.5)
  • install-syft - Install Syft for container provenance checks (default: false)
  • syft-version - Pinned Syft release tag (default: v1.42.4)
  • provenance-version - GitHub release tag in stella/provenance to install (default: v0.1.2)
  • provenance-repository - Provenance repository slug (default: stella/provenance)
  • show-diff-on-failure - Print provenance diff output on failure (default: true)

About

Organization-wide GitHub configuration, reusable workflows, and profile assets for stella repositories

Topics

Resources

Code of conduct

Stars

1 star

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages