diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS deleted file mode 100644 index 96f0c7a7d6e..00000000000 --- a/.github/CODEOWNERS +++ /dev/null @@ -1,3 +0,0 @@ -/scripts/check-pr-captures.mjs @miguel-heygen -/scripts/check-pr-captures.test.mjs @miguel-heygen -/.github/workflows/pr-captures.yml @miguel-heygen diff --git a/.github/codeql/codeql-config.yml b/.github/codeql/codeql-config.yml deleted file mode 100644 index a1fccea5458..00000000000 --- a/.github/codeql/codeql-config.yml +++ /dev/null @@ -1,64 +0,0 @@ -name: "Hyperframes CodeQL config" - -# Use GitHub's default security-extended suite — it's a strict superset of the -# default suite (more queries, slightly higher false-positive rate). Pair it with -# the query-filters below so the extra queries don't drown the dashboard. -queries: - - uses: security-extended - -# Per-rule path filters. The intent is to silence rules that have known false -# positives on specific file shapes (generated test artifacts, CDN-script test -# fixtures, functional-cleanup regex) WITHOUT excluding those paths from all -# analysis — a malicious contributor adding e.g. a command-injection sink into -# a "test fixture" would still get caught. -# -# To audit what changed: look at PR diffs touching this file. Reviewers should -# treat it like CODEOWNERS — adding a new path exclusion is a policy change. -query-filters: - # Generated test artifacts (golden baselines written by the producer test - # harness). Every compiled.html re-rasterizes the regex-stripped composition; - # the same alerts fire on every fixture and on every re-render. - - exclude: - id: js/incomplete-sanitization - paths: - - "packages/producer/tests/**/output/compiled.html" - - "packages/producer/tests/**/failures/*.html" - - # Test fixtures and skill test corpora intentionally load CDN scripts without - # SRI — pinning hashes there would fight the test's purpose (we want the test - # to use whatever the registry hands back, the same way a composition would). - - exclude: - id: js/functionality-from-untrusted-source - paths: - - "packages/producer/tests/**" - - "skills/**/test-corpus/**" - - "skills/**/assets/test-corpus/**" - - # The hand-rolled HTML cleanup regex in our build-time tooling looks like a - # sanitizer to CodeQL but isn't one — it strips framework bootstraps from - # captured pages before they're fed back into our own renderer (Puppeteer, - # not a user-facing DOM). Same for the text normalizer in the whisper path - # (caption text → SRT/VTT, no DOM emission). Scope these exclusions to the - # exact files that contain functional regex, not to whole directories, so - # any new code in cli/, core/, or producer/ that LOOKS like a sanitizer - # still trips the rules. - - exclude: - id: js/bad-tag-filter - paths: - - "packages/cli/src/capture/index.ts" - - "packages/cli/src/whisper/normalize.ts" - - "packages/core/src/lint/utils.ts" - - "packages/producer/src/services/htmlCompiler.ts" - - exclude: - id: js/incomplete-multi-character-sanitization - paths: - - "packages/cli/src/capture/index.ts" - - "packages/cli/src/whisper/normalize.ts" - - # Golden baselines inline vendor libraries (Three.js, GSAP) whose bundled - # Math.random() calls trip insecure-randomness. These are test artifacts - # from compiled compositions, not production code paths. - - exclude: - id: js/insecure-randomness - paths: - - "packages/producer/tests/**/output/compiled.html" diff --git a/.github/renovate.json b/.github/renovate.json deleted file mode 100644 index 820d0e57fc9..00000000000 --- a/.github/renovate.json +++ /dev/null @@ -1,46 +0,0 @@ -{ - "$schema": "https://docs.renovatebot.com/renovate-schema.json", - "extends": ["config:recommended", ":semanticCommits", ":dependencyDashboard"], - "schedule": ["before 6am on monday"], - "timezone": "America/Los_Angeles", - "prConcurrentLimit": 5, - "prHourlyLimit": 2, - "rangeStrategy": "bump", - "lockFileMaintenance": { - "enabled": true, - "schedule": ["before 6am on monday"] - }, - "vulnerabilityAlerts": { - "enabled": true, - "labels": ["security"] - }, - "packageRules": [ - { - "matchDepTypes": ["engines", "peerDependencies"], - "rangeStrategy": "widen" - }, - { - "matchUpdateTypes": ["minor", "patch"], - "matchDepTypes": ["devDependencies"], - "groupName": "dev dependencies (non-major)" - }, - { - "matchUpdateTypes": ["patch"], - "matchDepTypes": ["dependencies"], - "groupName": "prod patch updates" - }, - { - "matchUpdateTypes": ["major"], - "dependencyDashboardApproval": true - }, - { - "matchManagers": ["github-actions"], - "groupName": "github-actions", - "pinDigests": true - }, - { - "enabled": false, - "matchPackageNames": ["/^@hyperframes//"] - } - ] -} diff --git a/.github/workflows/canary-sunset.yml b/.github/workflows/canary-sunset.yml deleted file mode 100644 index 9fbca635668..00000000000 --- a/.github/workflows/canary-sunset.yml +++ /dev/null @@ -1,32 +0,0 @@ -# Canary sunset governance. -# -# Deliberately NOT a PR gate. The check reads the current date, so as a PR gate -# it would fail builds for authors who touched nothing related, on a calendar -# date, with no fix available to them. On a schedule the failure stands on its -# own instead of blocking an unrelated author. -# -# The job names the overdue canary and its owner in the run log; it does not -# notify anyone. Routing that to the owner automatically (an issue, a ping) -# is worth doing and is not done here. -name: Canary sunset - -permissions: - contents: read - -on: - schedule: - # Mondays at 15:10 UTC, shortly after the CodeQL run. - - cron: "10 15 * * 1" - workflow_dispatch: - -jobs: - sunset: - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@11d5960a326750d5838078e36cf38b85af677262 # v4 - - uses: oven-sh/setup-bun@0c5077e51419868618aeaa5fe8019c62421857d6 # v2 - with: - bun-version: latest - # No install/build: the script imports the registry source directly and - # bun runs TypeScript natively. - - run: bun scripts/check-canary-sunset.ts diff --git a/.github/workflows/catalog-previews.yml b/.github/workflows/catalog-previews.yml deleted file mode 100644 index 5eec5076482..00000000000 --- a/.github/workflows/catalog-previews.yml +++ /dev/null @@ -1,129 +0,0 @@ -name: Catalog Previews - -permissions: - contents: read - -# Suppress hyperframes CLI telemetry from HeyGen's own CI runs. -# External users' CI continues to emit telemetry unless they set this themselves. -env: - HYPERFRAMES_NO_TELEMETRY: "1" - -on: - pull_request: - branches: [main] - paths: - - "registry/blocks/**" - - "registry/components/**" - - "scripts/generate-catalog-previews.ts" - # Modules the renderer imports. Without them a change to path-traversal - # defence or temp-directory allocation alone never re-runs the job that - # exercises it. - - "scripts/registry-target-paths.mjs" - - "scripts/catalog-preview-temp.ts" - - ".github/workflows/catalog-previews.yml" - -concurrency: - group: catalog-previews-${{ github.ref }} - cancel-in-progress: true - -jobs: - preflight: - name: Preflight (lint + format) - runs-on: ubuntu-latest - timeout-minutes: 5 - steps: - - uses: actions/checkout@11d5960a326750d5838078e36cf38b85af677262 # v4 - - uses: ./.github/actions/preflight - - render-previews: - name: Render catalog previews - needs: preflight - runs-on: ubuntu-latest - timeout-minutes: 30 - steps: - - uses: actions/checkout@11d5960a326750d5838078e36cf38b85af677262 # v4 - with: - fetch-depth: 0 - - - uses: oven-sh/setup-bun@0c5077e51419868618aeaa5fe8019c62421857d6 # v2 - - - uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4 - with: - node-version: 22 - - - run: bun install --frozen-lockfile - - - run: bun run build - - # Chrome headless shell for rendering - - uses: browser-actions/setup-chrome@c785b87e244131f27c9f19c1a33e2ead956ab7ce # v1 - with: - chrome-version: stable - - # The renderer shells out to ffmpeg for both halves of a preview: the - # poster transcode and the web encode of the mp4. Neither ran here before - # (`--skip-video` skipped the encode, and the poster copy was a plain - # file copy), so the job never needed it and ubuntu-latest does not ship - # it. - - name: Install ffmpeg - uses: ./.github/actions/install-ffmpeg-linux - - - name: Render changed block/component previews - run: | - # HEAD is the PR merge ref; its first parent is the current base tip, - # unlike the event payload's base.sha, which can go stale. - BASE_SHA="$(git rev-parse HEAD^1)" - - # Find which blocks/components changed in this PR. The trailing slash - # in the grep matters: an item is a directory, and a file sitting - # directly under registry/components (CATALOG.md) does not match the - # sed, so without it the whole path survives and is passed to the - # renderer as if it were an item name. - CHANGED_ITEMS=$(git diff --name-only --diff-filter=ACMR "$BASE_SHA"...HEAD -- registry/blocks/ registry/components/ \ - | grep -E '^registry/(blocks|components)/[^/]+/' \ - | sed 's|^registry/[^/]*/\([^/]*\)/.*|\1|' \ - | sort -u) - - # A renderer change reaches every item, so it cannot be trusted to a - # PR that happens to also touch a block. Two canaries cover the two - # shapes the renderer has to tell apart: a block whose scene lives in - # a